常规触发器,用于更新主/明细表

时间:2019-04-17 14:54:23

标签: sql-server tsql database-trigger

我的任务是创建一个通用触发器(一个触发器将对数据库中的所有表起作用),该触发器将在插入,删除和更新时触发以捕获对表所做的更改。

我有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

每次在此CNF_Tax2Package表中更改一条记录时,我都需要使用信息来更新History表

我执行以下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()

理解触发器必须足够通用,才能处理数据库中具有不同列,不同主键的所有表

0 个答案:

没有答案