简单的 IF EXISTS in TRIGGER 失败
Posted
技术标签:
【中文标题】简单的 IF EXISTS in TRIGGER 失败【英文标题】:Simple IF EXISTS in TRIGGER fails 【发布时间】:2014-01-12 00:51:39 【问题描述】:我创建了一个简单的触发器:
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 的值。
这是为什么呢?
【问题讨论】:
【参考方案1】:我不能 100% 确定这一点,但对我来说这听起来很合乎逻辑 - 触发器是插入/更新触发器。只要有东西被插入,触发器就会被触发并且条件为 TRUE。由于触发了 ROLLBACK TRANSACTION,插入的行随后会回滚,因此您会得到一个空表。您究竟想在这里实现什么目标?
【讨论】:
【参考方案2】:除了您这样做的原因之外,在您的情况下,IF EXISTS()
始终为 TRUE
的原因非常简单这是因为您使用的是 AFTER
或FOR
触发器。
CREATE TRIGGER AFTER 指定仅在所有操作时触发 DML 触发器 触发 SQL 语句中指定的已成功执行。 所有引用级联动作和约束检查也必须 在此触发器触发之前成功。
表示您尝试插入的行已经在表中。这只是一个尚未提交的事务。
这里是SQLFiddle演示
您的IF EXISTS()
检查可能只在INSTEAD OF INSERT
触发器中起作用,但您应该考虑到SQL Server 中的触发器是基于语句的。这意味着它会在每个语句中触发一次,并且您可以在一个语句中插入多行。
这里是SQLFiddle演示
就您的触发器定义中的FOR UPDATE
子句而言,它根本没有任何意义。如果您要更新某些内容,它应该在表格中。因此表不为空。
【讨论】:
以上是关于简单的 IF EXISTS in TRIGGER 失败的主要内容,如果未能解决你的问题,请参考以下文章
如何停止执行(默认):DROP TABLE IF EXISTS in sequelize sync
jQuery DataTables:如何添加类if the string exists in the?
If Value Exists Then Query Else Allow Create New in Oracle Forms An Example
sh 检查shell脚本中是否存在目录 - 来自http://stackoverflow.com/questions/59838/check-if-a-directory-exists-in-a-sh
python 来自http://stackoverflow.com/questions/4188326/in-python-how-do-i-check-if-a-drive-exists-w-o-t