sql-server - 如何在 SQL Server 中编写触发器主体
问题描述
我很困惑 SQL Server 中的触发器如何知道触发触发器的事件以及要做什么。
例如,我有一个在表 A 上更新的触发器,它正在执行AFTER INSERT, DELETE, UPDATE
. 现在我的问题是如何让主体在触发时执行每个任务,我是否需要为每个任务创建单独的触发器,或者它是一种指定单个主体和单个触发器上的每个任务需要做什么的方法. 如果可以的话,任何人都可以给出一些解释和例子
谢谢
解决方案
如果您真的必须执行单个触发器 - 这是保持三个操作 - 和 - 分开所需INSERT
的UPDATE
逻辑DELETE
:
CREATE TRIGGER dbo.YourTriggerName
ON dbo.YourTable
AFTER DELETE, INSERT, UPDATE
AS
BEGIN
-- check if both the Inserted as well as the Deleted pseudo tables exist
IF EXISTS (SELECT * FROM Inserted) AND EXISTS (SELECT * FROM Deleted)
BEGIN
-- trigger operation : UPDATE
-- "Inserted" contains the new values for the rows after the update
-- "Deleted" contains the old values for the rows before the update
END
-- check if only the Inserted pseudo tables exists
IF EXISTS (SELECT * FROM Inserted) AND NOT EXISTS (SELECT * FROM Deleted)
BEGIN
-- trigger operation: INSERT
-- "Inserted" contains the values for the rows inserted
END
-- check if only the Deleted pseudo tables exists
IF NOT EXISTS (SELECT * FROM Inserted) AND EXISTS (SELECT * FROM Deleted)
BEGIN
-- trigger operation: DELETE
-- "Deleted" contains the values for the rows having been deleted
END
END;
请注意:每个语句调用一次触发器- 而不是每行一次 - 因此Inserted
伪Deleted
表可能包含多行- 以基于集合的方式处理它们,因为表 - 不要做任何类似的事情
SELECT @ID = i.ID FROM Inserted i
这不适用于在单个 SQL 语句中一次插入多行!
但正如我所说 - 这有点混乱,会导致非常大的触发器,并且很难维护此代码。我个人更愿意拥有三个独立的、有针对性的触发器——一个用于您需要处理的每个操作。
推荐阅读
- asp.net-web-api - 发送 HTTP 标头后,间歇服务器无法设置状态
- python - Python:Cherry Py 返回 ZIP 文件。如何将cherrypy中的zip文件作为下载返回
- r - 如何使用emmeans创建手动对比?-R
- python - Python Opencv结构化森林边缘检测TypeError
- amazon-web-services - 如何将 Step Function 输入传递给批处理作业
- swift - 在锁定屏幕模式下隐藏操作按钮 - iOS Notification Swift 4.2
- c# - 按下后退按钮时,WebView 使应用程序崩溃,Xamarin.forms,android
- javascript - 可能事件在自定义指令中的错误元素上冒泡
- python - 如何通过包触发弃用警告?
- c# - 为什么接口“切片”的类的 GetType() 告诉我它不是一个类类型?