Povolení a zakázání zachytávání dat změn
platí pro:SQL Server
azure SQL Managed Instance
Tento článek popisuje, jak povolit a zakázat zachytávání dat změn (CDC) pro databázi a tabulku pro SQL Server a spravovanou instanci Azure SQL. Informace o službě Azure SQL Database najdete v tématu CDC se službou Azure SQL Database.
Dovolení
K povolení nebo zakázání zachytávání dat změn v SQL Serveru a azure SQL Managed Instance se vyžadují sysadmin
oprávnění.
Povolení pro databázi
Než budete moct vytvořit instanci zachycení pro jednotlivé tabulky, musíte pro databázi povolit zachytávání dat změn.
Pokud chcete povolit zachytávání dat změn, spusťte uloženou proceduru sys.sp_cdc_enable_db (Transact-SQL) v kontextu databáze. Pokud chcete zjistit, jestli už databáze má povolenou službu CDC, zadejte dotaz na sloupec is_cdc_enabled v zobrazení katalogu sys.databases
.
Pokud má databáze povolené zachytávání dat změn, vytvoří se pro databázi schéma cdc, uživatel cdc, tabulky metadat a další systémové objekty. Schéma cdc obsahuje tabulky metadat pro zachytávání změn dat a poté, co jsou zdrojové tabulky povoleny pro tuto funkci, slouží jednotlivé tabulky změn jako úložiště pro data změn. Schéma cdc obsahuje také přidružené systémové funkce používané k dotazování na data změn.
Zachytávání dat změn vyžaduje výhradní použití schématu cdc a uživatele cdc . Pokud v databázi aktuálně existuje schéma nebo databázový uživatel s názvem cdc, nebude možné pro databázi povolit zachytávání dat změn, dokud se schéma nebo uživatel neodstraní nebo nepřejmenuje.
-- ====
-- Enable Database for CDC
-- ====
USE MyDB
GO
EXEC sys.sp_cdc_enable_db
GO
Poznámka
Pokud chcete najít šablony související s CDC v aplikaci SQL Server Management Studio, přejděte na Zobrazení, vyberte Průzkumník šablona pak vyberte šablony SQL Serveru. Change Data Capture je podsložka, která obsahuje šablony.
Zakázat pro databázi
Pomocí sys.sp_cdc_disable_db (Transact-SQL) v kontextu databáze zakažte zachytávání dat změn pro databázi. Není nutné zakázat CDC pro jednotlivé tabulky předtím, než zakážete CDC pro databázi. Zakázání CDC pro databázi odebere všechna přidružená metadata zachytávání dat změn, včetně cdc uživatele, schématu a úloh zachytávání dat změn. Jakékoliv role vytvořené CDC se ale neodeberou automaticky a musí se explicitně odstranit. Pokud chcete zjistit, jestli má databáze povolenou službu CDC, zadejte dotaz na sloupec is_cdc_enabled v zobrazení katalogu sys.databases
.
Pokud dojde k vyřazení databáze s podporou CDC, úlohy zachytávání dat změn se automaticky odeberou.
-- Disable Database for change data capture
USE MyDB
GO
EXEC sys.sp_cdc_disable_db
GO
Povolení pro tabulku
Po povolení zachytávání dat změn mohou členové db_owner pevné databázové role vytvořit instanci zachycení pro jednotlivé zdrojové tabulky pomocí uložené procedury sys.sp_cdc_enable_table
. Pokud chcete zjistit, jestli je pro zachytávání dat změn povolená zdrojová tabulka, projděte si sloupec is_tracked_by_cdc v zobrazení katalogu sys.tables
.
Důležitý
Více informací o argumentech uložené procedury sys.sp_cdc_enable_table
naleznete v systému sys.sp_cdc_enable_table (Transact-SQL).
Při vytváření instance zachycení je možné zadat následující možnosti:
sloupce ve zdrojové tabulce, které mají být zachyceny.
Ve výchozím nastavení jsou všechny sloupce ve zdrojové tabulce označené jako zachycené sloupce. Pokud je potřeba sledovat jenom podmnožinu sloupců, například z důvodu ochrany osobních údajů nebo výkonu, použijte parametr @captured_column_list k určení podmnožinu sloupců.
skupinu souborů, která bude obsahovat tabulku změn.
Ve výchozím nastavení se tabulka změn nachází ve výchozí skupině souborů databáze. Vlastníci databáze, kteří chtějí řídit umístění jednotlivých tabulek změn, mohou pomocí parametru @filegroup_name určit konkrétní skupinu souborů pro tabulku změn přidruženou k instanci zachycení. Pojmenovaná skupina souborů už musí existovat. Obecně se doporučuje umístit tabulky do skupiny souborů oddělené od zdrojových tabulek. Podívejte se na Enable a Table Specifying Filegroup Option šablonu pro příklad, který ukazuje použití parametru @filegroup_name.
-- Enable CDC for a table specifying filegroup
USE MyDB
GO
EXEC sys.sp_cdc_enable_table
@source_schema = N'dbo',
@source_name = N'MyTable',
@role_name = N'MyRole',
@filegroup_name = N'MyDB_CT',
@supports_net_changes = 1
GO
Role pro řízení přístupu k tabulce změn.
Účelem pojmenované role je řídit přístup k datům změny. Zadaná role může být existující pevná role serveru nebo role databáze. Pokud zadaná role ještě neexistuje, vytvoří se automaticky role databáze tohoto názvu. Uživatelé musí mít oprávnění SELECT pro všechny zachycené sloupce zdrojové tabulky. Kromě toho, pokud je zadána role, uživatelé, kteří nejsou členy správce systému nebo db_owner role, musí být také členy zadané role.
Pokud nechcete používat roli gating, explicitně nastavte parametr @role_name na hodnotu NULL. Podívejte se na šablonu Povolit tabulku bez použití role gating, která poskytuje příklad povolení tabulky bez gating role.
-- Enable CDC for a table using a gating role option
USE MyDB
GO
EXEC sys.sp_cdc_enable_table
@source_schema = N'dbo',
@source_name = N'MyTable',
@role_name = NULL,
@supports_net_changes = 1
GO
funkce pro zjišťování čistých změn.
Instance zachycení vždy obsahuje funkci s hodnotou tabulky (TVF) pro vrácení všech položek tabulky změn, ke kterým došlo v definovaném intervalu. Tato funkce je pojmenována tak, že k názvu instance zachycení připojíte `cdc.fn_cdc_get_all_changes_`. Další informace naleznete v tématu cdc.fn_cdc_get_all_changes_<capture_instance> (Transact-SQL).
Pokud je parametr @supports_net_changes nastaven na hodnotu 1, pro instanci zachycení se vygeneruje také funkce net changes. Tato funkce vrátí pouze jednu změnu pro každý samostatný řádek změněný v intervalu zadaném ve volání. Další informace naleznete v tématu cdc.fn_cdc_get_net_changes_<capture_instance> (Transact-SQL).
Aby bylo možné podporovat dotazy net changes, musí mít zdrojová tabulka primární klíč nebo jedinečný index, aby bylo možné jednoznačně identifikovat řádky. Pokud se použije jedinečný index, je nutné zadat název indexu pomocí parametru @index_name. Sloupce definované v primárním klíči nebo jedinečném indexu musí být zahrnuty do seznamu zdrojových sloupců, které se mají zaznamenat.
Příklad znázorňující vytvoření instance zachytávání pomocí obou funkcí dotazu najdete v šabloně Povolení tabulky pro všechny dotazy a dotazy pro čisté změny.
-- Enable CDC for a table for all and net changes queries
USE MyDB
GO
EXEC sys.sp_cdc_enable_table
@source_schema = N'dbo',
@source_name = N'MyTable',
@role_name = N'MyRole',
@supports_net_changes = 1
GO
Poznámka
Pokud je pro tabulku s existujícím primárním klíčem povolen záznam dat změn a parametr @index_name se nepoužívá k identifikaci alternativního jedinečného indexu, funkce zachytávání dat změn používá primární klíč. Následné změny primárního klíče nejsou povoleny, aniž byste napřed zakázali zachytávání dat změn pro tabulku. To platí bez ohledu na to, jestli byla při konfiguraci zachytávání dat změn požadována podpora dotazů na net changes. Pokud v tabulce není v době, kdy je povolen pro zachytávání dat změn žádný primární klíč, bude následné přidání primárního klíče ignorováno zachytáváním dat změn. Vzhledem k tomu, že zachytávání dat změn nebude používat primární klíč, který se vytvoří po povolení tabulky, je možné odebrat klíčové a klíčové sloupce bez omezení.
Zakázání tabulky
Členové db_owner pevné databázové role mohou odebrat instanci zachycení pro jednotlivé zdrojové tabulky pomocí uložené procedury sys.sp_cdc_disable_table
. Pokud chcete zjistit, jestli je zdrojová tabulka aktuálně povolená pro zachytávání dat změn, projděte si sloupec is_tracked_by_cdc
v zobrazení katalogu sys.tables
. Pokud po zakázání nejsou pro databázi povolené žádné tabulky, odeberou se také úlohy zachytávání dat změn.
Pokud dojde k vyřazení tabulky s povoleným zachycením dat změn, odeberou se automaticky metadata zachytávání dat, která jsou přidružená k tabulce.
Podívejte se na šablonu Zakázat instanci zachycení pro tabulku, která je příkladem deaktivace instance pro tabulku.
-- Disable a Capture Instance for a table
USE MyDB
GO
EXEC sys.sp_cdc_disable_table
@source_schema = N'dbo',
@source_name = N'MyTable',
@capture_instance = N'dbo_MyTable'
GO