好的,我有一个没有自然键的表,只有一个整数标识列作为它的主键。我想插入和检索标识值,但也要使用触发器来确保始终设置某些字段。最初,设计是使用而不是插入触发器,但是这样会破坏scope_identity。insert语句上的输出子句也被而不是insert触发器破坏。因此,我想出了一个替代方案,想知道我打算做的事情是否明显有问题:
开始人为的例子:
CREATE TABLE [dbo].[TestData] ( [TestId] [int] IDENTITY(1,1) PRIMARY KEY NOT NULL, [Name] [nchar](10) NOT NULL) CREATE TABLE [dbo].[TestDataModInfo]( [TestId] [int] PRIMARY KEY NOT NULL, [RowCreateDate] [datetime] NOT NULL) ALTER TABLE [dbo].[TestDataModInfo] WITH CHECK ADD CONSTRAINT [FK_TestDataModInfo_TestData] FOREIGN KEY([TestId]) REFERENCES [dbo].[TestData] ([TestId]) ON DELETE CASCADE CREATE TRIGGER [dbo].[TestData$AfterInsert] ON [dbo].[TestData] AFTER INSERT AS BEGIN -- SET NOCOUNT ON added to prevent extra result sets from -- interfering with SELECT statements. SET NOCOUNT ON; INSERT INTO [dbo].[TestDataModInfo] ([TestId], [RowCreateDate]) SELECT [TestId], current_timestamp FROM inserted -- Insert statements for trigger here END
结束人为的例子。
不,我不是在一个小日期字段上执行此操作-只是一个示例。
我要确保设置的字段已移至单独的表(在TestDataModInfo中),并且触发器确保已对其进行更新。此方法有效,它允许我在插入后使用scope_identity(),并且看起来很安全(如果我的after触发器失败,则我的插入失败)。这个设计不好吗?如果是这样,为什么呢?
如您所述,SCOPE_IDENTITY是为这种情况而设计的。与@@ IDENTITY不同,它不受AFTER触发代码的影响。
除了使用存储的proc之外,这还可以。
我使用AFTER触发器进行审计,因为它们很方便…也就是说,在触发器中写入另一个表。
编辑:SQL Server 2005 cam中的SCOPE_IDENTITY和并行性有问题