필터 함수를 사용하여 마이그레이션할 행 선택(Stretch Database)

적용 대상: SQL Server 2016(13.x) 이상 - Windows만 해당

중요

Stretch Database는 SQL Server 2022(16.x) 및 Azure SQL Database에서 더 이상 사용되지 않습니다. 데이터베이스 엔진의 이후 버전에서는 이 기능이 제거됩니다. 새 개발 작업에서는 이 기능을 사용하지 않도록 하고, 현재 이 기능을 사용하는 애플리케이션은 수정하세요.

콜드 데이터를 별도 테이블에 저장하는 경우 전체 테이블을 마이그레이션하도록 Stretch Database를 구성할 수 있습니다. 반면, 테이블에 핫 데이터와 콜드 데이터가 모두 포함된 경우 필터 조건자를 지정하여 마이그레이션할 행을 선택할 수 있습니다. 필터 조건자는 인라인 테이블 반환 함수입니다. 이 문서에서는 마이그레이션할 행을 선택하는 인라인 테이블 반환 함수를 작성하는 방법을 설명합니다.

중요

제대로 수행되지 않는 필터 함수를 제공하면 데이터 마이그레이션 성능도 저하됩니다. Stretch Database는 CROSS APPLY 연산자를 사용하여 테이블에 필터 함수를 적용합니다.

필터 함수를 지정하지 않으면 전체 테이블이 마이그레이션됩니다.

스트레치에 데이터베이스 사용 마법사를 실행할 때, 전체 테이블을 마이그레이션하거나 마법사에서 필터 함수를 지정할 수 있습니다. 다른 유형의 필터 함수를 사용하여 마이그레이션할 행을 선택하려면 다음 중 하나를 수행합니다.

  • 마법사를 종료하고 ALTER TABLE 문을 실행하여 테이블에 대해 스트레치를 사용하도록 설정하고 필터 함수를 지정합니다.

  • 마법사를 종료한 후 ALTER TABLE 문을 실행하여 필터 함수를 지정합니다.

함수를 추가하는 ALTER TABLE 구문은 이 문서의 뒷부분에서 설명합니다.

필터 함수에 대한 기본 요구 사항

Stretch Database 필터 조건자에서 필요한 인라인 테이블 반환 함수는 다음 예제와 같습니다.

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

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

함수의 매개 변수는 테이블의 열에 대한 식별자여야 합니다.

필터 함수에서 사용하는 열이 삭제되거나 변경되지 않도록 방하려면 스키마 바인딩이 필요합니다.

반환 값

함수에서 비어있지 않은 결과를 반환하면 행을 마이그레이션할 수 있습니다. 그렇지 않으면, 즉 함수에서 결과가 반환되지 않으면 해당 행은 마이그레이션에 적합하지 않습니다.

조건

<조건자>는 하나의 조건으로 구성하거나 AND 논리 연산자와 조인된 여러 조건으로 구성할 수 있습니다.

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

각 조건은 차례로 하나의 기본 조건으로 구성하거나 OR 논리 연산자와 조인된 여러 기본 조건으로 구성할 수 있습니다.

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

기본 조건

기본 조건은 다음 비교 중 하나를 수행할 수 있습니다.

<primitive_condition> ::=
{
<function_parameter> <comparison_operator> constant
| <function_parameter> { IS NULL | IS NOT NULL }
| <function_parameter> IN ( constant [ ,...n ] )
}
  • 함수 매개 변수를 상수 식과 비교합니다. 예들 들어 @column1 < 1000입니다.

    다음 예제에서는 date 열의 값이 2016년 1월 1일 이전인지 확인합니다.

    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 연산자를 함수 매개 변수에 적용합니다.

  • IN 연산자를 사용하여 함수 매개 변수를 상수 값 목록과 비교합니다.

    다음은 shipment_status 열의 값이 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_operator> ::= { < | <= | > | >= | = | <> | != | !< | !> }

상수 식

필터 함수에서 사용하는 상수는 함수를 정의할 때 평가할 수 있는 결정 식일 수 있습니다. 상수 식에 포함될 수 있는 항목은 다음과 같습니다.

  • 리터럴. 예들 들어 N'abc', 123입니다.

  • 대수 식. 예들 들어 123 + 456입니다.

  • 명확한 함수. 예들 들어 SQRT(900)입니다.

  • CAST 또는 CONVERT를 사용하는 결정적 변환. 예들 들어 CONVERT(datetime, '1/1/2016', 101)입니다.

기타 식

BETWEEN 및 NOT BETWEEN 연산자를 동등한 AND 및 OR 식으로 바꾼 후 결과 함수에서 여기서 설명하는 규칙을 준수하는 경우 BETWEEN 및 NOT BETWEEN 연산자를 사용할 수 있습니다.

하위 쿼리 또는 명확하지 않은 함수(예: RAND() 또는 GETDATE())를 사용할 수 없습니다.

테이블에 필터 함수 추가

ALTER TABLE 문을 실행하고 기존 인라인 테이블 반환 함수를 FILTER_PREDICATE 매개 변수 값으로 지정하여 필터 함수를 테이블에 추가합니다. 예시:

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

함수를 조건자로 테이블에 바인딩하면 다음 사항이 적용됩니다.

  • 다음에 데이터 마이그레이션이 수행되면 함수에서 비어있지 않은 값을 반환하는 행만 마이그레이션됩니다.

  • 함수에서 사용하는 열은 스키마에 바인딩됩니다. 이러한 열은 테이블에서 해당 함수를 필터 조건자로 사용하는 한 변경할 수 없습니다.

테이블에서 해당 함수를 필터 조건자로 사용하는 한 인라인 테이블 반환 함수를 삭제할 수 없습니다.

필터 함수의 성능을 향상시키려면 인덱스를 함수에서 사용하는 열에 만듭니다.

열 이름을 필터 함수에 전달

테이블에 필터 함수를 할당할 때 한 부분으로 이루어진 이름을 사용하여 필터 함수에 전달되는 열 이름을 지정합니다. 열 이름을 전달할 때 세 부분으로 이루어진 이름을 지정하면 스트레치 사용 테이블에 대한 후속 쿼리가 실패합니다.

예를 들어 다음 예제와 같이 세 부분으로 구성된 열 이름을 지정하면 문이 성공적으로 실행되지만 테이블에 대한 후속 쿼리는 실패합니다.

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

대신 다음 예제와 같이 한 부분으로 구성된 열 이름을 사용하여 필터 함수를 지정합니다.

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

마법사 실행 후 필터 함수 추가

스트레치에 데이터베이스 사용 마법사에서 만들 수 없는 함수를 사용하려는 경우 마법사를 종료한 후 ALTER TABLE 문을 실행하여 함수를 지정할 수 있습니다. 그러나 함수를 적용하려면 이미 진행 중인 데이터 마이그레이션을 중지하고 마이그레이션된 데이터를 다시 가져와야 합니다. (이 작업이 필요한 이유에 대한 자세한 내용은 기존 필터 함수 바꾸기를 참조하세요.)

  1. 마이그레이션 방향을 반대로 지정하고 이미 마이그레이션된 데이터를 다시 가져옵니다. 이 작업은 시작되면 취소할 수 없습니다. 또한 Azure에서 아웃바운드 데이터 전송(송신) 비용이 발생합니다. 자세한 내용은 Azure 가격 책정 방식을 참조하세요.

    ALTER TABLE [<table name>] SET (
        REMOTE_DATA_ARCHIVE (
            MIGRATION_STATE = INBOUND
    ));
    
  2. 마이그레이션이 완료될 때까지 기다립니다. SQL Server Management Studio에서 Stretch Database 모니터의 상태를 확인하거나 sys.dm_db_rda_migration_status 보기를 쿼리할 수 있습니다. 자세한 내용은 데이터 마이그레이션 모니터링 및 문제 해결 또는 sys.dm_db_rda_migration_status를 참조하세요.

  3. 테이블에 적용하려는 필터 함수를 만듭니다.

  4. 테이블에 함수를 추가하고 Azure로 데이터 마이그레이션을 다시 시작합니다.

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

날짜별로 행 필터링

다음 예제에서는 date 열에 2016년 1월 1일 이전의 값이 포함된 행을 마이그레이션합니다.

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

슬라이딩 윈도우를 사용하여 행 필터링

슬라이딩 윈도우를 사용하여 행을 필터링하려면 필터 함수에 대한 다음 같은 요구 사항을 염두에 두어야 합니다.

  • 함수는 결정적이어야 합니다. 따라서 시간이 지남에 따라 슬라이딩 윈도우를 자동으로 다시 계산하는 함수를 만들 수 없습니다.

  • 이 함수는 스키마 바인딩을 사용합니다. 따라서 단순히 ALTER FUNCTION 을 호출하여 슬라이딩 윈도우를 이동하는 방식으로 함수를 매일 “바로” 업데이트할 수 없습니다.

다음 예제와 같이 systemEndTime 열에 2016년 1월 1일 이전 값이 포함된 행을 마이그레이션하는 필터 함수로 시작합니다.

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

테이블에 필터 함수를 적용합니다.

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

슬라이딩 윈도우를 업데이트하려는 경우에 다음을 수행합니다.

  1. 새 슬라이딩 윈도우를 지정하는 새 함수를 만듭니다. 다음 예제에서는 2016년 1월 1일 대신 2016년 1월 2일 이전의 날짜를 선택합니다.

  2. 다음 예제와 같이 ALTER TABLE을 호출하여 이전 필터 함수를 새 필터 함수로 바꿉니다.

  3. 필요에 따라 DROP FUNCTION을 호출하여 더 이상 사용하지 않는 이전 필터 함수를 삭제합니다. (이 단계는 예제에 표시되어 있지 않습니다.)

BEGIN TRANSACTION
GO

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

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

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

COMMIT;

유효한 필터 함수의 추가 예제

  • 다음 예제에서는 AND 논리 연산자를 사용하여 두 개의 기본 조건을 결합합니다.

    CREATE FUNCTION dbo.fn_stretchpredicate (
        @column1 DATETIME,
        @column2 NVARCHAR(15)
    )
    RETURNS TABLE
        WITH SCHEMABINDING
    AS
    RETURN
    
    SELECT 1 AS is_eligible
    WHERE @column1 < N'20150101'
        AND @column2 IN (
            N'Completed',
            N'Returned',
            N'Cancelled'
        );
    GO
    
    ALTER TABLE table1 SET (
        REMOTE_DATA_ARCHIVE = ON (
      	  FILTER_PREDICATE = dbo.fn_stretchpredicate(DATE, shipment_status),
      	  MIGRATION_STATE = OUTBOUND
    ));
    GO
    
  • 다음 예제에서는 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
    
  • 다음 예제에서는 수학 연산자와 함수를 사용합니다.

    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 연산자를 사용한 것입니다. BETWEEN 및 NOT BETWEEN 연산자를 동등 AND 및 OR 식으로 바꾼 후 결과 함수에서 여기서 설명하는 규칙을 준수하므로 이 사용법은 유효합니다.

    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 식으로 바꾼 후에는 이전 함수가 다음 함수와 같습니다.

    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
    

유효하지 않은 필터 함수의 예제

  • 다음 함수는 비결정적 변환을 포함하므로 유효하지 않습니다.

    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
    
  • 다음 함수는 명확하지 않은 함수 호출을 포함하기 때문에 유효하지 않습니다.

    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
    
  • 다음 함수는 하위 쿼리를 포함하므로 유효하지 않습니다.

    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
    
  • 다음 함수는 함수를 정의할 때 대수 연산자 또는 기본 제공 함수를 사용하는 식이 상수로 계산되어야 하기 때문에 유효하지 않습니다. 대수 식 또는 함수 호출에 열 참조를 포함시킬 수 없습니다.

    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 식으로 바꾼 후 여기서 설명하는 규칙을 위반하므로 유효하지 않습니다.

    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 식으로 바꾼 후에는 이전 함수가 다음 함수와 같습니다. 기본 조건은 OR 논리 연산자만 사용할 수 있으므로 이 함수는 유효하지 않습니다.

    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에서 필터 함수를 적용하는 방법

Stretch Database는 필터 함수를 테이블에 적용하고, CROSS APPLY 연산자를 사용하여 적합한 행을 결정합니다. 예시:

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

함수에서 행에 대해 비어 있지 않은 결과를 반환하면 행을 마이그레이션할 수 있습니다.

기존 필터 함수 바꾸기

이전에 지정한 필터 함수는 ALTER TABLE 문을 다시 실행하고 FILTER_PREDICATE 매개 변수에 대한 새 값을 지정하여 바꿀 수 있습니다. 예시:

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

새 인라인 테이블 반환 함수에는 다음과 같은 요구 사항이 있습니다.

  • 새 함수는 이전 함수보다 덜 제한적이어야 합니다.

  • 이전 함수에 있던 모든 연산자는 새 함수에 있어야 합니다.

  • 새 함수는 이전 함수에 없는 연산자를 포함할 수 없습니다.

  • 연산자 인수의 순서는 변경할 수 없습니다.

  • <, <=, >, >= 비교의 일부인 상수 값만 함수를 덜 제한적으로 만드는 방식으로 변경할 수 있습니다.

유효한 바꾸기 예제

다음 함수가 현재 필터 함수라고 가정합니다.

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

새 날짜 상수(나중의 컷오프 날짜를 지정함)로 인해 함수를 덜 제한적으로 만들므로 다음 함수는 유효한 대체 함수입니다.

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

유효하지 않은 바꾸기의 예제

다음 함수는 새 날짜 상수(이전의 구분 날짜를 지정함)가 함수를 덜 제한적으로 만들지 않으므로 유효한 바꾸기가 아닙니다.

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

비교 연산자 중 하나가 제거되었으므로 다음 함수는 유효한 대체 함수가 아닙니다.

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 논리 연산자가 있는 새 조건이 추가되었으므로 다음 함수는 유효한 대체 함수가 아닙니다.

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

테이블에서 필터 함수 제거

선택한 행이 아니라 전체 테이블을 마이그레이션하려면 FILTER_PREDICATE를 null로 설정하여 기존 함수를 제거합니다. 예시:

ALTER TABLE stretch_table_name

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

필터 함수가 제거되면 테이블의 모든 행을 마이그레이션할 수 있습니다. 따라서 나중에 동일한 테이블에 대해 필터 함수를 지정하려면 먼저 Azure에서 테이블에 대한 모든 원격 데이터를 다시 가져와야 합니다. 이 제한 사항은 새 필터 함수를 제공할 때 마이그레이션에 적합하지 않은 행이 Azure로 이미 마이그레이션된 상황을 방지하기 위한 것입니다.

테이블에 적용된 필터 함수 확인

테이블에 적용된 필터 함수를 확인하려면 sys.remote_data_archive_tables 카탈로그 뷰를 열고 filter_predicate 열의 값을 확인합니다. 값이 null이면 전체 테이블을 보관할 수 있습니다. 자세한 내용은 sys.remote_data_archive_tables(Transact-SQL)를 참조하세요.

필터 함수에 대한 보안 참고 사항

db_owner 권한이 있는 손상된 계정에서 수행할 수 있는 작업은 다음과 같습니다.

  • 많은 양의 서버 리소스를 사용하거나 오랜 기간 동안 대기하여 서비스 거부가 발생하는 테이블 반환 함수를 만들고 적용합니다.

  • 사용자에게 읽기 액세스가 명시적으로 거부된 테이블의 콘텐츠를 유추할 수 있도록 하는 테이블 반환 함수를 만들고 적용합니다.

참고 항목