Выбор строк для миграции с использованием функции фильтров (Stretch Database)Select rows to migrate by using a filter function (Stretch Database)

ОБЛАСТЬ ПРИМЕНЕНИЯ: даSQL Server 2016 и более поздние версии (только в Windows) нетБаза данных SQL Azure нетAzure Synapse Analytics (хранилище данных SQL) нетParallel Data WarehouseAPPLIES TO: yesSQL Server 2016 and later (Windows only) noAzure SQL Database noAzure Synapse Analytics (SQL DW) noParallel Data Warehouse

Если холодные данные хранятся в отдельной таблице, можно настроить базу данных Stretch, чтобы перенести эту таблицу целиком.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 применяет функцию фильтров к таблице с помощью оператора 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, чтобы включить растяжение для таблицы и указать функцию фильтров.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, выглядит как показано в следующем примере.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

<Предикат> может содержать одно или несколько условий, объединенных с помощью логического оператора AND.The <predicate> can consist of one condition, or of multiple conditions joined with the AND logical operator.

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

Каждое условие в свою очередь может содержать одно простое условие или несколько простых условий, объединенных с помощью логического оператора 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, чем 01.01.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, если полученная функция соответствует описанным здесь правилам после замены операторов BETWEEN и NOT BETWEEN эквивалентными выражениями AND и OR.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

При назначении функции фильтров таблице укажите имена столбцов, переданных в функцию фильтров с помощью однокомпонентного имени.When you assign a filter function to a table, specify the column names passed to the filter function with a one-part name. Если при передаче имен столбцов указано трехкомпонентное имя, последующие запросы, адресованные таблице с включенным растяжением, завершатся ошибкой.If you specify a three-part name when you pass the column names, subsequent queries against the Stretch-enabled table will fail.

Например, если указать трехкомпонентное имя столбца, как показано в следующем примере, инструкция выполнится успешно, но последующие запросы, адресованные таблице, завершатся ошибкой.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 )
  )

Вместо этого укажите функцию фильтров с однокомпонентным именем столбца, как показано в следующем примере.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). Дополнительные сведения см. в разделе Принципы ценообразования Azure.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. Проверить состояние можно с помощью монитораStretch Database в SQL Server Management Studio или запросить представление 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 содержит значение до 1 января 2016 г.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  
  

Фильтрация строк по значению в столбце состояния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 содержит значение до 1 января 2016 г.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. В следующем примере выбираются даты до 2 января 2016 г. вместо 1 января 2016 г.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.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 применяет функцию фильтровHow Stretch Database applies the filter function

База данных Stretch применяет функцию фильтров к таблице и определяет подходящие строки при помощи оператора 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  
  

Следующая функция не является допустимой заменой, поскольку один из операторов сравнения был удален.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)