Как включить отслеживание изменений в базе данных без явного использования ее имени? - PullRequest
0 голосов
/ 30 мая 2018

В настоящее время у меня есть этот скрипт, который позволяет отслеживать изменения для одной таблицы:

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, чтобы избежать ошибок при случайном запуске сценария более одного раза)

1 Ответ

0 голосов
/ 30 мая 2018

Измените свой код, чтобы использовать системную функцию 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
...