gpt4 book ai didi

sql - SCOPE_IDENTITY 而不是插入触发器的解决方法

转载 作者:行者123 更新时间:2023-12-02 00:44:04 30 4
gpt4 key购买 nike

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

最佳答案

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

除了使用存储过程之外,这还可以。

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

编辑:SCOPE_IDENTITY and parallelism in SQL Server 2005 cam have a problem

关于sql - SCOPE_IDENTITY 而不是插入触发器的解决方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1434088/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com