如何在不显式使用数据库名称的情况下对数据库启用更改跟踪?
How to enable change tracking on a database without explicitly using its name?
我目前有这个脚本可以在一个 table:
上启用更改跟踪
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
语句中),这不好,因为这些脚本是 运行在不同的机器上,数据库名称不保证相同。
(*我使用 IF
语句来避免脚本意外 运行 多次时出现错误)
更改您的代码以使用系统函数 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
我目前有这个脚本可以在一个 table:
上启用更改跟踪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
语句中),这不好,因为这些脚本是 运行在不同的机器上,数据库名称不保证相同。
(*我使用 IF
语句来避免脚本意外 运行 多次时出现错误)
更改您的代码以使用系统函数 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