SQL触发器与CLR的使用

  在数据库的日常操作中,面对复杂业务的情况下,总会有用sql语句或存储过程不是那么方便的时候,所以这时候就会想到在数据库中调用CLR,也就是调用程序集,此处用C#实现来讲解一个测试案例

  测试案例的业务是:我有两张表分别命名为A,B,当我在A表中插入一条数据时,这时我希望将插入的记录中的某些字段插入到B表中。很明显,很快我们会想到触发器,其实这个业务并不复杂,我们在一个触发器中就可以轻松实现,但是基于此篇博文的目的,我把向B表插入数据的功能放到了程序集里面,也就是我们的C#程序中。废话不多说,我们接下来就开始

1.建表,A,B。表结构如下(A,B表表结构一样,均是下面的Error表)

2.然后我们开始建程序集了,就是我们的动态库

 1 using Microsoft.SqlServer.Server;
 2 using System;
 3 using System.Collections.Generic;
 4 using System.Data.SqlClient;
 5 using System.Text;
 6 using System.Data;
 7 using System.Threading;
 8
 9 namespace TestProc
10 {
11     public class TestClass
12     {
13         [Microsoft.SqlServer.Server.SqlTrigger(Name = "ELMAH_Error_Trigger", Target = "ELMAH_Error", Event = "FOR INSERT ")]
14         public static void triggerInsert()
15         {
16             string id = "";
17             DateTime dt = DateTime.Now;
18             //获取插入A表的数据
19             using (SqlConnection cn = new SqlConnection())
20             {
21                 cn.ConnectionString = "context connection=true";
22                 cn.Open();
23
24                 using (SqlCommand cmd = cn.CreateCommand())
25                 {
26                     cmd.CommandText = "select a.Name, a.Tctime from INSERTED a";
27                     SqlDataReader dr = cmd.ExecuteReader();
28                     StringBuilder sb = new StringBuilder();
29                     while (dr.Read())
30                     {
31                         id = dr[0].ToString();
32                         dt=Convert.ToDateTime(dr[1]);
33                         SqlContext.Pipe.Send(id+dt.ToShortDateString()+"\r\n");
34                     }
35                 }
36             }
37
38             using (SqlConnection cn1 = new SqlConnection())
39             {
40                 cn1.ConnectionString =@"server =192.168.0.102\DATAUM; database =HR;user id = sa ;password =123456";
41                 cn1.Open();
42                 using (SqlCommand cmd1 = cn1.CreateCommand())
43                 {
44                     cmd1.CommandText = "insert into Error Values(" + id + ",‘" + dt + "‘)";
45                     SqlContext.Pipe.Send(cmd1.CommandText + "\r\n");
46                     cmd1.ExecuteNonQuery();
47                 }
48             }
49         }
50     }
51 }

  3.在SQL Server中编辑和布暑程序集,下面我将通过代码的方式进行部署

把第2部中的代码编译成动态库,然后在sql server 中执行语句

create assembly TestProc from ‘E:\Disco\TestProc\TestProc\bin\Debug\TestProc.dll‘ with permission_set = unsafe   --路径根据自己的情况而变动

   创建成功后我们就可以在左边找到我们所建的程序集

       4.接着我们来创建触发器对此程序集进行调用

CREATE TRIGGER A_insert
   ON ELMAH_Error
   AFTER INSERT
AS
    EXTERNAL NAME TestProc.[TestProc.TestClass].triggerInsert
GO

   5.好了,以上步骤基本上配置完了,接下来我们进行测试,向A表中插入数据时看能不能向B表中也插入相应的数据

insert into A Values("test",‘2015/10/21 15:30:45‘)

6.可能你执行上面的插入语句会报错,那是因为在程序集中我们插入的数据库是远程机,应该对其进行相应的设置,以下是配置步骤,注意(以下配置必须同时在两个机子上进行)

    a.在windows控制面版-->管理工具-->服务-->Distributed Transaction Coordinator-->属性-->启动

    b.在CMD下运行"net start msdtc"开启服务后正常

c. 如果是win7,选择"管理工具下"的"组件服务",我的电脑->Distributed Transaction Coordinator->本地DTC,单击打开属性窗口,切换到"安全"选项卡,做如图配置

    保存后再执行测试就可以了。

好了,至此大功告成!

时间: 2024-11-05 21:43:30

SQL触发器与CLR的使用的相关文章

SQL触发器调用.NET的类方法续SQLCLR应用

SQL CLR (SQL Common Language Runtime) 是自 SQL Server 2005 才出现的新功能,它将.NET Framework中的CLR服务注入到 SQL Server 中,使得.NET代码可在SQL Server服务器进程中执行. 通过在 Microsoft SQL Server 中托管 CLR(称为 CLR 集成),开发人员可以在托管代码中编写存储过程.触发器.用户定义函数.用户定义类型和用户定义聚合函数, 改变了以前只能通过T-SQL语言来实现这些功能的

Sql Server 与CLR集成

.NET编程和SQL Server ——Sql Server 与CLR集成 一.SQL Server 为什么要与CLR集成 1. SQL Server 提供的存储过程.函数等十分有限,经常需要外部的代码来执行一些繁重的移植: 2.与CLR集成可将原本需要独立的程序来实现的功能迁移到SQL Server 内部进行数据操作: 3.T-SQL数据查询语言在返回数据集方面很好,但是除此之外表现不佳.与CLR的集成可解决这一问题: 4..NET的操作代码和执行的速度比T-SQL快的很多..NET程序是已经

SQL触发器实例(下)

1 基本语法: 2 Create Trigger [TriggerName] 3 ON [TableName] 4 FOR [Insert][,Delete][,Update] 5 AS 6 --触发器要执行的操作语句. 7 Go 8 9 注意: 10 触发器中不允许以下 Transact-SQL 语句: 11 Alter DATABASE ,Create DATABASE,DISK INIT, 12 DISK RESIZE, Drop DATABASE, LOAD DATABASE, 13 L

SQL触发器学习

? 简介 触发器是一种特殊类型的存储过程.触发器分为: DML( 数据操纵语言 Data Manipulation Language)触发器:数据库中表或视图的数据更改时触发,包括insert,update,delete语句 DDL(数据定义语言 Data Definition Language)触发器:表或索引中的create.alter.drop语句. 登陆触发器:是指当用户登录SQL SERVER实例建立会话时触发. ? 优劣 可以强制执行业务规则: Microsoft SQL Serve

SQL触发器实例讲解

定义: 何为触发器?在SQL Server里面也就是对某一个表的一定的操作,触发某种条件,从而执行的一段程序.触发器是一个特殊的存储过程.       常见的触发器有三种:分别应用于Insert , Update , Delete 事件. 我为什么要使用触发器?比如,这么两个表: Create Table Student(              --学生表         StudentID int primary key,       --学号         ....        )

SQL 触发器-如何查看当前数据库中有哪些触发器

在查询分析器中运行: use 数据库名goselect * from sysobjects where xtype='TR' sysobjects 保存着数据库的对象,其中 xtype 为 TR 的记录即为触发器对象.在 name 一列,我们可以看到触发器名称. SQL 触发器-创建一个简单的触发器 SQL 触发器-重命名触发器 SQL 触发器-删除触发器 SQL 触发器-触发器更多语法 SQL 触发器-如何查看某个触发器的内容 SQL 触发器-多个触发器 SQL 触发器-递归.嵌套触发器 SQ

在SQL中使用CLR提供基本函数对二进制数据进行解析与构造

? 二进制数据包的解析一般是借助C#等语言,在通讯程序中解析后形成字段,再统一单笔或者批量(表类型参数)提交至数据库,在通讯程序中,存在BINARY到struct再到table的转换. 现借助CLR提供基本的INT2HEX(小端)等函数,在SQL中直接解析数据包. ? 基本函数 [Microsoft.SqlServer.Server.SqlFunction(Name = "Time2UTCBin")] public static SqlBinary Time2UTCBin(DateTi

创建SQL触发器

我们可以对某个数据表添加SQL触发器,当该表进行添加.更新.删除时执行某项操作.不过SQL触发器如果能不用尽量不用,若在项目后期改动程序波及范围太大,使用SQL触发器可以避免,所以才使用. 数据表dbo.User(UserName, Password) CREATE TRIGGER Trigger_User ON dbo.User FOR UPDATE, DELETE AS IF UPDATE(UserName) BEGIN DECLARE @userNameBeforeUpdate NVARC

SQL里执行CLR c#代码

这里只说一个重点: 1.直接在sql里执行clr代码的时候,sql还是会报错 说没有启用 clr 执行以下代码才会起作用 EXEC sp_configure 'clr enabled', 1;  RECONFIGURE WITH OVERRIDE; 2.sql2008 只能识别.net 3.5的 参考链接: http://zhoufoxcn.blog.51cto.com/792419/859245/ https://support.microsoft.com/en-us/help/2120850