小编典典

SCOPE_IDENTITY,而不是Insert Trigger解决方法

sql

好的,我有一个没有自然键的表,只有一个整数标识列作为它的主键。我想插入和检索标识值,但也要使用触发器来确保始终设置某些字段。最初,设计是使用而不是插入触发器,但是这样会破坏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触发器失败,则我的插入失败)。这个设计不好吗?如果是这样,为什么呢?


阅读 222

收藏
2021-04-28

共1个答案

小编典典

如您所述,SCOPE_IDENTITY是为这种情况而设计的。与@@ IDENTITY不同,它不受AFTER触发代码的影响。

除了使用存储的proc之外,这还可以。

我使用AFTER触发器进行审计,因为它们很方便…也就是说,在触发器中写入另一个表。

编辑:SQL Server 2005
cam中的SCOPE_IDENTITY和并行性有问题

2021-04-28