当前位置: 首页 > 面试题库 >

SCOPE_IDENTITY,而不是Insert Trigger解决方法

戴霖
2023-03-14
问题内容

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



 类似资料:
  • 问题内容: 我正在尝试执行一个简单的INSERT并返回标识(自动递增主键)。我试过了 我收到以下错误 SQLite是否支持SCOPE_IDENTITY? 如果可以,该如何使用? 如果不是,我(最好是“线程安全”)的替代方案是什么? 问题答案: 查看常见问题解答。该sqlite3_last_insert_rowid()函数将做到这一点。不过要小心触发器。

  • 问题内容: 我有一堂课,有一个清单。银行有一种将价值从一个帐户转移到另一个帐户的方法。这个想法是同时锁定转帐中的和帐户。 为了解决这个问题,我有以下代码(请记住,这是一个非常琐碎的示例,因为仅仅是一个示例): 这有效,但不能防止 死锁 。要解决此问题,我们需要将同步更改为以下内容: 但是编译器警告我有关 嵌套的同步块 ,我相信这是一件坏事吗?另外,我不太喜欢最大/最小解决方案(我不是那个想法的提出

  • 我似乎无法正确配置系统,也无法让浏览器向Web服务器发送kerberos票据。而是发送令牌。 问:我该如何解决这个问题? 下面列出了所有细节和配置。 null 这就是我在中以编程方式注册配置的方式: 和 编辑1:附加信息 我已经下载了Kerberos Authentication Tester工具,当从服务器()运行它并对进行测试时,它显示了正确的身份验证。 当从服务器(浏览器所在)运行它时,它表

  • 问题内容: 我试图通过一条记录一个接一个地执行两个查询来插入一条记录并获取其新生成的ID,但是不知道为什么它给了我以下错误。 我的代码如下:(我不想使用sql存储过程) 另外,如果可能,请检查上面的代码是否编码正确,或者我们可以对其进行更多优化以提高性能? 谢谢 问题答案: 对SCOPE_IDENTITY()的调用不会被视为与您正在执行的INSERT命令位于同一“作用域”中。 本质上,您需要做的是

  • 在ANTLR v3中,句法谓词可以用来解决例如悬空的else问题。ANTLR4似乎接受具有类似歧义的语法,但在解析过程中它会报告这些歧义(例如,“line 2:29 reportAmbiguity d=0(e):ambigalts={1,2},input=...”)。它生成一个解析树,尽管存在这些歧义(根据文档,通过选择第一个备选方案)。但如果我想让它选择其他选择,我能做什么呢?换句话说,我如何显