gpt4 book ai didi

sql - 行级触发器的替代方案?

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

MS SQL Server 没有行级触发器,对吗?如果我需要从触发器内插入一行,然后根据第一次插入的结果插入另一行,游标是否是最佳解决方案?

例如,有没有更好的方法来做到这一点:

CREATE TABLE t1 (foo int)
CREATE TABLE t2 (id int IDENTITY, foo int)
CREATE TABLE t3 (t2_id int)

GO

CREATE TRIGGER t1_insert_trg ON t1 FOR INSERT AS
DECLARE c CURSOR FOR
SELECT foo FROM inserted
DECLARE @foo int
OPEN c
FETCH NEXT FROM c INTO @foo
WHILE @@FETCH_STATUS = 0
BEGIN
INSERT INTO t2 (foo) VALUES (@foo)
INSERT INTO t3 (t2_id) VALUES (@@IDENTITY)
FETCH NEXT FROM c INTO @foo
END
CLOSE c
DEALLOCATE c

最佳答案

我假设您使用的是 2005 年或更好的版本?如果是这样,请查看 OUTPUT 子句,您不需要行级触发器。例如:

USE tempdb;
GO

CREATE TABLE t1 (foo int);
CREATE TABLE t2 (id int IDENTITY, foo int);
CREATE TABLE t3 (t2_id int);
GO

CREATE TRIGGER t1_insert ON t1
FOR INSERT AS
BEGIN
DECLARE @new_rows TABLE(new_id INT, old_foo INT);

INSERT t2(foo)
OUTPUT inserted.id, inserted.foo
INTO @new_rows
SELECT foo
FROM inserted;

INSERT t3 SELECT new_id FROM @new_rows;
END
GO

INSERT t1(foo) SELECT 1 UNION ALL SELECT 5;
SELECT * FROM t1;
SELECT * FROM t2;
SELECT * FROM t3;
GO

DROP TABLE t1,t2,t3;

您还可以通过在 T1 上设置一个插入 T2 的触发器,然后在 T2 上设置一个插入 T3 的触发器来管理此问题。恕我直言,这不会那么高效,也不容易管理,但我认为它更容易遵循(如果你被困在 2000 上,这可能是你唯一的选择)。两者都可以是基于集合的,并且不需要游标或任何其他逐行处理方法。

USE tempdb;
GO

CREATE TABLE t1 (foo int);
CREATE TABLE t2 (id int IDENTITY, foo int);
CREATE TABLE t3 (t2_id int);
GO

CREATE TRIGGER t1_insert ON t1
FOR INSERT AS
BEGIN
INSERT t2(foo)
SELECT foo FROM inserted;
END
GO

CREATE TRIGGER t2_insert ON t2
FOR INSERT AS
BEGIN
INSERT t3(t2_id)
SELECT id FROM inserted;
END
GO

INSERT t1(foo) SELECT 1 UNION ALL SELECT 5;
SELECT * FROM t1;
SELECT * FROM t2;
SELECT * FROM t3;
GO

DROP TABLE t1,t2,t3;

(顺便说一句,如果您要获取身份值,请使用 SCOPE_IDENTITY(),而不是 @@IDENTITY。)

关于sql - 行级触发器的替代方案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/504198/

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