Общий триггер, который обновляет таблицу Master / Detail - PullRequest
0 голосов
/ 17 апреля 2019

Мне было поручено создать общий триггер (который будет работать со всеми таблицами в моей базе данных), который будет запускаться при вставке, удалении и обновлении, чтобы фиксировать изменения, сделанные в таблице.

У меня есть 2 новые таблицы: главная таблица ...

CREATE TABLE [dbo].[DATA_HIL_Master](
   [MasterId] [int] IDENTITY(1,1) NOT NULL,
   [ReferenceTable] [nvarchar](100) NULL,
   [ReferenceId] [int] NULL,
   [OperationType] [smallint] NULL,
   [Last_UserId_Log] [int] NULL,
   [Last_WorkstationId_Log] [int] NULL,
   [Last_DateTime_Log] [datetime] NULL,   PRIMARY KEY CLUSTERED     (
   [MasterId] ASC    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,     ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS
= ON) ON [PRIMARY]
) ON [PRIMARY]    GO

А затем таблица подробностей ...

CREATE TABLE [dbo].[DATA_HIL_Detail](
   [DetailId] [int] IDENTITY(1,1) NOT NULL,
   [MasterId] [int] NOT NULL,
   [ColumnName] [nvarchar](100) NULL,
   [OriginalValue] [nvarchar](max) NULL,
   [ModifiedValue] [nvarchar](max) NULL,
PRIMARY KEY CLUSTERED     (
     [DetailId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY =     OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]    ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]    GO

Мой триггер должен иметь возможность обновлять эти таблицы с правильнымиинформация для этого обновления и таблицы.Для Экземпляра у меня есть другая таблица.

 CREATE TABLE [dbo].[CNF_Tax2Package](
     [Tax2PackageId] [int] IDENTITY(1,1) NOT NULL,
     [TaxPackageId] [int] NOT NULL,
     [TaxId] [int] NOT NULL,
     [Last_UserId_Log] [int] NULL,
     [Last_WorkstationId_Log] [int] NULL,
     [Last_DateTime_Log] [datetime] NULL,
 PRIMARY KEY CLUSTERED 
 (
         [Tax2PackageId] ASC
 )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = 
  OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY],
 UNIQUE NONCLUSTERED 
(
    [Tax2PackageId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = 
OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO

EveryTime изменение записи в этой таблице CNF_Tax2Package. Мне нужно дополнить таблицы истории информацией

Я выполняю следующую инструкцию UPdate

   Update CNF_Tax2Package
      set TaxPackageid = 1,
       Last_UserID_Log = 1098,
       Last_WorkstationID_Log = 77,
       Last_DateTime_Log = Getdate()
     where Tax2PackageID = 2]

Я бы вставил в DATA_HIL_Master строку со следующей информацией

         [MasterId] = (NEWMasterID)     [ReferenceTable] = 'CNF_Tax2Package'    [ReferenceId] = 2                 ---This is the primary Key of the 
                                      ---table updated.     [OperationType] = 'Update'  [Last_UserId_Log] = 1098    [Last_WorkstationId_Log] = 77   [Last_DateTime_Log] getdate()

Затем я бы вставил в DATA_HIL_Detail следующие строки.

[DetailId] = (NEWID)    [MasterId] = (NEWMasterID) (From above)     [ColumnName] = 'TaxPackageid'   [OriginalValue] = '19'  [ModifiedValue] = '1'

[DetailId] = (NEWID)    [MasterId] = (NEWMasterID) (From above)     [ColumnName] = 'Last_UserID_Log'    [OriginalValue] = '1954'    [ModifiedValue] = '1098'

[DetailId] = (NEWID)    [MasterId] = (NEWMasterID) (From above)     [ColumnName] = 'Last_WorkstationId_Log'     [OriginalValue] = '55'  [ModifiedValue] = '77'

[DetailId] = (NEWID)    [MasterId] = (NEWMasterID) (From above)     [ColumnName] = 'Last_DateTime_Log'  [OriginalValue] = '2018-08-18   [ModifiedValue] = getdate()

Понимая, чтотриггер должен быть достаточно универсальным, чтобы обрабатывать все таблицы в моей базе данных с разными столбцами, разными первичными ключами

...