TRIGGER中的简单IF存在失败

时间:2014-01-12 00:51:39

标签: sql sql-server triggers exists

我创造了一个简单的TRIGGER:

ALTER TRIGGER [dbo].[SprawdzZajetosc] ON [dbo].[Wypozyczenia]
FOR insert, update
AS
BEGIN
IF EXISTS (SELECT * FROM Wypozyczenia)
    BEGIN
        RAISERROR('Wybrany pojazd został już wypożyczony w wybranym przedziale czasu.', 16, 1)
        ROLLBACK TRANSACTION
    END
END

我无法理解为什么即使桌子'Wypozyczenia'为空,'if'还是给我TRUE? “Wypozyczenia”包含什么并不重要 - 它总是让我TRUE

我尝试使用count(*)它总是返回一个值> 0

为什么?

2 个答案:

答案 0 :(得分:1)

我不是100%肯定这一点,但这对我来说听起来合乎逻辑 - 触发器是一个插入/更新触发器。一旦插入某些内容,触发器就会被触发,条件为TRUE。由于触发了ROLLBACK TRANSACTION,因此插入的行将回滚,因此您将获得一个空表。你到底想要在这里实现什么目标?

答案 1 :(得分:1)

除了你这样做的原因之外,IF EXISTS()总是TRUE的原因是非常简单因为你正在使用AFTERFOR触发。

  

CREATE TRIGGER
  AFTER指定在所有操作时触发DML触发器   在触发SQL语句中指定已成功执行。   所有参考级联操作和约束检查也必须   在此触发器触发之前成功。

表示您尝试插入的行已经在表格中。这只是一项尚未提交的交易。

这是 SQLFiddle 演示


您的IF EXISTS()检查可能仅在INSTEAD OF INSERT触发器中起作用,但您应该考虑SQL Server中的触发器是基于语句的。这意味着它会在每个语句中触发一次,并且您可以在一个语句中插入多行。

这是 SQLFiddle 演示


就你的触发器定义中的FOR UPDATE子句而言,它根本没有任何意义。如果你正在更新它应该在表中。因此,表格不是空的。

相关问题