Selecionar linhas para migrar usando uma função de filtro (Stretch Database)Select rows to migrate by using a filter function (Stretch Database)

APLICA-SE A: simSQL Server (somente Windows a partir do 2016) nãoBanco de Dados SQL do Azure nãoSQL Data Warehouse do Azure nãoParallel Data WarehouseAPPLIES TO: yesSQL Server (Windows only starting with 2016) noAzure SQL Database noAzure SQL Data Warehouse noParallel Data Warehouse

Se você armazenar dados inertes em uma tabela separada, será possível configurar o Stretch Database para migrar a tabela inteira.If you store cold data in a separate table, you can configure Stretch Database to migrate the entire table. Por outro lado, se sua tabela contiver dados dinâmicos e inertes, você poderá especificar um predicado de filtro para selecionar as linhas a serem migradas.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. O predicado de filtro é uma função com valor de tabela embutida.The filter predicate is an inline table-valued function. Este artigo descreve como escrever uma função com valor de tabela embutida para selecionar linhas a serem migradas.This article describes how to write an inline table-valued function to select rows to migrate.

Importante

Se você fornecer uma função de filtro precária, a migração de dados também será precária.If you provide a filter function that performs poorly, data migration also performs poorly. O Stretch Database aplica a função de filtro à tabela usando o operador CROSS APPLY.Stretch Database applies the filter function to the table by using the CROSS APPLY operator.

Se você não especificar uma função de filtro, a tabela inteira será migrada.If you don't specify a filter function, the entire table is migrated.

Ao executar o Assistente para habilitar o banco de dados para Stretch, você pode migrar uma tabela inteira ou especificar uma função de filtro simples no assistente.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. Se você desejar usar um tipo diferente de função de filtro para selecionar as linhas a serem migradas, siga um destes procedimentos.If you want to use a different type of filter function to select rows to migrate, do one of the following things.

  • Saia do assistente e execute a instrução ALTER TABLE para habilitar o Stretch para a tabela e especificar uma função de filtro.Exit the wizard and run the ALTER TABLE statement to enable Stretch for the table and to specify a filter function.

  • Execute a instrução ALTER TABLE para especificar uma função de filtro depois que você sair do assistente.Run the ALTER TABLE statement to specify a filter function after you exit the wizard.

A sintaxe ALTER TABLE para adicionar uma função é descrita posteriormente neste artigo.The ALTER TABLE syntax for adding a function is described later in this article.

Requisitos básicos para a função de filtroBasic requirements for the filter function

A função com valor de tabela embutida, necessária para um predicado de filtro Stretch Database é parecida com o exemplo a seguir.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>  

Os parâmetros da função precisam ser identificadores para colunas da tabela.The parameters for the function have to be identifiers for columns from the table.

A associação do esquema é necessária para impedir que as colunas usadas pela função de filtro sejam descartadas ou alteradas.Schema binding is required to prevent columns that are used by the filter function from being dropped or altered.

Valor de retornoReturn value

Se a função retornar um resultado não vazio, a linha será qualificada para ser migrada.If the function returns a non-empty result, the row is eligible to be migrated. Caso contrário, isto é, se a função não retornar um resultado, a linha não será qualificada para ser migrada.Otherwise - that is, if the function doesn't return a result - the row is not eligible to be migrated.

CondiçõesConditions

O <predicado> pode consistir em uma condição ou em várias condições associadas ao operador lógico AND.The <predicate> can consist of one condition, or of multiple conditions joined with the AND logical operator.

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

Por sua vez, cada condição pode consistir em uma condição primitiva ou em várias condições primitivas associadas ao operador lógico 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 ]  

Condições primitivasPrimitive conditions

Uma condição primitiva pode fazer uma das comparações a seguir.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 um parâmetro de função a uma expressão constante.Compare a function parameter to a constant expression. Por exemplo, @column1 < 1000.For example, @column1 < 1000.

    Veja um exemplo que verifica se o valor de uma coluna data é < 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  
    ) )  
    
    
  • Aplique o operador IS NULL ou IS NOT NULL a um parâmetro de função.Apply the IS NULL or IS NOT NULL operator to a function parameter.

  • Use o operador IN para comparar um parâmetro de função com uma lista de valores constantes.Use the IN operator to compare a function parameter to a list of constant values.

    Veja um exemplo que verifica se o valor de uma coluna 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  
    ) )  
    
    

Operadores de comparaçãoComparison operators

Os operadores de comparação a seguir são compatíveis.The following comparison operators are supported.

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

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

Expressões de constanteConstant expressions

As constantes que você usa em uma função de filtro podem ser qualquer expressão determinística que pode ser avaliada ao definir a função.The constants that you use in a filter function can be any deterministic expression that can be evaluated when you define the function. As expressões de constante podem conter os itens a seguir.Constant expressions can contain the following things.

  • LiteraisLiterals. Por exemplo, N'abc', 123.For example, N'abc', 123.

  • Expressões algébricas.Algebraic expressions. Por exemplo, 123 + 456.For example, 123 + 456.

  • Funções determinísticas.Deterministic functions. Por exemplo, SQRT(900).For example, SQRT(900).

  • Conversões determinísticas que usam CAST ou CONVERT.Deterministic conversions that use CAST or CONVERT. Por exemplo, CONVERT(datetime, '1/1/2016', 101).For example, CONVERT(datetime, '1/1/2016', 101).

Outras expressõesOther expressions

Você pode usar os operadores BETWEEN e NOT BETWEEN se a função resultante estiver em conformidade com as regras descritas aqui depois de substituir os operadores BETWEEN e NOT BETWEEN pelas expressões equivalentes AND e 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.

Você não pode usar subconsultas nem funções não determinísticas como RAND() ou GETDATE().You can't use subqueries or non-deterministic functions such as RAND() or GETDATE().

Adicionar uma função de filtro a uma tabelaAdd a filter function to a table

Adicione uma função de filtro a uma tabela executando a instrução ALTER TABLE e especificando uma função com valor de tabela embutida existente como o valor do parâmetro 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. Por exemplo:For example:

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

Depois de associar a função à tabela como um predicado, os itens a seguir serão verdadeiros.After you bind the function to the table as a predicate, the following things are true.

  • Na próxima vez que a migração de dados ocorrer, somente as linhas para as quais a função retorna uma valor não vazio serão migradas.The next time data migration occurs, only the rows for which the function returns a non-empty value are migrated.

  • As colunas usadas pela função são associadas ao esquema.The columns used by the function are schema bound. Não é possível alterar essas colunas, pois uma tabela está usando a função como seu predicado de filtro.You can't alter these columns as long as a table is using the function as its filter predicate.

Não é possível descartar a função com valor de tabela embutida, pois uma tabela está usando a função como seu predicado de filtro.You can't drop the inline table-valued function as long as a table is using the function as its filter predicate.

Dica

Para melhorar o desempenho da função de filtro, crie um índice em colunas usadas pela função.To improve the performance of the filter function, create an index on the columns used by the function.

Passando nomes de coluna para a função de filtroPassing column names to the filter function

Ao atribuir uma função de filtro a uma tabela, especifique os nomes de coluna passados para a função de filtro com um nome de parte única.When you assign a filter function to a table, specify the column names passed to the filter function with a one-part name. Se você especificar um nome de três partes ao passar os nomes de coluna, as consultas subsequentes com base em tabelas habilitada para Stretch falharão.If you specify a three-part name when you pass the column names, subsequent queries against the Stretch-enabled table will fail.

Por exemplo, se você especificar um nome de coluna de três partes, conforme mostrado no exemplo a seguir, a instrução será executada com êxito, mas as consultas subsequentes com base na tabela falharão.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 )
  )

Em vez disso, especifique a função de filtro com um nome de coluna de parte única, conforme mostrado no exemplo a seguir.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 )
  )

Adicionar uma função de filtro após a execução do AssistenteAdd a filter function after running the Wizard

Se você quiser usar uma função que não pode criar o Assistente Habilitar o banco de dados para Stretch , você pode executar a instrução ALTER TABLE para especificar uma função depois que sair do assistente.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. Antes de aplicar uma função, no entanto, você precisa interromper a migração de dados que já está em andamento e trazer os dados migrados de volta.Before you can apply a function, however, you have to stop the data migration that's already in progress and bring back migrated data. (Para obter mais informações sobre por que isso é necessário, consulte Substituir uma função de filtro existente.)(For more info about why this is necessary, see Replace an existing filter function.)

  1. Reverta a direção da migração e restaure os dados já migrados.Reverse the direction of migration and bring back the data already migrated. Não é possível cancelar esta operação após ela ser iniciada.You can't cancel this operation after it starts. Você também incorre em custos no Azure para transferências de dados de saída (saída).You also incur costs on Azure for outbound data transfers (egress). Para obter mais informações, consulte Como os preços do Azure funciona.For more info, see How Azure pricing works.

    ALTER TABLE <table name>  
        SET ( REMOTE_DATA_ARCHIVE ( MIGRATION_STATE = INBOUND ) ) ;   
    
  2. Aguarde a migração ser concluída.Wait for migration to finish. Você pode verificar o status no Monitor de Stretch Database do SQL Server Management Studio ou você pode consultar a exibição 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. Para obter mais informações, veja Monitorar e solucionar problemas de migração de dados ou sys.dm_db_rda_migration_status.For more info, see Monitor and troubleshoot data migration or sys.dm_db_rda_migration_status.

  3. Crie a função de filtro que você deseja aplicar à tabela.Create the filter function that you want to apply to the table.

  4. Adicione a função à tabela e reinicie a migração de dados no 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  
            )  
            );   
    

Filtrar linhas por dataFilter rows by date

O exemplo a seguir migra linhas onde a coluna data contém um valor anterior a 1º de janeiro de 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  
  

Filtrar linhas pelo valor em uma coluna de statusFilter rows by the value in a status column

O exemplo a seguir migra linhas onde a coluna status contém um dos valores especificados.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  
  

Filtrar linhas usando uma janela deslizanteFilter rows by using a sliding window

Para filtrar linhas usando uma janela deslizante, lembre-se dos requisitos a seguir para a função de filtro.To filter rows by using a sliding window, keep in mind the following requirements for the filter function.

  • A função deve ser determinística.The function has to be deterministic. Portanto, você não pode criar uma função que recalcule automaticamente a janela deslizante com o passar do tempo.Therefore you can't create a function that automatically recalculates the sliding window as time passes.

  • A função usa associação do esquema.The function uses schema binding. Portanto, não é possível simplesmente atualizar a função "in-loco" todos os dias chamando ALTER FUNCTION para mover a janela deslizante.Therefore you can't simply update the function "in place" every day by calling ALTER FUNCTION to move the sliding window.

Comece com uma função de filtro como o exemplo a seguir, que migra linhas onde a coluna systemEndTime contém um valor anterior a 1º de janeiro de 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) ;  
  

Aplique a função de filtro à tabela.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   
                )  
        )   
;  
  

Quando você quiser atualizar a janela deslizante, siga estas etapas.When you want to update the sliding window, do the following things.

  1. Crie uma nova função que especifique a nova janela deslizante.Create a new function that specifies the new sliding window. O exemplo a seguir seleciona datas anteriores a 2 de janeiro de 2016, em vez de 1º de janeiro de 2016.The following example selects dates earlier than January 2, 2016, instead of January 1, 2016.

  2. Substitua a função do filtro anterior pelo novo chamando ALTER TABLE, conforme mostrado no exemplo a seguir.Replace the previous filter function with the new one by calling ALTER TABLE, as shown in the following example.

  3. Se preferir, descarte a função de filtro anterior que você não está mais usando chamando DROP FUNCTION.Optionally, drop the previous filter function that you're no longer using by calling DROP FUNCTION. (Essa etapa não é mostrada no exemplo.)(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 ;  
  

Mais exemplos de funções de filtro válidasMore examples of valid filter functions

  • O exemplo a seguir combina duas condições primitivas usando o operador lógico 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  
    ) )  
    
    
  • O exemplo a seguir usa várias condições e uma conversão determinística com 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  
    
    
  • O exemplo a seguir usa funções e operadores matemáticos.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  
    
    
  • O exemplo a seguir usa os operadores BETWEEN e NOT BETWEEN.The following example uses the BETWEEN and NOT BETWEEN operators. Esse uso é válido porque a função resultante está em conformidade com as regras descritas aqui depois que você substitui os operadores BETWEEN e NOT BETWEEN pelas expressões equivalentes AND e 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  
    
    

    A função anterior é equivalente à função a seguir depois que você substitui os operadores BETWEEN e NOT BETWEEN pelas expressões equivalentes AND e 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  
    
    

Exemplos de função de filtro que não são válidasExamples of filter functions that aren't valid

  • A função a seguir não é válida porque contém uma conversão não determinística.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  
    
    
  • A função a seguir não é válida porque ela contém uma chamada de função não determinística.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  
    
    
  • A função a seguir não é válida porque contém uma subconsulta.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  
    
    
  • As funções a seguir não são válidas porque expressões que usam operadores algébricos ou funções internas devem ser avaliadas para uma constante quando você define a função.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. Não é possível incluir referências de coluna em expressões algébricas ou chamadas de função.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  
    
    
  • A função a seguir não é válida porque viola as regras descritas aqui depois que você substitui o operador BETWEEN pela expressão AND equivalente.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  
    
    

    A função anterior é equivalente à função a seguir depois que você substitui o operador BETWEEN pela expressão AND equivalente.The preceding function is equivalent to the following function after you replace the BETWEEN operator with the equivalent AND expression. Essa função não é válida porque as condições primitivas podem usar apenas o operador lógico 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  
    
    

Como o Stretch Database aplica a função de filtroHow Stretch Database applies the filter function

O Stretch Database aplica a função de filtro à tabela e determina linhas qualificadas usando o operador CROSS APPLY.Stretch Database applies the filter function to the table and determines eligible rows by using the CROSS APPLY operator. Por exemplo:For example:

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

Se a função retornar um resultado não vazio para a linha, a linha será qualificada para ser migrada.If the function returns a non-empty result for the row, the row is eligible to be migrated.

Substituir uma função de filtro existenteReplace an existing filter function

Você pode substituir uma função de filtro especificado anteriormente executando a instrução ALTER TABLE novamente e especificando um novo valor para o parâmetro 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. Por exemplo:For example:

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

A nova função com valor de tabela embutida tem os requisitos a seguir.The new inline table-valued function has the following requirements.

  • A nova função deve ser menos restritiva do que a função anterior.The new function has to be less restrictive than the previous function.

  • Todos os operadores que existiam na função antiga devem existir na nova função.All the operators that existed in the old function must exist in the new function.

  • A nova função não pode conter operadores que não existam na função antiga.The new function can't contain operators that don't exist in the old function.

  • A ordem dos argumentos do operador não pode mudar.The order of operator arguments can't change.

  • Somente valores constantes que fazem parte de uma comparação <, <=, >, >= podem ser alterados de uma maneira que torne a função menos restritiva.Only constant values that are part of a <, <=, >, >= comparison can be changed in a way that makes the function less restrictive.

Exemplo de uma substituição válidaExample of a valid replacement

Suponha que a função a seguir seja a função de filtro atual.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  
  

A função a seguir é uma substituição válida porque a nova constante de data (que especifica uma data de fechamento posterior) torna a função menos restritiva.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  
  

Exemplos de substituições que não são válidasExamples of replacements that aren't valid

A função a seguir não é uma substituição válida porque a nova constante de data (que especifica uma data de fechamento anterior) não torna a função menos restritiva.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  
  

A função a seguir não é uma substituição válida porque um dos operadores de comparação foi removido.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  
  

A função a seguir não é uma substituição válida porque uma nova condição foi adicionada com o operador lógico 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  
  

Remover uma função de filtro de uma tabelaRemove a filter function from a table

Para migrar a tabela inteira em vez de linhas selecionadas, remova a função existente definindo FILTER_PREDICATE como nulo.To migrate the entire table instead of selected rows, remove the existing function by setting FILTER_PREDICATE to null. Por exemplo:For example:

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

Depois de remover a função de filtro, todas as linhas na tabela serão qualificadas para migração.After you remove the filter function, all rows in the table are eligible for migration. Como resultado, não será possível especificar uma função de filtro para a mesma tabela posteriormente, a menos que você traga de volta todos os dados remotos para a tabela do primeiro 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. Essa restrição existe para evitar a situação em que as linhas não são qualificadas para migração quando você fornece uma nova função de filtro que já foi migrada para o 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.

Verificar a função de filtro aplicada a uma tabelaCheck the filter function applied to a table

Para verificar a função de filtro aplicada a uma tabela, abra a exibição de catálogo sys.remote_data_archive_tables e verifique o valor da coluna 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. Se o valor for nulo, a tabela inteira será qualificada para arquivamento.If the value is null, the entire table is eligible for archiving. Para obter mais informações, veja sys.remote_data_archive_tables (Transact-SQL).For more info, see sys.remote_data_archive_tables (Transact-SQL).

Observações de segurança para funções de filtroSecurity notes for filter functions

Uma conta com privilégios de db_owner comprometida pode fazer o seguinte.A compromised account with db_owner privileges can do the following things.

  • Criar e aplicar uma função com valor de tabela que consome uma grande quantidade de recursos do servidor ou espera por um longo período, resultando em uma negação de serviço.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.

  • Criar e aplicar uma função com valor de tabela que torna possível inferir o conteúdo de uma tabela para a qual o usuário negou explicitamente o acesso de leitura.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.

Consulte TambémSee Also

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