フィルター関数を使用して移行する行を選択する (Stretch Database)Select rows to migrate by using a filter function (Stretch Database)

適用対象:○SQL Server (2016 以降で Windows のみ)×Azure SQL Database×Azure SQL Data Warehouse ×Parallel Data WarehouseAPPLIES TO: yesSQL Server (Windows only starting with 2016) noAzure SQL Database noAzure SQL Data Warehouse noParallel Data Warehouse

コールド データを別のテーブルに保存している場合、そのテーブル全体を移行するように Stretch Database を構成できます。If you store cold data in a separate table, you can configure Stretch Database to migrate the entire table. 一方、テーブルにホット データとコールド データの両方が含まれている場合は、移行する行を選択するフィルター述語を指定できます。If your table contains both hot and cold data, on the other hand, you can specify a filter predicate to select the rows to migrate. フィルター述語はインライン テーブル値関数です。The filter predicate is an inline table-valued function. この記事では、移行する行を選択するインライン テーブル値関数を作成する方法について説明します。This article describes how to write an inline table-valued function to select rows to migrate.

重要

指定したフィルター関数のパフォーマンスが低いと、データ移行のパフォーマンスも低くなります。If you provide a filter function that performs poorly, data migration also performs poorly. Stretch Database では、CROSS APPLY 演算子を使用してテーブルにフィルター関数を適用します。Stretch Database applies the filter function to the table by using the CROSS APPLY operator.

フィルター関数を指定しない場合、テーブル全体が移行されます。If you don't specify a filter function, the entire table is migrated.

データベースのストレッチの有効化ウィザードを実行すると、テーブル全体を移行することも、ウィザードで単純なフィルター関数を指定することもできます。When you run the Enable Database for Stretch Wizard, you can migrate an entire table or you can specify a simple filter function in the wizard. 移行する行を選択するために別の種類のフィルター関数を使用する場合、次のいずれかの操作を行います。If you want to use a different type of filter function to select rows to migrate, do one of the following things.

  • ウィザードを終了し、ALTER TABLE ステートメントを実行してテーブルの Stretch を有効にして、フィルター関数を指定します。Exit the wizard and run the ALTER TABLE statement to enable Stretch for the table and to specify a filter function.

  • ウィザードを終了した後、ALTER TABLE ステートメントを実行してフィルター関数を指定します。Run the ALTER TABLE statement to specify a filter function after you exit the wizard.

関数を追加するための ALTER TABLE 構文については、この記事で後述します。The ALTER TABLE syntax for adding a function is described later in this article.

フィルター関数の基本的な要件Basic requirements for the filter function

Stretch Database のフィルター述語に必要なインライン テーブル値関数は次の例のようになります。The inline table-valued function required for a Stretch Database filter predicate looks like the following example.

CREATE FUNCTION dbo.fn_stretchpredicate(@column1 datatype1, @column2 datatype2 [, ...n])  
RETURNS TABLE  
WITH SCHEMABINDING   
AS   
RETURN  SELECT 1 AS is_eligible  
        WHERE <predicate>  

関数のパラメーターは、テーブルの列の識別子である必要があります。The parameters for the function have to be identifiers for columns from the table.

フィルター関数で使用される列が削除または変更されるのを防ぐために、スキーマ バインドが必要となります。Schema binding is required to prevent columns that are used by the filter function from being dropped or altered.

戻り値Return value

関数から空ではない結果が返された場合、その行は移行の対象になります。If the function returns a non-empty result, the row is eligible to be migrated. それ以外の場合 (結果が返されない場合)、その行は移行の対象にはなりません。Otherwise - that is, if the function doesn't return a result - the row is not eligible to be migrated.

[条件]Conditions

<predicate> は、1 つの条件で構成される場合もあれば、AND 論理演算子で結合された複数の条件で構成される場合もあります。The <predicate> can consist of one condition, or of multiple conditions joined with the AND logical operator.

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

各条件は、1 つのプリミティブ条件で構成される場合もあれば、OR 論理演算子で結合された複数のプリミティブ条件で構成される場合もあります。Each condition in turn can consist of one primitive condition, or of multiple primitive conditions joined with the OR logical operator.

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

プリミティブ条件Primitive conditions

プリミティブ条件では、次のいずれかの比較を実行できます。A primitive condition can do one of the following comparisons.

<primitive_condition> ::=   
{  
<function_parameter> <comparison_operator> constant  
| <function_parameter> { IS NULL | IS NOT NULL }  
| <function_parameter> IN ( constant [ ,...n ] )  
}  
  
  • 関数パラメーターと定数式を比較します。Compare a function parameter to a constant expression. たとえば、 @column1 < 1000のようにします。For example, @column1 < 1000.

    次の例では、 date 列の値が < 1/1/2016 であるかどうかを確認します。Here's an example that checks whether the value of a date column is < 1/1/2016.

    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  
    ) )  
    
    
  • IS NULL または IS NOT NULL 演算子を関数パラメーターに適用します。Apply the IS NULL or IS NOT NULL operator to a function parameter.

  • IN 演算子を使用して、関数パラメーターと定数値のリストを比較します。Use the IN operator to compare a function parameter to a list of constant values.

    次の例では、 shipment_status 列の値が IN (N'Completed', N'Returned', N'Cancelled')であるかどうかを確認します。Here's an example that checks whether the value of a shipment_status column is IN (N'Completed', N'Returned', N'Cancelled').

    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  
    ) )  
    
    

比較演算子Comparison operators

次の比較演算子がサポートされています。The following comparison operators are supported.

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

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

定数式Constant expressions

関数を定義するときに、フィルター関数で使用する定数を、評価できる決定論的な式にすることができます。The constants that you use in a filter function can be any deterministic expression that can be evaluated when you define the function. 定数式には以下を含めることができます。Constant expressions can contain the following things.

  • リテラル。Literals. たとえば、 N'abc', 123のようにします。For example, N'abc', 123.

  • 代数式。Algebraic expressions. たとえば、 123 + 456のようにします。For example, 123 + 456.

  • 決定論的関数。Deterministic functions. たとえば、 SQRT(900)のようにします。For example, SQRT(900).

  • CAST または CONVERT を使用した決定論的変換。Deterministic conversions that use CAST or CONVERT. たとえば、 CONVERT(datetime, '1/1/2016', 101)のようにします。For example, CONVERT(datetime, '1/1/2016', 101).

その他の式Other expressions

BETWEEN 演算子と NOT BETWEEN 演算子を同等の AND 式と OR 式に置き換えた後、結果的に作成される関数がここで説明するルールに準拠する場合は、BETWEEN 演算子と NOT BETWEEN 演算子を使用できます。You can use the BETWEEN and NOT BETWEEN operators if the resulting function conforms to the rules described here after you replace the BETWEEN and NOT BETWEEN operators with the equivalent AND and OR expressions.

サブクエリや非決定論的関数 (RAND() や GETDATE() など) は使用できません。You can't use subqueries or non-deterministic functions such as RAND() or GETDATE().

フィルター関数をテーブルに追加するAdd a filter function to a table

ALTER TABLE ステートメントを実行し、 FILTER_PREDICATE パラメーターの値として既存のインライン テーブル値関数を指定して、テーブルにフィルター関数を追加します。Add a filter function to a table by running the ALTER TABLE statement and specifying an existing inline table-valued function as the value of the FILTER_PREDICATE parameter. 例 :For example:

ALTER TABLE stretch_table_name SET ( REMOTE_DATA_ARCHIVE = ON (  
    FILTER_PREDICATE = dbo.fn_stretchpredicate(column1, column2),  
    MIGRATION_STATE = <desired_migration_state>  
) )  
  

関数を述語としてテーブルにバインドすると、次のようになります。After you bind the function to the table as a predicate, the following things are true.

  • 次回のデータ移行時に、関数から空ではない値が返された行だけが移行されます。The next time data migration occurs, only the rows for which the function returns a non-empty value are migrated.

  • 関数で使用される列はスキーマ バインドされています。The columns used by the function are schema bound. テーブルで関数がフィルター述語として使用されている限り、これらの列を変更することはできません。You can't alter these columns as long as a table is using the function as its filter predicate.

テーブルで関数がフィルター述語として使用されている限り、インライン テーブル値関数を削除することはできません。You can't drop the inline table-valued function as long as a table is using the function as its filter predicate.

ヒント

フィルター関数のパフォーマンスを向上させるには、関数が使用する列にインデックスを作成します。To improve the performance of the filter function, create an index on the columns used by the function.

列名をフィルター関数に渡すPassing column names to the filter function

テーブルにフィルター関数を割り当てるときは、1 部構成の名前を使用してフィルター関数に渡される列名を指定します。When you assign a filter function to a table, specify the column names passed to the filter function with a one-part name. 列名を渡すときに、3 部構成の名前を指定すると、Stretch 対応テーブルに対する後続のクエリが失敗します。If you specify a three-part name when you pass the column names, subsequent queries against the Stretch-enabled table will fail.

たとえば、次の例のように 3 部構成の列名を指定すると、ステートメントは正常に実行されますが、テーブルに対する後続のクエリは失敗します。For example, if you specify a three-part column name as shown in the following example, the statement will run successfully, but subsequent queries against the table will fail.

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

代わりに、次の例で示すように、1 部構成の列名を持つフィルター関数を指定します。Instead, specify the filter function with a one-part column name as shown in the following example.

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

ウィザードの実行後、フィルター関数を追加するAdd a filter function after running the Wizard

データベースのストレッチの有効化 ウィザードで作成できない関数を使用したい場合は、ウィザードを終了してから ALTER TABLE ステートメントを実行して関数を指定できます。If you want use a function that you can't create in the Enable Database for Stretch Wizard, you can run the ALTER TABLE statement to specify a function after you exit the wizard. ただし、関数を適用する前に、既に進行中のデータ移行を停止し、移行されたデータを戻す必要があります。Before you can apply a function, however, you have to stop the data migration that's already in progress and bring back migrated data. (これが必要な理由については、「 既存のフィルター関数の置き換え」を参照してください)。(For more info about why this is necessary, see Replace an existing filter function.)

  1. 移行の方向を反転し、既に移行されたデータを戻します。Reverse the direction of migration and bring back the data already migrated. この操作は開始すると取り消すことはできません。You can't cancel this operation after it starts. また、送信データ転送 (エグレス) のための Azure のコストも発生します。You also incur costs on Azure for outbound data transfers (egress). 詳細については、「 Data Transfers (データ転送) の料金詳細」を参照してください。For more info, see How Azure pricing works.

    ALTER TABLE <table name>  
        SET ( REMOTE_DATA_ARCHIVE ( MIGRATION_STATE = INBOUND ) ) ;   
    
  2. 移行が完了するまで待ちます。Wait for migration to finish. 状態は、SQL Server Management Studio から Stretch Database モニター で確認することも、 sys.dm_db_rda_migration_status ビューでクエリを実行して確認することもできます。You can check the status in Stretch Database Monitor from SQL Server Management Studio, or you can query the sys.dm_db_rda_migration_status view. 詳細については、「 データ移行の監視とトラブルシューティング 」または「 sys.dm_db_rda_migration_status」を参照してください。For more info, see Monitor and troubleshoot data migration or sys.dm_db_rda_migration_status.

  3. テーブルに適用するフィルター関数を作成します。Create the filter function that you want to apply to the table.

  4. 関数をテーブルに追加し、Azure へのデータ移行を再開します。Add the function to the table and restart data migration to Azure.

    ALTER TABLE <table name>  
        SET ( REMOTE_DATA_ARCHIVE  
            (           
                FILTER_PREDICATE = <predicate>,  
                MIGRATION_STATE = OUTBOUND  
            )  
            );   
    

日付による行のフィルターFilter rows by date

次の例では、 date 列に 2016 年 1 月 1 日より前の値が含まれている行を移行します。The following example migrates rows where the date column contains a value earlier than January 1, 2016.

-- 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  
  

status 列の値による行のフィルターFilter rows by the value in a status column

次の例では、 status 列に指定した値のいずれかが含まれている行を移行します。The following example migrates rows where the status column contains one of the specified values.

-- 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  
  

スライディング ウィンドウを使用した行のフィルターFilter rows by using a sliding window

スライディング ウィンドウを使用して行をフィルター処理する場合は、フィルター関数の次の要件に注意してください。To filter rows by using a sliding window, keep in mind the following requirements for the filter function.

  • 関数は決定論的である必要があります。The function has to be deterministic. そのため、時間の経過に伴って、スライディング ウィンドウを自動的に再計算する関数を作成することはできません。Therefore you can't create a function that automatically recalculates the sliding window as time passes.

  • 関数ではスキーマ バインドを使用します。The function uses schema binding. そのため、 ALTER FUNCTION を呼び出してスライディング ウィンドウを移動することで、"配置済みの" 関数を毎日更新することはできません。Therefore you can't simply update the function "in place" every day by calling ALTER FUNCTION to move the sliding window.

systemEndTime 列に 2016 年 1 月 1 日より前の値が含まれている行を移行する、次の例のようなフィルター関数から始めます。Start with a filter function like the following example, which migrates rows where the systemEndTime column contains a value earlier than January 1, 2016.

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) ;  
  

フィルター関数をテーブルに適用します。Apply the filter function to the table.

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

スライディング ウィンドウを更新する場合は、次の手順に従います。When you want to update the sliding window, do the following things.

  1. 新しいスライディング ウィンドウを指定する新しい関数を作成します。Create a new function that specifies the new sliding window. 次の例では、2016 年 1 月 1 日ではなく、2016 年 1 月 2日より前の日付を選択します。The following example selects dates earlier than January 2, 2016, instead of January 1, 2016.

  2. 次の例に示すように、 ALTER TABLEを呼び出して、以前のフィルター関数を新しい関数で置き換えます。Replace the previous filter function with the new one by calling ALTER TABLE, as shown in the following example.

  3. 必要に応じて、 DROP FUNCTIONを呼び出して不要になった以前のフィルター関数を削除します。Optionally, drop the previous filter function that you're no longer using by calling DROP FUNCTION. (この手順は例には含まれていません)。(This step is not shown in the example.)

BEGIN TRAN  
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(SysEndTime),  
                       MIGRATION_STATE = OUTBOUND  
               )  
        )   
COMMIT ;  
  

有効なフィルター関数のその他の例More examples of valid filter functions

  • 次の例では、AND 論理演算子を使用して 2 つのプリミティブ条件を結合しています。The following example combines two primitive conditions by using the AND logical operator.

    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  
    ) )  
    
    
  • 次の例では、複数の条件と CONVERT による決定論的変換を使用しています。The following example uses several conditions and a deterministic conversion with CONVERT.

    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  
    
    
  • 次の例では、算術演算子と関数を使用しています。The following example uses mathematical operators and functions.

    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  
    
    
  • 次の例では、BETWEEN 演算子と NOT BETWEEN 演算子を使用しています。The following example uses the BETWEEN and NOT BETWEEN operators. BETWEEN 演算子と NOT BETWEEN 演算子を同等の AND 式と OR 式に置き換えた後、結果的に作成される関数がここで説明するルールに準拠するため、この使用方法は有効です。This usage is valid because the resulting function conforms to the rules described here after you replace the BETWEEN and NOT BETWEEN operators with the equivalent AND and OR expressions.

    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  
    
    

    BETWEEN 演算子と NOT BETWEEN 演算子を同等の AND 式と OR 式に置き換えた結果、置換前の関数は置換後の関数と等しくなっています。The preceding function is equivalent to the following function after you replace the BETWEEN and NOT BETWEEN operators with the equivalent AND and OR expressions.

    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  
    
    

無効なフィルター関数の例Examples of filter functions that aren't valid

  • 非決定論的変換が含まれているため、次の関数は無効です。The following function isn't valid because it contains a non-deterministic conversion.

    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  
    
    
  • 非決定論的な関数呼び出しが含まれているため、次の関数は無効です。The following function isn't valid because it contains a non-deterministic function call.

    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  
    
    
  • サブクエリが含まれているため、次の関数は無効です。The following function isn't valid because it contains a subquery.

    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  
    
    
  • 関数を定義するときに、代数演算子または組み込み関数を使用する式は定数に評価する必要があるため、次の関数は無効です。The following functions aren't valid because expressions that use algebraic operators or built-in functions must evaluate to a constant when you define the function. 代数式や関数呼び出しに列参照を含めることはできません。You can't include column references in algebraic expressions or function calls.

    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  
    
    
  • BETWEEN 演算子を同等の AND 式に置き換えると、ここで説明するルールに違反するため、次の関数は無効です。The following function isn't valid because it violates the rules described here after you replace the BETWEEN operator with the equivalent AND expression.

    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  
    
    

    BETWEEN 演算子を同等の AND 式に置き換えた結果、置換前の関数は置換後の関数と等しくなっています。The preceding function is equivalent to the following function after you replace the BETWEEN operator with the equivalent AND expression. プリミティブ条件で使用できるのは OR 論理演算子だけであるため、この関数は無効です。This function isn't valid because primitive conditions can only use the OR logical operator.

    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  
    
    

Stretch Database がフィルター関数を適用するしくみHow Stretch Database applies the filter function

Stretch Database では、CROSS APPLY 演算子を使用してテーブルにフィルター関数を適用し、対象となる行を決定します。Stretch Database applies the filter function to the table and determines eligible rows by using the CROSS APPLY operator. 例 :For example:

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

関数から行の空ではない結果が返された場合、その行は移行の対象になります。If the function returns a non-empty result for the row, the row is eligible to be migrated.

既存のフィルター関数の置き換えReplace an existing filter function

以前に指定したフィルター関数を置き換えるには、 ALTER TABLE ステートメントをもう一度実行し、 FILTER_PREDICATE パラメーターに新しい値を指定します。You can replace a previously specified filter function by running the ALTER TABLE statement again and specifying a new value for the FILTER_PREDICATE parameter. 例 :For example:

ALTER TABLE stretch_table_name SET ( REMOTE_DATA_ARCHIVE = ON (  
    FILTER_PREDICATE = dbo.fn_stretchpredicate2(column1, column2),  
    MIGRATION_STATE = <desired_migration_state>  
  

新しいインライン テーブル値関数には、次の要件があります。The new inline table-valued function has the following requirements.

  • 新しい関数では、前の関数よりも制約を減らす必要があります。The new function has to be less restrictive than the previous function.

  • 古い関数に含まれていたすべての演算子を新しい関数に含める必要があります。All the operators that existed in the old function must exist in the new function.

  • 古い関数に含まれていない演算子を新しい関数に含めることはできません。The new function can't contain operators that don't exist in the old function.

  • 演算子の引数の順序は変更できません。The order of operator arguments can't change.

  • <, <=, >, >= 比較に含まれる定数値のみ、関数の制約が減るように変更できます。Only constant values that are part of a <, <=, >, >= comparison can be changed in a way that makes the function less restrictive.

有効な置換の例Example of a valid replacement

次の関数が現在のフィルター関数であると仮定します。Assume that the following function is the current filter function.

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  
  

(元の決算日よりも後の日付を指定した) 新しい日付定数によって関数の制約が減るため、次の関数は有効な置換です。The following function is a valid replacement because the new date constant (which specifies a later cutoff date) makes the function less restrictive.

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  
  

無効な置換の例Examples of replacements that aren't valid

(元の決算日よりも前の日付を指定した) 新しい日付定数によって関数の制約が減らないため、次の関数は無効な置換です。The following function isn't a valid replacement because the new date constant (which specifies an earlier cutoff date) doesn't make the function less restrictive.

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  
  

比較演算子の 1 つが削除されているため、次の関数は無効な置換です。The following function isn't a valid replacement because one of the comparison operators has been removed.

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  
  

AND 論理演算子を使用して新しい条件が追加されているため、次の関数は無効な置換です。The following function isn't a valid replacement because a new condition has been added with the AND logical operator.

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  
  

テーブルからのフィルター関数の削除Remove a filter function from a table

選択した行ではなく、テーブル全体を移行するには、 FILTER_PREDICATE を null に設定して既存の関数を削除します。To migrate the entire table instead of selected rows, remove the existing function by setting FILTER_PREDICATE to null. 例 :For example:

ALTER TABLE stretch_table_name SET ( REMOTE_DATA_ARCHIVE = ON (  
    FILTER_PREDICATE = NULL,  
    MIGRATION_STATE = <desired_migration_state>  
) )  
  

フィルター関数を削除すると、テーブルのすべての行が移行の対象になります。After you remove the filter function, all rows in the table are eligible for migration. そのため、Azure からテーブルのすべてのリモート データを先に戻しておかない限り、後で同じテーブルにフィルター関数を指定することはできません。As a result, you cannot specify a filter function for the same table later unless you bring back all the remote data for the table from Azure first. この制限は、新しいフィルター関数を指定したときに移行の対象外になっている行が既に Azure に移行されているという状況を回避するために設けられています。This restriction exists to avoid the situation where rows that are not eligible for migration when you provide a new filter function have already been migrated to Azure.

テーブルに適用されたフィルター関数の確認Check the filter function applied to a table

テーブルに適用されたフィルター関数を確認するには、カタログ ビュー sys.remote_data_archive_tables を開き、 filter_predicate 列の値を確認します。To check the filter function applied to a table, open the catalog view sys.remote_data_archive_tables and check the value of the filter_predicate column. 値が null の場合、テーブル全体がアーカイブの対象になります。If the value is null, the entire table is eligible for archiving. 詳細については、「sys.remote_data_archive_tables (Transact-SQL)」を参照してください。For more info, see sys.remote_data_archive_tables (Transact-SQL).

フィルター関数のセキュリティに関する注意事項Security notes for filter functions

db_owner 権限を持つ侵害されたアカウントは、次の操作を実行できます。A compromised account with db_owner privileges can do the following things.

  • 大量のサーバー リソースを消費したり、長期間にわたって待機したりするテーブル値関数を作成し適用して、サービス拒否攻撃を仕掛ける。Create and apply a table-valued function that consumes large amounts of server resources or waits for an extended period resulting in a denial of service.

  • 読み取りアクセスを明示的に拒否されているユーザーが、テーブルの内容を推測できるようにするテーブル値関数を作成して適用する。Create and apply a table-valued function that makes it possible to infer the content of a table for which the user has been explicitly denied read access.

参照See Also

ALTER TABLE (Transact-SQL)ALTER TABLE (Transact-SQL)