在数据库中的所有表上启用更改跟踪

时间:2015-02-25 20:57:50

标签: sql-server tsql change-tracking

假设在SQL Server数据库上启用了更改跟踪,如何在数据库中的所有表上启用更改跟踪?

3 个答案:

答案 0 :(得分:9)

您可以使用以下T-SQL脚本生成另一个T-SQL脚本,该脚本在具有主键的所有表上启用CHANGE TRACKING功能:

-- Step #1: Execute below script having [Results to text] option selected (Ctrl + T)
SET NOCOUNT ON;
GO    

-- Is CHANGE TRACKING enabled at database level ?
IF CONVERT(INT, PARSENAME(CONVERT(NVARCHAR(128), SERVERPROPERTY('ProductVersion')), 4)) >= 10 -- 10 = SQL2008
BEGIN
    EXEC sp_executesql N'SELECT * FROM sys.change_tracking_databases db WHERE db.database_id = DB_ID(); ' -- sys.change_tracking_databases is available in SQL2008+
    IF @@ROWCOUNT = 0
    BEGIN 
        RAISERROR('CHANGE TRACKING is not enabled at database level.', 16, 1);
        RETURN;
    END
END

-- It generates the final T-SQL script
SELECT    N'PRINT ''Enable CHANGE_TRACKING on ' + full_table_name + ''';'
        + N'ALTER TABLE ' + full_table_name + N' ENABLE CHANGE_TRACKING' + CHAR(13) + CHAR(10) 
        + N'GO'
FROM (
    SELECT  QUOTENAME(s.name) + '.' + QUOTENAME(t.name) AS full_table_name,
            s.name AS schema_name, t.name AS table_name
    FROM    sys.key_constraints x
    JOIN    sys.tables t ON x.parent_object_id = t.object_id
    JOIN    sys.schemas s ON t.schema_id = s.schema_id 
    WHERE   x.[type] = 'PK'
) y
ORDER BY schema_name, table_name

结果标签:

PRINT 'Enable CHANGE_TRACKING on [dbo].[Documents]';ALTER TABLE [dbo].[Documents] ENABLE CHANGE_TRACKING
GO
PRINT 'Enable CHANGE_TRACKING on [dbo].[Events]';ALTER TABLE [dbo].[Events] ENABLE CHANGE_TRACKING
GO
PRINT 'Enable CHANGE_TRACKING on [dbo].[Names]';ALTER TABLE [dbo].[Names] ENABLE CHANGE_TRACKING
GO

步骤2:从[结果]选项卡中选择所有文本,复制文本,打开新查询窗口(Ctrl + N),粘贴并执行此脚本。

结果标签:

Enable CHANGE_TRACKING on [dbo].[Documents]
Enable CHANGE_TRACKING on [dbo].[Events]
Enable CHANGE_TRACKING on [dbo].[Names]

答案 1 :(得分:3)

以下脚本将启用所有数据库表的更改跟踪:

-- This script enables change tracking on all tables with primary keys.
declare @pkTables as table (name nvarchar(1000));
insert into @pkTables (name)
select distinct tc.TABLE_NAME as name
from INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc
join INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE ccu ON tc.CONSTRAINT_NAME = ccu.Constraint_name
where tc.CONSTRAINT_TYPE = 'Primary Key'

-- Keep track of how many tables we are dealing with
declare @enabled int
declare @alreadyEnabled int
set @enabled = 0
set @alreadyEnabled = 0
select count(*) as tablesWithPrimaryKeys from @pkTables

-- For each table name in primary key tables
declare @tableName nvarchar(1000)
while exists (select * from @pkTables)
begin
  -- Set the current table name
  select top 1 @tableName = name from @pkTables order by name asc

  -- Enable change tracking for this table
  if exists(
    select sys.schemas.name as schemaName, sys.tables.name as tableName from sys.change_tracking_tables
    join sys.tables on sys.tables.object_id = sys.change_tracking_tables.object_id
    join sys.schemas on sys.schemas.schema_id = sys.tables.schema_id
    where sys.tables.name = @tableName
  )
  begin
    set @alreadyEnabled = @alreadyEnabled + 1
  end
  else
  begin
    exec('alter table ' + @tableName + ' enable change_tracking')
    set @enabled = @enabled + 1
  end

  -- Delete the current table name
  delete @pkTables where name = @tableName

end

-- enabled + alreadyEnabled must equal tablesWithPrimaryKeys
select @enabled as tablesEnabled, @alreadyEnabled as tablesAlreadyEnabled

答案 2 :(得分:1)

USE [master]

GO

ALTER DATABASE [YOUR_DATABASE] SET CHANGE_TRACKING = ON
    (CHANGE_RETENTION = 2 DAYS, AUTO_CLEANUP = ON)

GO

USE [YOUR_DATABASE]

GO

EXEC sp_msforeachtable "ALTER TABLE ? ENABLE CHANGE_TRACKING WITH(TRACK_COLUMNS_UPDATED = ON)"

GO
相关问题