Tsql 在触发器中动态检索复合主键值

Tsql 在触发器中动态检索复合主键值,tsql,triggers,sql-server-2014,Tsql,Triggers,Sql Server 2014,我有大约100个表的数据库,我需要在所有这些表上实现插入、更新和删除等操作的日志 我决定使用触发器作为日志记录机制,我的问题是动态获取构成主键的列的值(一些主键是identity,一些是由两列组成的复合键) 我知道这可以通过动态SQL实现,但我在问我自己,现在甚至是你们,是否有可能在触发器定义中以某种方式避免动态SQL 因此,我的日志表如下所示: CREATE TABLE [dbo].[HistoryTable]( [HistoryTable] [int] IDENTITY(1,1) N

我有大约100个表的数据库,我需要在所有这些表上实现插入、更新和删除等操作的日志

我决定使用触发器作为日志记录机制,我的问题是动态获取构成主键的列的值(一些主键是identity,一些是由两列组成的复合键)

我知道这可以通过动态SQL实现,但我在问我自己,现在甚至是你们,是否有可能在触发器定义中以某种方式避免动态SQL

因此,我的日志表如下所示:

CREATE TABLE [dbo].[HistoryTable](
    [HistoryTable] [int] IDENTITY(1,1) NOT NULL,
    [PKValues] [varchar](50) NOT NULL,
    [AllValues] [nvarchar](500) NOT NULL,
)
所以,若表由复合主键组成,那个么受insert、update或delete操作影响的列的值必须是一个值,值之间用逗号或分号分隔:

PKValues    AllValues

1;1         <row columnId1=1 columnId2=1 Title="test" />
1;2         <row columnId1=1 columnId2=2 Title="test2" />
1           <row columnId1=1 Title="test3" />
...
PKValues所有值
1.1.
1.2.
1.
...

示例中的前两行是来自复合主键的表,第三行是以单个标识列为主键的表。

如果您在SQLServer的“88R2”或更高版本上,您可能需要考虑CDC:如果不知道列名,则不能使用它们而不使用<代码>动态SQL >,当然,出现异常
选择*
。我最好为这100个表自动生成触发器,而不是创建一个通用触发器。