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

msh*_*hwf 1 sql t-sql sql-server change-tracking

我目前正在使用此脚本,可以在一张表上启用更改跟踪:

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
Run Code Online (Sandbox Code Playgroud)

它在不同的数据库上工作,直到一个数据库执行时出现错误,指出必须首先在数据库上启用更改跟踪,我不知道这种情况(这是我第一次在 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
Run Code Online (Sandbox Code Playgroud)

它正在工作,但问题是我明确使用了数据库名称(inIFALTERstatements),这不好,因为这些脚本在不同的机器上运行,并且不能保证数据库名称相同。

(*IF当脚本意外运行不止一次时,我使用语句来避免错误)

M.A*_*Ali 6

更改您的代码以使用系统函数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
Run Code Online (Sandbox Code Playgroud)

此外,我会使用类似 Exists 运算符之类的东西,而不是使用 count(*) = 0,它更简洁。

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
Run Code Online (Sandbox Code Playgroud)