我创造了一个简单的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
为什么?
答案 0 :(得分:1)
我不是100%肯定这一点,但这对我来说听起来合乎逻辑 - 触发器是一个插入/更新触发器。一旦插入某些内容,触发器就会被触发,条件为TRUE。由于触发了ROLLBACK TRANSACTION,因此插入的行将回滚,因此您将获得一个空表。你到底想要在这里实现什么目标?
答案 1 :(得分:1)
除了你这样做的原因之外,IF EXISTS()
总是TRUE
的原因是非常简单因为你正在使用AFTER
或FOR
触发。
CREATE TRIGGER
AFTER指定在所有操作时触发DML触发器 在触发SQL语句中指定已成功执行。 所有参考级联操作和约束检查也必须 在此触发器触发之前成功。
表示您尝试插入的行已经在表格中。这只是一项尚未提交的交易。
这是 SQLFiddle 演示
您的IF EXISTS()
检查可能仅在INSTEAD OF INSERT
触发器中起作用,但您应该考虑SQL Server中的触发器是基于语句的。这意味着它会在每个语句中触发一次,并且您可以在一个语句中插入多行。
这是 SQLFiddle 演示
就你的触发器定义中的FOR UPDATE
子句而言,它根本没有任何意义。如果你正在更新它应该在表中。因此,表格不是空的。