Hej,
更新感谢大家的回答和提示。我知道我的第一次尝试是错误的,所以也许更好的方法是用语言描述我的问题,而不是尝试一个糟糕的触发器。
表A是所有客户端的列表。对于search客户端存在多个订单(该表中其他不需要的信息旁边):
CLIENT | 订单 | 可选 |
---|---|---|
A | 1 | 否|
A | 2 | 是|
A | 3 | 否 |
B | 16818 | 是[/tr>|
B | 342 | 是[/tr>
触发器的最佳实践:
- 除非你没有其他选择,否则不要创建它们
- 通常最好将插入和更新触发器分开,有时它们可以组合在一起
NOCOUNT
停止返回客户端的虚假消息,XACT_ABORT
表示任何错误都会自动回滚事务- 检查是否有任何相关的行,如果没有提前退出
- 如果相关,还可以使用
UPDATE()
函数检查更新语句中是否存在列(这并不意味着行实际上已经更改) - 在
UPDATE
触发器中,确保比较inserted
和deleted
行的实际更改 -
最重要的是:注意
inserted
和deleted
可能包含多行
CREATE TRIGGER Trg_TableA_OPTIONAL_ins
ON TableA
AFTER INSERT
AS
SET NOCOUNT, XACT_ABORT ON;
IF (NOT EXISTS (SELECT 1 FROM inserted WHERE OPTIONAL = 'NO'))
RETURN;
INSERT TableB (CLIENT, [ORDER])
SELECT CLIENT, [ORDER]
FROM inserted
WHERE OPTIONAL = 'NO';
GO
CREATE TRIGGER Trg_TableA_OPTIONAL_upd
ON TableA
AFTER UPDATE
AS
SET NOCOUNT, XACT_ABORT ON;
IF (NOT EXISTS (SELECT 1 FROM inserted))
RETURN;
INSERT TableB (CLIENT, [ORDER])
SELECT CLIENT, [ORDER]
FROM (
SELECT CLIENT, [ORDER], OPTIONAL
FROM inserted
WHERE OPTIONAL = 'NO'
EXCEPT
SELECT CLIENT, [ORDER], OPTIONAL
FROM deleted
) i
EXCEPT
SELECT CLIENT, [ORDER]
FROM TableB;
DELETE FROM b
FROM TableB b
JOIN (
SELECT CLIENT, [ORDER], OPTIONAL
FROM inserted
WHERE OPTIONAL = 'YES'
EXCEPT
SELECT CLIENT, [ORDER], OPTIONAL
FROM deleted
) i
ON TableB.CLIENT = Source.CLIENT AND TABLEB.[ORDER] = Source.[ORDER];
GO