杨大奎» SQL Server CLR全功略之四—CLR触发器

CLR可以实现DMLDDL两种触发形式,但是本人一般不建议使用CLR的触发器,主要是考虑到效率问题。比如我们使用trigger来实现发mail等操作时,就要考虑pop3或是smtp等待时间,因为trigger本事就是个事务,也就是说,在smtp等待时间也算在了整个事务中,这样就会大大影响效率。

?

1.CLR DML触发器

?

DML指的是数据操作语言,也就是通常的insert,updatedelete操作。这个触发器主要实现在对pubs数据库中的author表进行insert,update,delete时,会显示相应的操作名称。

?

///

??? /// insert,update,delete操作都显示出来

??? ///

??? [Microsoft.SqlServer.Server.SqlTrigger(

??????? Name = "UF_DML_Trigger",

??????? Target = "dbo.authors",

??????? Event = "FOR INSERT, UPDATE, DELETE")]

??? public static void UF_DML_Trigger()

??? {

??????? switch (SqlContext.TriggerContext.TriggerAction)

??????? {

??????????? case TriggerAction.Insert:

??????????????? SqlContext.Pipe.Send(”Trigger Insert”);

??????????????? break;

??????????? case TriggerAction.Update:

??????????????? SqlContext.Pipe.Send(”Trigger Update”);

??????????????? break;

??????????? case TriggerAction.Delete:

??????????????? SqlContext.Pipe.Send(”Trigger Delete”);

??????????????? break;

??????????? default:

????????? ??????break;

??????? }

??? }

?

2.CLR DDL触发器

?

DDL指的是数据定义语言,也就是通常说的create tabledrop procedure等。这段代码主要实现了禁止删除pubs数据库上面的存储过程的功能。当有删除存储过程操作时,就自动回滚。

?

///

??? /// DDL示例:无法删除存储过程,回滚操作

??? ///

??? [Microsoft.SqlServer.Server.SqlTrigger(

??????? Name = "UF_DDL_Trigger",

??????? Target = "pubs",

??????? Event = "DropProcedure")]

??? public static void UF_DDL_Trigger()

??? {

??????? switch (SqlContext.TriggerContext.TriggerAction)

??????? {

??????????? case TriggerAction.DropProcedure:

??????????????? try

??????????????? {

??????????????????? // Get the current transaction and roll it back.

??????????????????? Transaction trans = Transaction.Current;

??????????????????? trans.Rollback();

??????????????????? SqlContext.Pipe.Send(”Drop Proc has Rollback”);

??????????????? }

??????????????? catch (SqlException ex)

??????????????? {

??????????????????? // Catch the expected exception.???????????????????

??????????????? }

??????????????? break;

??????????? default:

??????????????? break;

??????? }

??? }

?

3.部署及调用SQL 脚本

?

关于CLR Assembly的创建方法前面已经讲过了,这里不再重复

?

–Create CLR Trigger

CREATE TRIGGER UF_DML_Trigger

ON dbo.authors

FOR INSERT,update,delete

AS EXTERNAL NAME CLRDemoAssemly.Triggers.UF_DML_Trigger;

go

CREATE TRIGGER UF_DDL_Trigger

ON database

for drop_procedure

as EXTERNAL NAME CLRDemoAssemly.Triggers.UF_DDL_Trigger;

go

?

4.TriggerAction属性列表

?

成员名称 说明

AlterAppRole 已执行 ALTER APPLICATION ROLE Transact-SQL 语句。

AlterAssembly 已执行 ALTER ASSEMBLY Transact-SQL 语句。

AlterBinding? 当事件通知在数据库或服务器实例上创建时,会指定 ALTER_REMOTE_SERVICE_BINDING 事件类型。

AlterFunction? 已执行 ALTER FUNCTION Transact-SQL 语句。

AlterIndex? 已执行 ALTER INDEX Transact-SQL 语句。

AlterLogin? 已执行 ALTER LOGIN Transact-SQL 语句。

AlterPartitionFunction? 已执行 ALTER PARTITION FUNCTION Transact-SQL 语句。

AlterPartitionScheme? 已执行 ALTER PARTITION SCHEME Transact-SQL 语句。

AlterProcedure? 已执行 ALTER PROCEDURE Transact-SQL 语句。

AlterQueue 已执行 ALTER QUEUE Transact-SQL 语句。

AlterRole? 已执行 ALTER ROLE Transact-SQL 语句。

AlterRoute? 已执行 ALTER ROUTE Transact-SQL 语句。

AlterSchema? 已执行 ALTER SCHEMA Transact-SQL 语句。

AlterService? 已执行 ALTER SERVICE Transact-SQL 语句。

AlterTable? 已执行 ALTER TABLE Transact-SQL 语句。

AlterTrigger? 已执行 ALTER TRIGGER Transact-SQL 语句。

AlterUser? 已执行 ALTER USER Transact-SQL 语句。

AlterView? 已执行 ALTER VIEW Transact-SQL 语句。

CreateAppRole? 已执行 CREATE APPLICATION ROLE Transact-SQL 语句。

CreateAssembly? 已执行 CREATE ASSEMBLY Transact-SQL 语句。

CreateBinding? 当事件通知在数据库或服务器实例上创建时,会指定 CREATE_REMOTE_SERVICE_BINDING 事件类型。

CreateContract? 已执行 CREATE CONTRACT Transact-SQL 语句。

CreateEventNotification? 已执行 CREATE EVENT NOTIFICATION Transact-SQL 语句。

CreateFunction? 已执行 CREATE FUNCTION Transact-SQL 语句。

CreateIndex? 已执行 CREATE INDEX Transact-SQL 语句。

CreateLogin? 已执行 CREATE LOGIN Transact-SQL 语句。

CreateMsgType? 已执行 CREATE MESSAGE TYPE Transact-SQL 语句。

CreatePartitionFunction? 已执行 CREATE PARTITION FUNCTION Transact-SQL 语句。

CreatePartitionScheme? 已执行 CREATE PARTITION SCHEME Transact-SQL 语句。

CreateProcedure? 已执行 CREATE PROCEDURE Transact-SQL 语句。

CreateQueue? 已执行 CREATE QUEUE Transact-SQL 语句。

CreateRole? 已执行 CREATE ROLE Transact-SQL 语句。

CreateRoute? 已执行 CREATE ROUTE Transact-SQL 语句。

CreateSchema? 已执行 CREATE SCHEMA Transact-SQL 语句。

CreateSecurityExpression????

CreateService? 已执行 CREATE SERVICE Transact-SQL 语句。

CreateSynonym? 已执行 CREATE SYNONYM Transact-SQL 语句。

CreateTable? 已执行 CREATE TABLE Transact-SQL 语句。

CreateTrigger? 已执行 CREATE TRIGGER Transact-SQL 语句。

CreateType? 已执行 CREATE TYPE Transact-SQL 语句。

CreateUser? 已执行 CREATE USER Transact-SQL 语句。

CreateView? 已执行 CREATE VIEW Transact-SQL 语句。

Delete? 已执行 DELETE Transact-SQL 语句。

DenyObject? 已执行 DENY Object Permissions Transact-SQL 语句。

DenyStatement? 已执行 DENY Transact-SQL 语句。

DropAppRole? 已执行 DROP APPLICATION ROLE Transact-SQL 语句。

DropAssembly? 已执行 DROP ASSEMBLY Transact-SQL 语句。

DropBinding? 当事件通知在数据库或服务器实例上创建时,会指定 DROP_REMOTE_SERVICE_BINDING 事件类型。

DropContract? 已执行 DROP CONTRACT Transact-SQL 语句。

DropEventNotification? 已执行 DROP EVENT NOTIFICATION Transact-SQL 语句。

DropFunction? 已执行 DROP FUNCTION Transact-SQL 语句。

DropIndex? 已执行 DROP INDEX Transact-SQL 语句。

DropLogin? 已执行 DROP LOGIN Transact-SQL 语句。

DropMsgType? 已执行 DROP MESSAGE TYPE Transact-SQL 语句。

DropPartitionFunction? 已执行 DROP PARTITION FUNCTION Transact-SQL 语句。

DropPartitionScheme? 已执行 DROP PARTITION SCHEME Transact-SQL 语句。

DropProcedure? 已执行 DROP PROCEDURE Transact-SQL 语句。

DropQueue? 已执行 DROP QUEUE Transact-SQL 语句。

DropRole? 已执行 DROP ROLE Transact-SQL 语句。

DropRoute? 已执行 DROP ROUTE Transact-SQL 语句。

DropSchema? 已执行 DROP SCHEMA Transact-SQL 语句。

DropSecurityExpression?????

DropService? 已执行 DROP SERVICE Transact-SQL 语句。

DropSynonym? 已执行 DROP SYNONYM Transact-SQL 语句。

DropTable? 已执行 DROP TABLE Transact-SQL 语句。

DropTrigger? 已执行 DROP TRIGGER Transact-SQL 语句。

DropType? 已执行 DROP TYPE Transact-SQL 语句。

DropUser? 已执行 DROP USER Transact-SQL 语句。

DropView? 已执行 DROP VIEW Transact-SQL 语句。

GrantObject?????

GrantStatement?????

Insert? 已执行 INSERT Transact-SQL 语句。

Invalid? 出现一个无效触发操作,该操作不向用户公开。

RevokeObject?????

RevokeStatement?????

Update? 已执行 UPDATE Transact-SQL 语句。

?

5.完整程序

?

view plaincopy to clipboardprint?

using System;??

using System.Data;??

using System.Data.SqlClient;??

using Microsoft.SqlServer.Server;??

using System.Transactions;??

?

public partial class Triggers??

{??

??? /// <summary>??

??? /// insert,update,delete操作都显示出来??

??? /// </summary>??

??? [Microsoft.SqlServer.Server.SqlTrigger(??

??????? Name = "UF_DML_Trigger",??

??????? Target = "dbo.authors",??

??????? Event = "FOR INSERT, UPDATE, DELETE")]??

??? public static void UF_DML_Trigger()??

??? {??

??????? switch (SqlContext.TriggerContext.TriggerAction)??

??????? {??

??????????? case TriggerAction.Insert:??

??????????????? SqlContext.Pipe.Send(”Trigger Insert”);??

??????????????? break;??

??????????? case TriggerAction.Update:??

??????????????? SqlContext.Pipe.Send(”Trigger Update”);??

??????????????? break;??

??????????? case TriggerAction.Delete:??

??????????????? SqlContext.Pipe.Send(”Trigger Delete”);??

??????????????? break;??

??????????? default:??

?????????????? ?break;??

??????? }??

??? }??

?

??? /// <summary>??

??? /// DDL示例:无法删除存储过程,回滚操作??

??? /// </summary>??

??? [Microsoft.SqlServer.Server.SqlTrigger(??

??????? Name = "UF_DDL_Trigger",??

??????? Target = "pubs",??

??????? Event = "DropProcedure")]? ?

??? public static void UF_DDL_Trigger()??

??? {??

??????? switch (SqlContext.TriggerContext.TriggerAction)??

??????? {??

??????????? case TriggerAction.DropProcedure:??

??????????????? try?

??????????????? {??

??????????????????? // Get the current transaction and roll it back.??

??????????????????? Transaction trans = Transaction.Current;??

??????????????????? trans.Rollback();??

??????????????????? SqlContext.Pipe.Send(”Drop Proc has Rollback”);??

??????????????? }??

??????????????? catch (SqlException ex)??

??????????????? {??

??????????????????? // Catch the expected exception.??????????????????????

??????????????? }??

??????????????? break;??

??????????? default:??

??????????????? break;??

??????? }??

??? }??

}?

?

评论审阅已启用。您的评论可能需要一段时间才会出现。

郑重声明:资讯 【杨大奎» SQL Server CLR全功略之四—CLR触发器】由 发布,版权归原作者及其所在单位,其原创性以及文中陈述文字和内容未经(企业库qiyeku.com)证实,请读者仅作参考,并请自行核实相关内容。若本文有侵犯到您的版权, 请你提供相关证明及申请并与我们联系(qiyeku # qq.com)或【在线投诉】,我们审核后将会尽快处理。
—— 相关资讯 ——