Auswählen von Zeilen für die Migration mit einer Filterfunktion (Stretch Database)

Gilt für: SQL Server 2016 (13.x) und höher – nur Windows

Wichtig

Stretch Database ist in SQL Server 2022 (16.x) und der Azure SQL-Datenbank veraltet. Diese Funktion wird in einer zukünftigen Version der Datenbank-Engine entfernt. Nutzen Sie diese Funktionen bei Neuentwicklungen nicht mehr, und planen Sie die Änderung von Anwendungen, die diese Funktion zurzeit verwenden.

Wenn Sie inaktive Daten in einer separaten Tabelle speichern, können Sie Stretch Database so konfigurieren, dass die gesamte Tabelle migriert wird. Wenn Ihre Tabelle sowohl heiße als auch kalte Daten enthält, können Sie ein Filterprädikat zum Auswählen der zu migrierenden Zeilen angeben. Das Filterprädikat ist eine Inline-Tabellenwertfunktion. Dieser Artikel beschreibt, wie Sie eine Inline-Tabellenwertfunktion schreiben, um die zu migrierenden Zeilen auszuwählen.

Wichtig

Wenn Sie eine schwache Filterfunktion angeben, wird die Datenmigration ebenfalls unzureichend ausgeführt. Stretch Database wendet die Filterfunktion mithilfe des CROSS APPLY-Operators auf die Tabelle an.

Wenn Sie keine Filterfunktion angeben, wird die gesamte Tabelle migriert.

Wenn Sie den Assistenten zum Aktivieren von Stretch für eine Datenbank ausführen, können Sie eine gesamte Tabelle migrieren oder eine Filterfunktion im Assistenten angeben. Wenn Sie zum Auswählen zu migrierender Zeilen eine andere Art von Filterfunktion verwenden möchten, führen Sie einen der folgenden Schritte aus.

  • Beenden Sie den Assistenten, und führen Sie die ALTER TABLE-Anweisung aus, um Stretch für die Tabelle zu aktivieren und eine Filterfunktion anzugeben.

  • Führen Sie die ALTER TABLE-Anweisung aus, um eine Filterfunktion anzugeben, nachdem Sie den Assistenten beendet haben.

Die ALTER TABLE-Syntax zum Hinzufügen einer Funktion wird weiter unten in diesem Artikel beschrieben.

Grundlegende Anforderungen für die Filterfunktion

Die für ein Stretch Database-Filterprädikat erforderliche Inline-Tabellenwertfunktion sieht wie das folgende Beispiel aus.

CREATE FUNCTION dbo.fn_stretchpredicate (
    @column1 datatype1,
    @column2 datatype2 /*[, ...n]*/
    )
RETURNS TABLE WITH SCHEMABINDING
AS
RETURN

SELECT 1 AS is_eligible
WHERE someCol = @column1 /* replace with an actual predicate */

Die Parameter für die Funktion müssen Bezeichner für Spalten der Tabelle sein.

Die Schemabindung ist erforderlich, um zu verhindern, dass Spalten, die von der Filterfunktion verwendet werden, gelöscht oder geändert werden.

Rückgabewert

Wenn die Funktion ein nicht leeres Ergebnis zurückgibt, ist die Zeile für die Migration geeignet. Wenn die Funktion hingegen kein Ergebnis zurückgibt, ist die Zeile nicht für die Migration geeignet.

Bedingungen

Das <Prädikat> kann aus einer oder mehreren Bedingungen bestehen, die mit dem logischen AND-Operator verknüpft sind.

<predicate> ::= <condition> [ AND <condition> ] [ ...n ]

Jede Bedingung kann wiederum aus einer oder mehreren primitiven Bedingungen bestehen, die mit dem logischen OR-Operator verknüpft sind.

<condition> ::= <primitive_condition> [ OR <primitive_condition> ] [ ...n ]

Primitive Bedingungen

Eine primitive Bedingung eignet sich für die folgenden Vergleiche.

<primitive_condition> ::=
{
<function_parameter> <comparison_operator> constant
| <function_parameter> { IS NULL | IS NOT NULL }
| <function_parameter> IN ( constant [ ,...n ] )
}
  • Vergleichen eines Funktionsparameters mit einem konstanten Ausdruck. Beispiel: @column1 < 1000.

    Im folgenden Beispiel wird überprüft, ob der Wert einer Datumsspalte kleiner als der 1. Januar 2016 ist.

    CREATE FUNCTION dbo.fn_stretchpredicate (@column1 DATETIME)
    RETURNS TABLE WITH SCHEMABINDING
    AS
    RETURN
    
    SELECT 1 AS is_eligible
    WHERE @column1 < CONVERT(DATETIME, '1/1/2016', 101)
    GO
    
    ALTER TABLE stretch_table_name SET (
        REMOTE_DATA_ARCHIVE = ON (
            FILTER_PREDICATE = dbo.fn_stretchpredicate(DATE),
            MIGRATION_STATE = OUTBOUND
    ));
    
  • Anwenden des Operators IS NULL oder IS NOT NULL auf einen Funktionsparameter.

  • Verwenden des IN-Operators, um einen Funktionsparameter mit einer Liste konstanter Werte zu vergleichen.

    Im folgenden Beispiel wird überprüft, ob der Wert einer shipment_status-Spalte IN (N'Completed', N'Returned', N'Cancelled') ist.

    CREATE FUNCTION dbo.fn_stretchpredicate (@column1 NVARCHAR(15))
    RETURNS TABLE WITH SCHEMABINDING
    AS
    RETURN
    
    SELECT 1 AS is_eligible
    WHERE @column1 IN (
        N'Completed',
        N'Returned',
        N'Cancelled'
    )
    GO
    
    ALTER TABLE table1 SET (
        REMOTE_DATA_ARCHIVE = ON (
      	  FILTER_PREDICATE = dbo.fn_stretchpredicate(shipment_status),
      	  MIGRATION_STATE = OUTBOUND
    ));
    

Vergleichsoperatoren

Die folgenden Vergleichsoperatoren werden unterstützt.

<, <=, >, >=, =, <>, !=, !<, !>

<comparison_operator> ::= { < | <= | > | >= | = | <> | != | !< | !> }

Konstante Ausdrücke

Bei den Konstanten, die Sie in einer Filterfunktion verwenden, kann es sich um einen beliebigen deterministischen Ausdruck handeln, der beim Definieren der Funktion ausgewertet werden kann. Konstante Ausdrücke können Folgendes enthalten.

  • Literale. Beispiel: N'abc', 123.

  • Algebraische Ausdrücke. Beispiel: 123 + 456.

  • Deterministische Funktionen. Beispiel: SQRT(900).

  • Deterministische Konvertierungen, die CAST oder CONVERT verwenden. Beispiel: CONVERT(datetime, '1/1/2016', 101).

Andere Ausdrücke

Sie können die Operatoren BETWEEN und NOT BETWEEN verwenden, wenn die resultierende Funktion den hier beschriebenen Regeln entspricht, nachdem Sie die Operatoren BETWEEN und NOT BETWEEN durch die entsprechenden AND- und OR-Ausdrücke ersetzt haben.

Sie können keine Unterabfragen oder nicht deterministische Funktionen wie RAND() oder GETDATE() verwenden.

Hinzufügen einer Filterfunktion zu einer Tabelle

Fügen Sie einer Tabelle eine Filterfunktion hinzu, indem Sie die ALTER TABLE -Anweisung ausführen und eine vorhandene Inline-Tabellenwertfunktion als Wert des Parameters FILTER_PREDICATE angeben. Beispiel:

ALTER TABLE stretch_table_name SET (
	REMOTE_DATA_ARCHIVE = ON (
		FILTER_PREDICATE = dbo.fn_stretchpredicate(column1, column2),
		MIGRATION_STATE = OUTBOUND /* replace OUTBOUND in this example, with the actual, desired migration state */
));

Nachdem Sie die Funktion als Prädikat an die Tabelle gebunden haben, gilt Folgendes:

  • Bei der nächsten Datenmigration werden nur die Zeilen migriert, für die die Funktion einen nicht leeren Wert zurückgibt.

  • Die von der Funktion verwendeten Spalten sind schemagebunden. Sie können diese Spalten nicht ändern, solange eine Tabelle die Funktion als ihr Filterprädikat nutzt.

Sie können die Inline-Tabellenwertfunktion nicht löschen, solange eine Tabelle die Funktion als ihr Filterprädikat nutzt.

Erstellen Sie einen Index für die Spalten, die von der Funktion verwendet werden, um die Leistung der Filterfunktion zu verbessern.

Übergeben von Spaltennamen an die Filterfunktion

Wenn Sie einer Tabelle eine Filterfunktion zuweisen, geben Sie die an die Filterfunktion übergebenen Spaltennamen mit einem einteiligen Namen an. Wenn Sie beim Übergeben der Spaltennamen einen dreiteiligen Namen angeben, treten bei nachfolgenden Abfragen der Stretch-aktivierten Tabelle Fehler auf.

Wenn Sie z.B. einen dreiteiligen Spaltennamen angeben, wie im folgenden Beispiel dargestellt, wird die Anweisung erfolgreich ausgeführt, bei nachfolgenden Abfragen der Tabelle treten jedoch Fehler auf.

ALTER TABLE SensorTelemetry SET (
	REMOTE_DATA_ARCHIVE = ON (
		FILTER_PREDICATE = dbo.fn_stretchpredicate(dbo.SensorTelemetry.ScanDate),
		MIGRATION_STATE = OUTBOUND
));

Geben Sie die Filterfunktion stattdessen mit einem einteiligen Namen an, wie im folgenden Beispiel dargestellt.

ALTER TABLE SensorTelemetry SET (
	REMOTE_DATA_ARCHIVE = ON (
		FILTER_PREDICATE=dbo.fn_stretchpredicate(ScanDate),
		MIGRATION_STATE = OUTBOUND
));

Hinzufügen einer Filterfunktion nach Ausführen des Assistenten

Wenn Sie eine Funktion verwenden möchten, die Sie im Assistenten zum Aktivieren von Stretch für eine Datenbank nicht erstellen können, können Sie die ALTER TABLE -Anweisung ausführen, um nach Beenden des Assistenten eine Funktion anzugeben. Bevor eine Funktion angewendet werden kann, müssen Sie jedoch die Datenmigration anhalten, die bereits in Bearbeitung ist, und migrierte Daten zurückbringen. (Weitere Informationen dazu, warum dies notwendig ist, finden Sie im Abschnitt Ersetzen einer vorhandenen Filterfunktion).

  1. Kehren Sie die Migrationsrichtung um, und bringen Sie bereits migrierte Daten zurück. Dieser Vorgang kann nach dem Start nicht mehr abgebrochen werden. Es fallen auf Azure auch Kosten für ausgehende Datenübertragungen an. Weitere Informationen finden Sie unter Datenübertragungen – Preisdetails.

    ALTER TABLE [<table name>] SET (
        REMOTE_DATA_ARCHIVE (
            MIGRATION_STATE = INBOUND
    ));
    
  2. Warten Sie, bis die Migration abgeschlossen ist. Sie können den Status in SQL Server Management Studio im Stretch Database-Monitor überprüfen oder die Sicht sys.dm_db_rda_migration_status abfragen. Weitere Informationen finden Sie unter Monitor and troubleshoot data migration (Überwachung und Problembehandlung für die Datenmigration) oder sys.dm_db_rda_migration_status.

  3. Erstellen Sie die Filterfunktion, die auf die Tabelle angewendet werden soll.

  4. Fügen Sie die Funktion der Tabelle hinzu, und starten Sie die Datenmigration zu Azure neu.

    ALTER TABLE [<table name>] SET (
        REMOTE_DATA_ARCHIVE (
            FILTER_PREDICATE = dbo.predicateFunction(col1),
            /* replace predicateFunction and col1 with the actual function call */
            MIGRATION_STATE = OUTBOUND
    ));
    

Filtern von Zeilen nach Datum

Im folgenden Beispiel werden Zeilen migriert, in denen die Spalte date einen Wert vor dem 1. Januar 2016 enthält.

-- Filter by date
--
CREATE FUNCTION dbo.fn_stretch_by_date (@date DATETIME2)
RETURNS TABLE WITH SCHEMABINDING
AS
RETURN

SELECT 1 AS is_eligible
WHERE @date < CONVERT(DATETIME2, '1/1/2016', 101)
GO

Filtern von Zeilen nach dem Wert in einer Statusspalte

Im folgenden Beispiel werden Zeilen migriert, in denen die Spalte status einen der angegebenen Werte enthält.

-- Filter by status column
--
CREATE FUNCTION dbo.fn_stretch_by_status (@status NVARCHAR(128))
RETURNS TABLE WITH SCHEMABINDING
AS
RETURN

SELECT 1 AS is_eligible
WHERE @status IN (
	N'Completed',
	N'Returned',
	N'Cancelled'
)
GO

Filtern von Zeilen mithilfe eines gleitenden Fensters

Um Zeilen mithilfe eines gleitenden Fensters zu filtern, beachten Sie die folgenden Anforderungen für die Filterfunktion.

  • Die Funktion muss deterministisch sein. Sie können daher keine Funktion erstellen, die das gleitende Fenster im Ablauf der Zeit neu berechnet.

  • Die Funktion verwendet die Schemabindung. Daher können Sie die Funktion nicht einfach täglich „direkt“ aktualisieren, indem Sie ALTER FUNCTION aufrufen, um das gleitende Fenster zu bewegen.

Beginnen Sie mit einer Filterfunktion wie im folgenden Beispiel, bei dem Zeilen migriert werden, in denen die Spalte systemEndTime einen Wert vor dem 1. Januar 2016 enthält.

CREATE FUNCTION dbo.fn_StretchBySystemEndTime20160101 (@systemEndTime DATETIME2)
RETURNS TABLE WITH SCHEMABINDING
AS
RETURN

SELECT 1 AS is_eligible
WHERE @systemEndTime < CONVERT(DATETIME2, '2016-01-01T00:00:00', 101);

Wenden Sie die Filterfunktion auf die Tabelle an.

ALTER TABLE [<table name>] SET (
	REMOTE_DATA_ARCHIVE = ON (
		FILTER_PREDICATE = dbo.fn_StretchBySystemEndTime20160101(ValidTo),
		MIGRATION_STATE = OUTBOUND
));

Wenn Sie das gleitende Fenster aktualisieren möchten, gehen Sie folgendermaßen vor.

  1. Erstellen Sie eine neue Funktion, die das neue gleitende Fenster angibt. Das folgende Beispiel wählt Datumsangaben vor dem 2. Januar 2016 statt vor dem 1. Januar 2016 aus.

  2. Ersetzen Sie die vorherige Filterfunktion durch die neue, indem Sie ALTER TABLEaufrufen, wie im folgenden Beispiel dargestellt.

  3. Löschen Sie optional die vorherige Filterfunktion, die Sie nicht mehr verwenden, indem Sie DROP FUNCTIONaufrufen. (Dieser Schritt ist im Beispiel nicht dargestellt.)

BEGIN TRANSACTION
GO

/*(1) Create new predicate function definition */
CREATE FUNCTION dbo.fn_StretchBySystemEndTime20160102 (@systemEndTime DATETIME2)
RETURNS TABLE
    WITH SCHEMABINDING
AS
RETURN

SELECT 1 AS is_eligible
WHERE @systemEndTime < CONVERT(DATETIME2, '2016-01-02T00:00:00', 101)
GO

/*(2) Set the new function as the filter predicate */
ALTER TABLE [<table name>] SET (
	REMOTE_DATA_ARCHIVE = ON (
		FILTER_PREDICATE = dbo.fn_StretchBySystemEndTime20160102(ValidTo),
		MIGRATION_STATE = OUTBOUND
));

COMMIT;

Weitere Beispiele gültiger Filterfunktionen

  • Das folgende Beispiel kombiniert die beiden primitiven Bedingungen mithilfe des logischen Operators AND.

    CREATE FUNCTION dbo.fn_stretchpredicate (
        @column1 DATETIME,
        @column2 NVARCHAR(15)
    )
    RETURNS TABLE
        WITH SCHEMABINDING
    AS
    RETURN
    
    SELECT 1 AS is_eligible
    WHERE @column1 < N'20150101'
        AND @column2 IN (
            N'Completed',
            N'Returned',
            N'Cancelled'
        );
    GO
    
    ALTER TABLE table1 SET (
        REMOTE_DATA_ARCHIVE = ON (
      	  FILTER_PREDICATE = dbo.fn_stretchpredicate(DATE, shipment_status),
      	  MIGRATION_STATE = OUTBOUND
    ));
    GO
    
  • Im folgenden Beispiel werden verschiedene Bedingungen und eine deterministische Konvertierung mit CONVERT verwendet.

    CREATE FUNCTION dbo.fn_stretchpredicate_example1 (
        @column1 DATETIME,
        @column2 INT,
        @column3 NVARCHAR
    )
    RETURNS TABLE
        WITH SCHEMABINDING
    AS
    RETURN
    
    SELECT 1 AS is_eligible
    WHERE @column1 < CONVERT(DATETIME, '1/1/2015', 101)
        AND (
            @column2 < - 100
            OR @column2 > 100
            OR @column2 IS NULL
        )
        AND @column3 IN (
            N'Completed',
            N'Returned',
            N'Cancelled'
        );
    GO
    
  • Im folgenden Beispiel werden die mathematische Operatoren und Funktionen verwendet.

    CREATE FUNCTION dbo.fn_stretchpredicate_example2 (@column1 FLOAT)
    RETURNS TABLE
    WITH SCHEMABINDING
    AS
    RETURN SELECT 1 AS is_eligible
           WHERE @column1 < SQRT(400) + 10;
    GO
    
  • Im folgenden Beispiel werden die Operatoren BETWEEN und NOT BETWEEN verwendet. Diese Verwendung ist möglich, da die resultierende Funktion den hier beschriebenen Regeln entspricht, nachdem Sie die Operatoren BETWEEN und NOT BETWEEN durch die entsprechenden AND- und OR-Ausdrücke ersetzt haben.

    CREATE FUNCTION dbo.fn_stretchpredicate_example3 (
        @column1 INT,
        @column2 INT
    )
    RETURNS TABLE
        WITH SCHEMABINDING
    AS
    RETURN
    
    SELECT 1 AS is_eligible
    WHERE @column1 BETWEEN 0 AND 100
        AND (
            @column2 NOT BETWEEN 200 AND 300
            OR @column1 = 50
        );
    GO
    

    Die vorhergehende Funktion entspricht der folgenden Funktion nach dem Ersetzen der Operatoren BETWEEN und NOT BETWEEN durch die entsprechenden AND- und OR-Ausdrücke.

    CREATE FUNCTION dbo.fn_stretchpredicate_example4 (
        @column1 INT,
        @column2 INT
    )
    RETURNS TABLE
        WITH SCHEMABINDING
    AS
    RETURN
    
    SELECT 1 AS is_eligible
    WHERE @column1 >= 0
        AND @column1 <= 100
        AND (
            @column2 < 200
            OR @column2 > 300
            OR @column1 = 50
        );
    GO
    

Beispiele ungültiger Filterfunktionen

  • Die folgende Funktion ist ungültig, da sie eine nicht deterministische Konvertierung enthält.

    CREATE FUNCTION dbo.fn_example5 (@column1 DATETIME)
    RETURNS TABLE WITH SCHEMABINDING
    AS
    RETURN
    
    SELECT 1 AS is_eligible
    WHERE @column1 < CONVERT(DATETIME, '1/1/2016');
    GO
    
  • Die folgende Funktion ist ungültig, da sie einen nicht deterministischen Funktionsaufruf enthält.

    CREATE FUNCTION dbo.fn_example6 (@column1 DATETIME)
    RETURNS TABLE WITH SCHEMABINDING
    AS
    RETURN
    
    SELECT 1 AS is_eligible
    WHERE @column1 < DATEADD(day, - 60, GETDATE());
    GO
    
  • Die folgende Funktion ist ungültig, da sie eine Unterabfrage enthält.

    CREATE FUNCTION dbo.fn_example7 (@column1 INT)
    RETURNS TABLE WITH SCHEMABINDING
    AS
    RETURN
    
    SELECT 1 AS is_eligible
    WHERE @column1 IN (
        SELECT SupplierID
        FROM Supplier
        WHERE STATUS = 'Defunct'
    );
    GO
    
  • Die folgenden Funktionen sind ungültig, da Ausdrücke, die algebraische Operatoren oder integrierte Funktionen verwenden, beim Definieren der Funktion in eine Konstante ausgewertet werden müssen. Sie können keine Verweise auf Spalten in algebraische Ausdrücke oder Funktionsaufrufe einschließen.

    CREATE FUNCTION dbo.fn_example8 (@column1 INT)
    RETURNS TABLE WITH SCHEMABINDING
    AS
    RETURN
    
    SELECT 1 AS is_eligible
    WHERE @column1 % 2 = 0;
    GO
    
    CREATE FUNCTION dbo.fn_example9 (@column1 INT)
    RETURNS TABLE WITH SCHEMABINDING
    AS
    RETURN
    
    SELECT 1 AS is_eligible
    WHERE SQRT(@column1) = 30;
    GO
    
  • Die folgende Funktion ist ungültig, da sie die hier beschriebenen Regeln verletzt, nachdem Sie den BETWEEN-Operator mit dem entsprechenden AND-Ausdruck ersetzt haben.

    CREATE FUNCTION dbo.fn_example10 (
        @column1 INT,
        @column2 INT
    )
    RETURNS TABLE
        WITH SCHEMABINDING
    AS
    RETURN
    
    SELECT 1 AS is_eligible
    WHERE (
        @column1 BETWEEN 1 AND 200
        OR @column1 = 300
    )
    AND @column2 > 1000;
    GO
    

    Die vorhergehende Funktion entspricht der folgenden Funktion nach dem Ersetzen des Operators BETWEEN durch den entsprechenden AND-Ausdruck. Diese Funktion ist ungültig, da primitive Bedingungen nur den logischen Operator OR verwenden können.

    CREATE FUNCTION dbo.fn_example11 (
        @column1 INT,
        @column2 INT
    )
    RETURNS TABLE WITH SCHEMABINDING
    AS
    RETURN
    
    SELECT 1 AS is_eligible
    WHERE (
        @column1 >= 1
        AND @column1 <= 200
        OR @column1 = 300
    )
    AND @column2 > 1000;
    GO
    

Anwenden der Filterfunktion durch Stretch Database

Stretch Database wendet die Filterfunktion mithilfe des CROSS APPLY-Operators auf die Tabelle an und bestimmt berechtigte Zeilen. Beispiel:

SELECT * FROM stretch_table_name CROSS APPLY fn_stretchpredicate(column1, column2)

Wenn die Funktion ein nicht leeres Ergebnis für die Zeile zurückgibt, ist die Zeile für die Migration geeignet.

Ersetzen einer vorhandenen Filterfunktion

Sie können eine zuvor angegebene Filterfunktion ersetzen, indem Sie die ALTER TABLE -Anweisung erneut ausführen und einen neuen Wert für den Parameter FILTER_PREDICATE angeben. Beispiel:

ALTER TABLE stretch_table_name SET (
	REMOTE_DATA_ARCHIVE = ON (
		FILTER_PREDICATE = dbo.fn_stretchpredicate2(column1, column2),
		MIGRATION_STATE = OUTBOUND
		/* replace OUTBOUND in this example, with the actual, desired migration state */
));

Die neue Inline-Tabellenwertfunktion hat die folgenden Anforderungen.

  • Die neue Funktion muss weniger restriktiv als die vorherige Funktion sein.

  • Alle Operatoren, die in der alten Funktion vorhanden waren, müssen in der neuen Funktion vorhanden sein.

  • Die neue Funktion darf keine Operatoren enthalten, die in der alten Funktion nicht vorhanden waren.

  • Der Reihenfolge der Operatorargumente kann sich nicht ändern.

  • Nur konstante Werte, die Teil eines <, <=, >, >= -Vergleichs sind, können so geändert werden, dass die Funktion weniger restriktiv ist.

Beispiel einer gültigen Ersetzung

Angenommen, die folgende Funktion ist die aktuelle Filterfunktion.

CREATE FUNCTION dbo.fn_stretchpredicate_old (
    @column1 DATETIME,
    @column2 INT
)
RETURNS TABLE
    WITH SCHEMABINDING
AS
RETURN

SELECT 1 AS is_eligible
WHERE @column1 < CONVERT(DATETIME, '1/1/2016', 101)
    AND (
		@column2 < - 100
		OR @column2 > 100
	);
GO

Die folgende Funktion ist eine gültige Ersetzung, da die neue Datumskonstante (die ein späteres Umstellungsdatum angibt) die Funktion weniger restriktiv macht.

CREATE FUNCTION dbo.fn_stretchpredicate_new (
    @column1 DATETIME,
    @column2 INT
)
RETURNS TABLE WITH SCHEMABINDING
AS
RETURN

SELECT 1 AS is_eligible
WHERE @column1 < CONVERT(DATETIME, '2/1/2016', 101)
    AND (
        @column2 < - 50
        OR @column2 > 50
	);
GO

Beispiele für ungültige Ersetzungen

Die folgende Funktion ist keine gültige Ersetzung, da die neue Datumskonstante (die ein früheres Umstellungsdatum angibt) die Funktion nicht weniger restriktiv macht.

CREATE FUNCTION dbo.fn_notvalidreplacement_1 (
    @column1 DATETIME,
    @column2 INT
)
RETURNS TABLE WITH SCHEMABINDING
AS
RETURN

SELECT 1 AS is_eligible
WHERE @column1 < CONVERT(DATETIME, '1/1/2015', 101)
    AND (
		@column2 < - 100
		OR @column2 > 100
	);
GO

Die folgende Funktion ist keine gültige Ersetzung, weil einer der Vergleichsoperatoren entfernt wurde.

CREATE FUNCTION dbo.fn_notvalidreplacement_2 (
    @column1 DATETIME,
    @column2 INT
)
RETURNS TABLE WITH SCHEMABINDING
AS
RETURN

SELECT 1 AS is_eligible
WHERE @column1 < CONVERT(DATETIME, '1/1/2016', 101)
    AND (@column2 < - 50);
GO

Die folgende Funktion ist keine gültige Ersetzung, da eine neue Bedingung mit dem logischen Operator AND hinzugefügt wurde.

CREATE FUNCTION dbo.fn_notvalidreplacement_3 (
    @column1 DATETIME,
    @column2 INT
)
RETURNS TABLE WITH SCHEMABINDING
AS
RETURN

SELECT 1 AS is_eligible
WHERE @column1 < CONVERT(DATETIME, '1/1/2016', 101)
    AND (
        @column2 < - 100
        OR @column2 > 100
	)
    AND (@column2 <> 0);
GO

Entfernen einer Filterfunktion von einer Tabelle

Entfernen Sie die vorhandene Funktion, indem Sie FILTER_PREDICATE auf NULL festlegen, um anstelle ausgewählter Zeilen die gesamte Tabelle zu migrieren. Beispiel:

ALTER TABLE stretch_table_name

SET (
	REMOTE_DATA_ARCHIVE = ON (
		FILTER_PREDICATE = NULL,
		MIGRATION_STATE = OUTBOUND
		/* replace OUTBOUND in this example, with the actual, desired migration state */
));

Nachdem Sie die Filterfunktion entfernt haben, sind alle Zeilen in der Tabelle für die Migration geeignet. Sie können daher nicht später eine Filterfunktion für dieselbe Tabelle angeben, es sei denn, Sie bringen zuerst alle Remotedaten für die Tabelle von Azure zurück. Diese Einschränkung gilt, um die Situation zu vermeiden, in der Zeilen, die nicht für die Migration geeignet sind, bei Angabe einer neuen Filterfunktion bereits in Azure migriert wurden.

Überprüfen der auf eine Tabelle angewendeten Filterfunktion

Öffnen Sie zum Überprüfen der Filterfunktion, die auf eine Tabelle angewendet wurde, die Katalogsicht sys.remote_data_archive_tables , und überprüfen Sie den Wert der Spalte filter_predicate . Falls der Wert NULL ist, ist die gesamte Tabelle für die Archivierung geeignet. Weitere Informationen finden Sie unter sys.remote_data_archive_tables (Transact-SQL).

Sicherheitshinweise für Filterfunktionen

Ein kompromittiertes Konto mit db_owner-Berechtigungen kann folgende Aktionen ausführen.

  • Erstellen und Anwenden einer Tabellenwertfunktion, die große Mengen an Serverressourcen verbraucht oder für einen längeren Zeitraum wartet, was zu einem Denial of Service führt.

  • Erstellen und Anwenden einer Tabellenwertfunktion, die es ermöglicht, den Inhalt einer Tabelle abzuleiten, für die dem Benutzer explizit der Lesezugriff verweigert wurde.

Siehe auch