这是我创建触发器的代码
CREATE TRIGGER TRIGGERNAME ON [TABLENAME]
AFTER INSERT, UPDATE, DELETE
AS
BEGIN
--[SQL STATEMENTS]
END
在SQL语句中,我如何检查以下内容:
if (a row is updated) {
-- do something
}
else if (a row is deleted) {
-- do something else
}
CREATE TRIGGER [TRIGGERNAME] ON [TABLENAME]
AFTER INSERT, UPDATE, DELETE
AS
BEGIN
DECLARE @DELETED INT, @UPDATED INT
SELECT @DELETED = COUNT(*) FROM [deleted]
SELECT @UPDATED = COUNT(*) FROM [inserted]
IF @UPDATED > 0
PRINT ' inserted '
END
ELSE IF @DELETED > 0
BEGIN
PRINT ' deleted '
END
END
其实触发器只是用于插入/删除:
IF EXISTS (SELECT 1 FROM inserted)
-- I am an insert
ELSE
-- I am a delete
但是如果您想创建更新和删除操作的触发器,您可以尝试以下操作:
CREATE TRIGGER [TRIGGERNAME] ON [TABLENAME]
AFTER INSERT, UPDATE, DELETE
AS
BEGIN
IF EXISTS (SELECT 1 FROM inserted)
BEGIN
IF EXISTS (SELECT 1 FROM deleted)
BEGIN
PRINT 'I am an update'
END
END
ELSE
BEGIN
PRINT 'I am a delete'
END
END
您可以查看此参考资料来为您提供更多帮助。
inserted
伪表包含插入表中的记录
deleted
伪表包含从表中删除的记录
请记住,伪表将包含架构的副本,字段中是否有值将取决于表对该列的“允许空”设置。
Update
操作包含两个表(inserted
和deleted
)中的记录; inserted
表包含新值,deleted
表包含旧值。
“插入”操作将加载
inserted
以及正在插入的数据; “已删除”表实际上是空的。 此操作的“已删除”表还有更多内容,但我根据 OP 的条款对其进行了简化。
“删除”操作将加载“已删除”,其中的数据正在被移除/删除; “插入”表实际上是空的。 此操作的“插入”表还有更多内容,但我根据 OP 的条款对其进行了简化。
了解触发器的“FOR”和“AFTER”之间的区别,因为它们会使情况进一步“复杂化”;更多的是执行顺序和数据何时可用的预期。
基于上述知识,简化的更新触发查询将是:
Update dbo.TABLE
set field = value
where id in (select id from inserted)
AND id in (select id from deleted)
AND
连接运算符,要求 [id]
值包含在 inserted
和 deleted
内以捕获 Update
操作。在oracle中你可以这样写
在 [表名称] 上创建触发器 [触发器名称] 插入、更新、删除后 作为 开始
IF INSERTING THEN
-- Some business logic
END IF;
IF UPDATING THEN
-- Some business logic
END IF;
IF DELETING THEN
-- Some business logic
END IF;
结束