SQL更新触发期间的预期结果表是什么?

时间:2015-12-14 18:43:18

标签: sql-server

在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的唤醒调用。)然而,对于一个触发器而不是触发器,你会做类似的事情来得到结果表,尽管你可能真的想在它执行期间构建表。

2 个答案:

答案 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