【问题标题】:Enable change tracking on all tables in database对数据库中的所有表启用更改跟踪
【发布时间】:2015-02-25 20:57:49
【问题描述】:

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

【问题讨论】:

    标签: sql-server tsql change-tracking


    【解决方案1】:

    您可以使用以下 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]
    

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      【解决方案3】:
      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
      

      【讨论】:

        猜你喜欢
        • 2021-12-24
        • 1970-01-01
        • 1970-01-01
        • 2018-07-07
        • 1970-01-01
        • 1970-01-01
        • 2023-03-18
        • 2011-08-15
        • 1970-01-01
        相关资源
        最近更新 更多