请解释SQL Server CLR触发器Trg_SQLcm_Department的工作原理
首先先把完整的触发器定义贴出来,方便咱们对照着看:
CREATE TRIGGER [dbo].[Trg_SQLcm_Department] ON [dbo].[Department] WITH EXECUTE AS CALLER AFTER INSERT, DELETE, UPDATE AS EXTERNAL NAME [Trg_SQLcm_dbo_Department].[CLRTriggers].[DMLTrigger]
这是一个SQL Server CLR触发器——简单说就是用.NET代码(比如C#/VB.NET)编写逻辑的触发器,而非传统的T-SQL触发器。咱们逐部分拆解它的作用:
触发器基本绑定:
CREATE TRIGGER [dbo].[Trg_SQLcm_Department] ON [dbo].[Department]
这行定义了触发器的名称是Trg_SQLcm_Department,并且把它绑定到dbo.Department表上——也就是说只有对这个表的操作才会触发它。执行上下文控制:
WITH EXECUTE AS CALLER
这指定了触发器运行时使用的权限身份是触发它的用户(也就是执行INSERT/DELETE/UPDATE操作的那个用户),而非触发器的创建者或其他系统账户。举个例子:如果调用这个触发器的用户没有读取某个其他表的权限,那触发器里的.NET代码如果尝试访问那个表,也会因为权限不足失败。触发时机:
AFTER INSERT, DELETE, UPDATE
这说明这是一个事后触发器——只有当Department表上的INSERT、DELETE、UPDATE操作成功完成之后,才会触发这个触发器的逻辑。和它对应的是INSTEAD OF触发器(替代原操作执行),而这里是等原操作做完再跑。CLR逻辑关联:
AS EXTERNAL NAME [Trg_SQLcm_dbo_Department].[CLRTriggers].[DMLTrigger]
这是CLR触发器最核心的部分,它告诉SQL Server:这个触发器的实际逻辑不在T-SQL里,而是在外部的.NET程序集中:Trg_SQLcm_dbo_Department是已经注册到当前SQL Server实例中的CLR程序集名称CLRTriggers是该程序集里的一个类DMLTrigger是这个类里的一个方法,也就是真正处理触发器逻辑的代码(比如记录操作日志、做复杂的业务校验、同步数据到其他系统等等)
整体的工作流程就是:当有用户对dbo.Department表执行INSERT/DELETE/UPDATE操作且操作成功完成后,SQL Server会调用指定.NET程序集里的CLRTriggers.DMLTrigger方法,执行里面的.NET代码逻辑,整个过程的权限遵循触发操作的用户权限。
内容的提问来源于stack exchange,提问作者Ajai Kumar

