代码之家  ›  专栏  ›  技术社区  ›  mshwf

如何在不显式使用数据库名称的情况下对数据库启用更改跟踪?

  •  1
  • mshwf  · 技术社区  · 7 年前

    我当前有一个脚本,可以在一个表上进行更改跟踪:

    IF (SELECT COUNT(*) FROM sys.change_tracking_tables WHERE object_id=OBJECT_ID('TB_Styles')) = 0
    Begin
        ALTER TABLE [dbo].[TB_Styles] ENABLE CHANGE_TRACKING  WITH (TRACK_COLUMNS_UPDATED = ON)
    End
    

    它在不同的数据库上工作,直到一个数据库执行时出现错误,指出必须首先在数据库上启用更改跟踪,我不知道这种情况(这是我第一次处理SQL中的更改跟踪)。 所以我在前一个脚本之前添加了这个脚本:

    IF (SELECT COUNT(*) FROM sys.change_tracking_databases WHERE database_id=DB_ID('TailorsDb')) = 0
    Begin
    ALTER DATABASE TailorsDb
    SET CHANGE_TRACKING = ON  
    (CHANGE_RETENTION = 2 DAYS, AUTO_CLEANUP = ON)  
    End
    

    它可以工作,但问题是我显式地使用数据库名(在 IF ALTER 语句),这是不好的,因为这些脚本在不同的计算机上运行,并且数据库名称不能保证相同。

    (*我正在使用 如果 语句以避免脚本意外运行多次时出错)

    1 回复  |  直到 7 年前
        1
  •  4
  •   M.Ali    7 年前

    更改代码以使用系统功能 B_NAME() 而不是硬编码数据库名称。

    Declare @DBNAME SYSNAME = DB_NAME()
          , @Sql    NVARCHAR(MAX);
    
    IF (SELECT COUNT(*) FROM sys.change_tracking_databases WHERE database_id=DB_ID(@DBNAME)) = 0
    Begin
        SET @Sql = N'   ALTER DATABASE '+  QUOTENAME(@DBNAME) + N'
                        SET CHANGE_TRACKING = ON  
                        (CHANGE_RETENTION = 2 DAYS, AUTO_CLEANUP = ON) '
    
        Exec sp_executesql  @Sql
    End
    
    
    IF (SELECT COUNT(*) FROM sys.change_tracking_tables WHERE object_id=OBJECT_ID('TB_Styles')) = 0
    Begin
        ALTER TABLE [dbo].[TB_Styles] ENABLE CHANGE_TRACKING  WITH (TRACK_COLUMNS_UPDATED = ON)
    En
    

    另外,我不想使用count(*)=0,而是使用类似exists运算符的东西,它更干净。

    Declare @DBNAME SYSNAME = DB_NAME()
          , @Sql    NVARCHAR(MAX);
    
    
    IF NOT EXISTS (SELECT 1 
                   FROM sys.change_tracking_databases 
                   WHERE database_id = DB_ID(@DBNAME))
    Begin
        SET @Sql = N'   ALTER DATABASE '+  QUOTENAME(@DBNAME) + N'
                        SET CHANGE_TRACKING = ON  
                        (CHANGE_RETENTION = 2 DAYS, AUTO_CLEANUP = ON) '
    
        Exec sp_executesql  @Sql
    End
    
    
    IF NOT EXISTS ( SELECT 1
                    FROM sys.change_tracking_tables 
                    WHERE object_id = OBJECT_ID('TB_Styles'))
    Begin
        ALTER TABLE [dbo].[TB_Styles] 
            ENABLE CHANGE_TRACKING  WITH (TRACK_COLUMNS_UPDATED = ON)
    End