我的问题有点理论性,因为我没有任何具体的工作例子。但我认为值得回答。在SQL Server中编写插入触发器的正确方法是什么?
什么是在SQL Server中编写插入触发器的正确方法?
比方说,我创建像这样(或多或少伪代码)触发
CREATE TRIGGER MY_TRIGGER
ON MY_TABLE
FOR INSERT AS
DECLARE @myVariable;
DECLARE InsertedRows CURSOR FAST_FORWARD FOR SELECT A_COLUMN FROM INSERTED;
OPEN InsertedRows;
FETCH NEXT FROM InsertedRows INTO @NewOrderCode;
...
INSERT INTO ANOTHER_TABLE (
CODE,
DATE_INSERTED
) VALUES (
@myVariable,
GETDATE()
);
...etc
现在,如果别人创建在同一个表的另一触发条件和触发会改变插入的行一些列?这样
CREATE TRIGGER ANOTHER_TRIGGER
ON MY_TABLE
FOR INSERT AS
UPDATE MY_TABLE
SET A_COLUMN = something
WHERE ID IN (SELECT ID FROM INSERTED);
...etc
然后我的触发(如果另一个触发后被解雇)上的东西不对数据进行操作,因为插入的数据是不一样的,其已经改变与其他触发右表中的实际插入的数据?
总结:
触发器A于表T更新新插入的行,触发器B,则对脏数据进行操作,因为从触发器A中的更新并不在其中触发B操作插入的伪代码表可见。但是如果触发器B直接在工作台上工作而不是在伪表INSERTED上,它会通过触发器A看到更新的数据。
这是真的吗?我是否应该始终使用表中的数据而不是从INSERTED
表中处理数据?
我不明白。谁被谁拦截?两个触发器都在插入之后。其中之一是更新两个触发器所属的表,第二个插入另一个表。 – Behnil
是的。但第二次写入是由第一次写入触发的,第一次写入在执行时尚未完成其事务。它试图更新的行由原始事务更新,因此被锁定。试图在新的环境中更新它们只会给你一个僵局。 – eftpotrm
但我在触发器中更新。这是否意味着在其表上发生更新时触发后插入触发器? – Behnil