Pilih baris yang dimigrasikan dengan menggunakan fungsi filter (Stretch Database)

Berlaku untuk: SQL Server 2016 (13.x) dan yang lebih baru - Hanya Windows

Penting

Stretch Database tidak digunakan lagi di SQL Server 2022 (16.x) dan Azure SQL Database. Fitur ini akan dihapus dalam versi Mesin Database di masa mendatang. Hindari menggunakan fitur ini dalam pekerjaan pengembangan baru, dan rencanakan untuk memodifikasi aplikasi yang saat ini menggunakan fitur ini.

Jika Anda menyimpan data dingin dalam tabel terpisah, Anda dapat mengonfigurasi Stretch Database untuk memigrasikan seluruh tabel. Jika tabel Anda berisi data panas dan dingin, di sisi lain, Anda dapat menentukan predikat filter untuk memilih baris yang akan dimigrasikan. Predikat filter adalah fungsi bernilai tabel sebaris. Artikel ini menjelaskan cara menulis fungsi bernilai tabel sebaris untuk memilih baris yang akan dimigrasikan.

Penting

Jika Anda menyediakan fungsi filter yang berkinerja buruk, migrasi data juga berkinerja buruk. Stretch Database menerapkan fungsi filter ke tabel dengan menggunakan operator CROSS APPLY.

Jika Anda tidak menentukan fungsi filter, seluruh tabel akan dimigrasikan.

Saat Menjalankan Panduan Aktifkan Database untuk Stretch, Anda bisa memigrasikan seluruh tabel, atau Anda bisa menentukan fungsi filter dalam wizard. Jika Anda ingin menggunakan jenis fungsi filter yang berbeda untuk memilih baris yang akan dimigrasikan, lakukan salah satu hal berikut ini.

  • Keluar dari wizard dan jalankan pernyataan ALTER TABLE untuk mengaktifkan Stretch untuk tabel dan untuk menentukan fungsi filter.

  • Jalankan pernyataan ALTER TABLE untuk menentukan fungsi filter setelah Anda keluar dari wizard.

Sintaks ALTER TABLE untuk menambahkan fungsi dijelaskan nanti dalam artikel ini.

Persyaratan dasar untuk fungsi filter

Fungsi bernilai tabel sebaris yang diperlukan untuk predikat filter Stretch Database terlihat seperti contoh berikut.

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

Parameter untuk fungsi harus menjadi pengidentifikasi untuk kolom dari tabel.

Pengikatan skema diperlukan untuk mencegah kolom yang digunakan oleh fungsi filter dihilangkan atau diubah.

Nilai hasil

Jika fungsi mengembalikan hasil yang tidak kosong, baris memenuhi syarat untuk dimigrasikan. Jika tidak - artinya, jika fungsi tidak mengembalikan hasil - baris tidak memenuhi syarat untuk dimigrasikan.

Kondisi

<Predikat> dapat terdiri dari satu kondisi, atau dari beberapa kondisi yang bergabung dengan operator logis AND.

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

Setiap kondisi pada gilirannya dapat terdiri dari satu kondisi primitif, atau beberapa kondisi primitif yang bergabung dengan operator logis OR.

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

Kondisi primitif

Kondisi primitif dapat melakukan salah satu perbandingan berikut.

<primitive_condition> ::=
{
<function_parameter> <comparison_operator> constant
| <function_parameter> { IS NULL | IS NOT NULL }
| <function_parameter> IN ( constant [ ,...n ] )
}
  • Bandingkan parameter fungsi dengan ekspresi konstanta. Contohnya, @column1 < 1000.

    Contoh berikut memeriksa apakah nilai kolom tanggal kurang dari 1 Januari 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
    ));
    
  • Terapkan operator IS NULL atau IS NOT NULL ke parameter fungsi.

  • Gunakan operator IN untuk membandingkan parameter fungsi dengan daftar nilai konstanta.

    Contoh berikut memeriksa apakah nilai kolom shipment_status adalah 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
    ));
    

Operator perbandingan

Operator perbandingan berikut didukung.

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

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

Ekspresi konstanta

Konstanta yang Anda gunakan dalam fungsi filter dapat berupa ekspresi deterministik apa pun yang dapat dievaluasi saat Anda menentukan fungsi. Ekspresi konstanta dapat berisi hal-hal berikut.

  • Harfiah. Contohnya, N'abc', 123.

  • Ekspresi aljabar. Contohnya, 123 + 456.

  • Fungsi deterministik. Contohnya, SQRT(900).

  • Konversi deterministik yang menggunakan CAST atau CONVERT. Contohnya, CONVERT(datetime, '1/1/2016', 101).

Ekspresi lain

Anda dapat menggunakan operator ANTARA dan NOT BETWEEN jika fungsi yang dihasilkan sesuai dengan aturan yang dijelaskan di sini setelah Anda mengganti operator ANTARA dan BUKAN ANTARA dengan ekspresi AND dan OR yang setara.

Anda tidak dapat menggunakan subkueri atau fungsi non-deterministik seperti RAND() atau GETDATE().

Menambahkan fungsi filter ke tabel

Tambahkan fungsi filter ke tabel dengan menjalankan pernyataan ALTER TABLE dan tentukan fungsi bernilai tabel sebaris yang ada sebagai nilai parameter FILTER_PREDICATE . Contohnya:

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

Setelah Anda mengikat fungsi ke tabel sebagai predikat, hal-hal berikut benar.

  • Lain kali migrasi data terjadi, hanya baris yang fungsinya mengembalikan nilai yang tidak kosong yang dimigrasikan.

  • Kolom yang digunakan oleh fungsi terikat skema. Anda tidak dapat mengubah kolom ini selama tabel menggunakan fungsi sebagai predikat filternya.

Anda tidak dapat menghilangkan fungsi bernilai tabel sebaris selama tabel menggunakan fungsi sebagai predikat filternya.

Untuk meningkatkan performa fungsi filter, buat indeks pada kolom yang digunakan oleh fungsi .

Meneruskan nama kolom ke fungsi filter

Saat Anda menetapkan fungsi filter ke tabel, tentukan nama kolom yang diteruskan ke fungsi filter dengan nama satu bagian. Jika Anda menentukan nama tiga bagian saat Anda meneruskan nama kolom, kueri berikutnya terhadap tabel yang diaktifkan Stretch akan gagal.

Misalnya, jika Anda menentukan nama kolom tiga bagian seperti yang ditunjukkan dalam contoh berikut, pernyataan akan berjalan dengan sukses, tetapi kueri berikutnya terhadap tabel akan gagal.

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

Sebagai gantinya, tentukan fungsi filter dengan nama kolom satu bagian seperti yang diperlihatkan dalam contoh berikut.

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

Menambahkan fungsi filter setelah menjalankan Wizard

Jika Anda ingin menggunakan fungsi yang tidak bisa Anda buat di Wizard Aktifkan Database untuk Stretch , Anda bisa menjalankan pernyataan ALTER TABLE untuk menentukan fungsi setelah Anda keluar dari wizard. Namun, sebelum dapat menerapkan fungsi, Anda harus menghentikan migrasi data yang sudah berlangsung dan mengembalikan data yang dimigrasikan. (Untuk informasi selengkapnya tentang mengapa hal ini diperlukan, lihat Ganti fungsi filter yang ada.)

  1. Balik arah migrasi dan kembalikan data yang sudah dimigrasikan. Anda tidak dapat membatalkan operasi ini setelah operasi dimulai. Anda juga dikenakan biaya di Azure untuk transfer data keluar (keluar). Untuk informasi selengkapnya, lihat Cara kerja harga Azure.

    ALTER TABLE [<table name>] SET (
        REMOTE_DATA_ARCHIVE (
            MIGRATION_STATE = INBOUND
    ));
    
  2. Tunggu hingga migrasi selesai. Anda dapat memeriksa status di Stretch Database Monitor dari SQL Server Management Studio, atau Anda bisa mengkueri sys.dm_db_rda_migration_status tampilan. Untuk informasi selengkapnya, lihat Memantau dan memecahkan masalah migrasi data atau sys.dm_db_rda_migration_status.

  3. Buat fungsi filter yang ingin Anda terapkan ke tabel.

  4. Tambahkan fungsi ke tabel dan mulai ulang migrasi data ke 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
    ));
    

Memfilter baris menurut tanggal

Contoh berikut memigrasikan baris di mana kolom tanggal berisi nilai yang lebih awal dari 1 Januari 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

Memfilter baris menurut nilai dalam kolom status

Contoh berikut memigrasikan baris di mana kolom status berisi salah satu nilai yang ditentukan.

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

Memfilter baris dengan menggunakan jendela geser

Untuk memfilter baris dengan menggunakan jendela geser, ingatlah persyaratan berikut untuk fungsi filter.

  • Fungsi harus deterministik. Oleh karena itu, Anda tidak dapat membuat fungsi yang secara otomatis menghitung ulang jendela geser saat waktu berlalu.

  • Fungsi ini menggunakan pengikatan skema. Oleh karena itu Anda tidak bisa hanya memperbarui fungsi "di tempat" setiap hari dengan memanggil ALTER FUNCTION untuk memindahkan jendela geser.

Mulailah dengan fungsi filter seperti contoh berikut, yang memigrasikan baris di mana kolom systemEndTime berisi nilai yang lebih awal dari 1 Januari 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);

Terapkan fungsi filter ke tabel.

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

Saat Anda ingin memperbarui jendela geser, lakukan hal-hal berikut.

  1. Buat fungsi baru yang menentukan jendela geser baru. Contoh berikut memilih tanggal yang lebih awal dari 2 Januari 2016, bukan 1 Januari 2016.

  2. Ganti fungsi filter sebelumnya dengan yang baru dengan memanggil ALTER TABLE, seperti yang diperlihatkan dalam contoh berikut.

  3. Secara opsional, hilangkan fungsi filter sebelumnya yang tidak lagi Anda gunakan dengan memanggil DROP FUNCTION. (Langkah ini tidak ditampilkan dalam contoh.)

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;

Contoh lain dari fungsi filter yang valid

  • Contoh berikut menggabungkan dua kondisi primitif dengan menggunakan operator logis 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
    
  • Contoh berikut menggunakan beberapa kondisi dan konversi deterministik dengan 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
    
  • Contoh berikut menggunakan operator dan fungsi matematika.

    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
    
  • Contoh berikut menggunakan operator BETWEEN dan NOT BETWEEN. Penggunaan ini valid karena fungsi yang dihasilkan sesuai dengan aturan yang dijelaskan di sini setelah Anda mengganti operator ANTARA dan NOT BETWEEN dengan ekspresi AND dan OR yang setara.

    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
    

    Fungsi sebelumnya setara dengan fungsi berikut setelah Anda mengganti operator ANTARA dan NOT BETWEEN dengan ekspresi AND dan OR yang setara.

    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
    

Contoh fungsi filter yang tidak valid

  • Fungsi berikut tidak valid karena berisi konversi non-deterministik.

    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
    
  • Fungsi berikut tidak valid karena berisi panggilan fungsi non-deterministik.

    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
    
  • Fungsi berikut ini tidak valid karena berisi subkueri.

    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
    
  • Fungsi berikut tidak valid karena ekspresi yang menggunakan operator aljabar atau fungsi bawaan harus mengevaluasi ke konstanta saat Anda menentukan fungsi. Anda tidak dapat menyertakan referensi kolom dalam ekspresi aljabar atau panggilan fungsi.

    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
    
  • Fungsi berikut tidak valid karena melanggar aturan yang dijelaskan di sini setelah Anda mengganti operator BETWEEN dengan ekspresi AND yang setara.

    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
    

    Fungsi sebelumnya setara dengan fungsi berikut setelah Anda mengganti operator BETWEEN dengan ekspresi AND yang setara. Fungsi ini tidak valid karena kondisi primitif hanya dapat menggunakan operator logis 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
    

Cara Stretch Database menerapkan fungsi filter

Stretch Database menerapkan fungsi filter ke tabel dan menentukan baris yang memenuhi syarat dengan menggunakan operator CROSS APPLY. Contohnya:

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

Jika fungsi mengembalikan hasil yang tidak kosong untuk baris, baris memenuhi syarat untuk dimigrasikan.

Mengganti fungsi filter yang sudah ada

Anda dapat mengganti fungsi filter yang ditentukan sebelumnya dengan menjalankan pernyataan ALTER TABLE lagi dan menentukan nilai baru untuk parameter FILTER_PREDICATE . Contohnya:

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

Fungsi bernilai tabel sebaris baru memiliki persyaratan berikut.

  • Fungsi baru harus kurang ketat daripada fungsi sebelumnya.

  • Semua operator yang ada di fungsi lama harus ada dalam fungsi baru.

  • Fungsi baru tidak boleh berisi operator yang tidak ada di fungsi lama.

  • Urutan argumen operator tidak dapat berubah.

  • Hanya nilai konstanta yang merupakan bagian dari perbandingan <, <=, >, >= yang dapat diubah dengan cara yang membuat fungsi kurang ketat.

Contoh penggantian yang valid

Asumsikan bahwa fungsi berikut adalah fungsi filter saat ini.

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

Fungsi berikut adalah pengganti yang valid karena konstanta tanggal baru (yang menentukan tanggal cutoff selanjutnya) membuat fungsi kurang ketat.

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

Contoh penggantian yang tidak valid

Fungsi berikut bukan pengganti yang valid karena konstanta tanggal baru (yang menentukan tanggal cutoff sebelumnya) tidak membuat fungsi kurang ketat.

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

Fungsi berikut bukan pengganti yang valid karena salah satu operator perbandingan telah dihapus.

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

Fungsi berikut bukan pengganti yang valid karena kondisi baru telah ditambahkan dengan operator logis 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

Menghapus fungsi filter dari tabel

Untuk memigrasikan seluruh tabel alih-alih baris yang dipilih, hapus fungsi yang ada dengan mengatur FILTER_PREDICATE ke null. Contohnya:

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

Setelah Anda menghapus fungsi filter, semua baris dalam tabel memenuhi syarat untuk migrasi. Akibatnya, Anda tidak dapat menentukan fungsi filter untuk tabel yang sama nanti kecuali Anda mengembalikan semua data jarak jauh untuk tabel dari Azure terlebih dahulu. Pembatasan ini ada untuk menghindari situasi di mana baris yang tidak memenuhi syarat untuk migrasi saat Anda menyediakan fungsi filter baru telah dimigrasikan ke Azure.

Periksa fungsi filter yang diterapkan ke tabel

Untuk memeriksa fungsi filter yang diterapkan ke tabel, buka sys.remote_data_archive_tables tampilan katalog dan periksa nilai kolom filter_predicate. Jika nilai null, seluruh tabel memenuhi syarat untuk pengarsipan. Untuk informasi selengkapnya, lihat sys.remote_data_archive_tables (Transact-SQL).

Catatan keamanan untuk fungsi filter

Akun yang disusupi dengan hak istimewa db_owner dapat melakukan hal-hal berikut.

  • Buat dan terapkan fungsi bernilai tabel yang mengonsumsi sumber daya server dalam jumlah besar atau menunggu periode yang diperpanjang yang mengakibatkan penolakan layanan.

  • Buat dan terapkan fungsi bernilai tabel yang memungkinkan untuk menyimpulkan konten tabel tempat pengguna secara eksplisit ditolak akses bacanya.

Baca juga