在SQL触发器更新触发器期间,有一种简单的方法来获取整个预期结果表(即,在触发器执行后表格会是什么样子?)
这是我唯一能想到的东西(归结为表MINUS已删除的表+插入的表):
SELECT *
FROM TheTable t
WHERE
NOT EXISTS
(
SELECT 1
FROM DELETED d
WHERE
d.primaryKey1 = t.primaryKey1
AND d.primaryKey2 = t.primaryKey2
-- ...
)
UNION ALL
SELECT *
FROM INSERTED
更新
上述内容在FOR / AFTER触发器内部不必要地复杂化。只需查询表本身就足够了。 (感谢@usr的唤醒调用。)然而,对于一个触发器而不是触发器,你会做类似的事情来得到结果表,尽管你可能真的想在它执行期间构建表。
答案 0 :(得分:2)
使用AFTER
触发器查看最终状态的表格。
答案 1 :(得分:2)
如前所述,您可以使用插入/更新后触发器。在此触发器上下文中,您具有包含新值的表,但插入或更新并未真正结束,因此任何throw都将回滚操作。例如:
-- drop table testConstraint
create table testConstraint
(
Id INT,
Name varchar(10)
-- CONSTRAINT CK_testConstraint_misc CHECK (dbo.checkTest(Id, Name) <> 0)
)
create TRIGGER trgConstraint
ON dbo.testConstraint
AFTER INSERT, UPDATE AS
BEGIN
IF EXISTS (SELECT 1 FROM testConstraint where Id > 10)
THROW 51000, 'Invalid record found', 1;
END
GO
-- ok
insert into testConstraint (Id, Name) values (1, 'n1'), (2, 'n2'), (3, 'n3')
go
select * from testConstraint
go
-- will fail
insert into testConstraint values (11, 'n11')
go
select * from testConstraint
GO
-- will fail
update testConstraint set Id = 20 where Id = 2
go
select * from testConstraint
GO