开发CLR数据库对象:CLR触发器(上)

日期: 2009-10-25 作者:McGraw-Hill翻译:冯昀晖 来源:TechTarget中国 英文

除了存储过程和用户定义函数,SQL Server 2005中.NET新整合的能力还提供了对创建触发器的支持。要使用Visual Studio 2005创建触发器,你要从前面的例子中了解到怎样创建项目。要使用Visual Studio 2005创建触发器,选择“新建|项目”选项,指定项目名称,点击“确定”创建项目。   在这个项目中,我使用“ti_ShowInserted”作为我的触发器名称。

这个触发器实现的功能是查询插入到表中的一行,并把数据显示出来。给项目指定名称之后点击“确定”,会出现“新建数据库引用”对话框,我使用与前面的例子中相同的设置。接下来,我使用“项目|添加触发器”菜单项为CLR……

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

电子邮件地址不会被公开。 必填项已用*标注

敬请读者发表评论,本站保留删除与本文无关和不雅评论的权力。

除了存储过程和用户定义函数,SQL Server 2005中.NET新整合的能力还提供了对创建触发器的支持。要使用Visual Studio 2005创建触发器,你要从前面的例子中了解到怎样创建项目。要使用Visual Studio 2005创建触发器,选择“新建|项目”选项,指定项目名称,点击“确定”创建项目。

  在这个项目中,我使用“ti_ShowInserted”作为我的触发器名称。这个触发器实现的功能是查询插入到表中的一行,并把数据显示出来。给项目指定名称之后点击“确定”,会出现“新建数据库引用”对话框,我使用与前面的例子中相同的设置。接下来,我使用“项目|添加触发器”菜单项为CLR触发器创建启动项目。如图3-10所示:

  图3-10:添加CLR 触发器

  正如你在前面的CLR数据库对象例子中看到的那样,你可以从模板列表中选择“触发器”选项,然后在名称文本框中提供触发器的名称。Visual Studio 2005会生成启动项目文件,你可以给其中添加自己的代码。启动项目包括需要的导入指令,并且会生成一个类,本例中类名为“Triggers”,名为“ti_ShowInserted”的方法前面有需要的属性设置。下面的代码列表展示了名为“ti_ShowInserted”的CLR 触发器的完整代码:

  本例中CLR触发器显示在数据库“Adventureworks”中表“Person.ContactTypes”上执行的一步插入操作插入的数据内容。代码中要注意的第一点是“ti_ShowInserted”方法的“属性”(在尖括号<>中括起来的代码)。该属性用来命名触发器,并标识触发器将应用到的表和引起触发器触发的事件。

  使用Visual Studio 2005触发器模板初始化生成这一属性时,它前面会自动生成注释符号(就是使该行成为注释)。这是因为触发器模板不知道你想如何使用和在哪里使用触发器。为了使Visual Studio 2005能部署触发器,你需要把属性行前面的注释去掉,然后写上合适的属性。下表列出了Visual Studio 2005触发器模板可以使用的属性:

  在本例中,生成的触发器会命名为“ti_ShowInserted”。该触发器会应用到数据库“AdventureWorks”中表“Person.ContactType”上,触发器只有在发生插入操作时才会被触发。

  触发器的主要代码都在“ti_ShowInserted”方法中。该代码示例利用了ADO.NET的另一个新对象“SqlTriggerContext”。SqlTriggerContext对象提供关于触发触发器动作的信息,和触发器影响的列。“SqlTriggerContext”对象总是由“SqlContext”对象实例化的。通常,“SqlContext”对象提供关于调用者的上下文信息。在本例中尤其如此,“SqlContext”对象使代码可以访问执行触发器过程中创建的虚拟表。该虚拟表存储了能引起触发器执行的数据。

  接下来,创建了“SqlPipe”对象。“SqlPipe”对象使触发器可以与外部调用者交互,在本例中它的作用是传递插入的数据值给调用者。“SqlContext”对象的“TriggerAction”属性用来判断是否触发器动作是一个插入操作。使用该属性的作用十分明确,它支持以下的值:

  如果“TriggerAction”属性等于“TriggerAction.Insert”,那么说明执行了插入操作,虚拟触发器表的内容就会被查出来并通过“SqlPipe”对象的“Execute”方法送到调用者那里。为了查询虚拟表的内容,需要一个“SqlConnection”对象和一个“SqlCommand”对象。这些对象都在“System.Data.SqlClient”表空间中。你应该注意,在采用Server端编程时,“SqlConnection”对象使用的连接串必须设置“context Connection=true”的值。然后名叫“oCmd”的“SqlCommand”对象被实例化,使用语句“Select * from inserted”从虚拟表中查询所有行和列,其中包括刚插入的值。最后,“ExecuteAndSend”方法和“SqlPipe”对象用来执行命令,并把结果送回调用者。

相关推荐