SQL Server CLR系列(2)-创建触发器与手动部署

创建项目请参考上一篇文章
http://blog.csdn.net/u012312667/article/details/78109952

一、创建触发器

1.以下方式创建


SQL Server CLR系列(2)-创建触发器与手动部署_第1张图片

2.涉及到两个表User表和UsersAudit表,这是创建表的代码(==懒得自己建了,直接从微软教程上找的)


CREATE TABLE Users
(
    UserName    NVARCHAR(200)    NOT NULL,
    Pass    NVARCHAR(200)    NOT NULL
)

CREATE TABLE UsersAudit
(
    UserName    NVARCHAR(200)    NOT NULL
)

3.编写触发器代码


先说下思路,在Users执行Insert操作时,提取Users表的UserName字段插入到UsersAudit中,以下是C#创建触发器的代码

using System;
using System.Data;
using System.Data.SqlClient;
using Microsoft.SqlServer.Server;

namespace MyTriggers
{

    public partial class Triggers
    {
        // 为目标输入现有表或视图并取消对特性行的注释
        [Microsoft.SqlServer.Server.SqlTrigger(Name = "trigger1", Target = "Users", Event = "FOR INSERT")]
        public static void trigger1()
        {
            SqlTriggerContext triggContext = SqlContext.TriggerContext;
            SqlParameter userName = new SqlParameter("@username", System.Data.SqlDbType.NVarChar);
            //当Users表新增数据时提取username字段的值放到UsersAudit的username中
            if (triggContext.TriggerAction == TriggerAction.Insert)
            {
                //连接本地数据库
                using (SqlConnection conn = new SqlConnection("context connection=true"))
                {
                    conn.Open();
                    SqlCommand sqlComm = new SqlCommand();
                    SqlPipe sqlP = SqlContext.Pipe;
                    sqlComm.Connection = conn;
                    sqlComm.CommandText = "SELECT UserName from INSERTED";
                    userName.Value = sqlComm.ExecuteScalar().ToString();
                    //插入到新表中
                    sqlComm.CommandText = "INSERT UsersAudit(UserName) VALUES('" + userName.Value + "')";
                    sqlP.Send(sqlComm.CommandText);
                    sqlP.ExecuteAndSend(sqlComm);

                    // doRequest("http://localhost:8080/trtapi-web/trtsdms/inStock/orderBlock2", "POST", "", "UTF-8");
                }
            }
        }
    }
}

4.测试与调试


SQL Server CLR系列(2)-创建触发器与手动部署_第2张图片

在test.sql中插入以下测试代码,设置断点,按F5可以直接调试代码和sql语句

--插入数据
INSERT INTO Users(UserName, Pass) VALUES(N'user1', N'pass1')
--显示结果
select * from Users
select * from UsersAudit

输出以下内容时,表示触发器已经执行成功啦!!

SQL Server CLR系列(2)-创建触发器与手动部署_第3张图片

二、手动部署

先说下手动部署的思路

1.SQLSever中启用CLR功能(SQLServer2008和以前的版本默认是关闭的)
2.VS中生成DLL文件,项目右键–>生成dll(注意下dll生成的目录,后面会用到)
3.创建程序集,即将生成的dll文件添加到SqlServer中
4.创建触发器

以下是具体SQL(最好一步步执行避免出错)

--1.启用CLR
USE [test] --当前数据库名称
EXEC sp_configure 'show advanced options','1';
go 

RECONFIGURE;
go 

EXEC sp_configure 'clr enabled','1';
go 

RECONFIGURE;
go

--使程序集能获得更大权限
ALTER DATABASE [test]
SET trustworthy ON;

--3.将DLL程序集添加到SQL Server中
--格式为 CREATE assembly [程序集名] FROM '生成的本地dll文件地址' WITH permission_set = unsafe ,如:

CREATE assembly SqlServerProject1 FROM 'D:\我的文档\visual studio 2010\Projects\SqlServerProject1\bin\Debug\SqlServerProject1.dll' WITH permission_set = unsafe  

--4.创建触发器
CREATE TRIGGER trigger1
   ON Users
   AFTER INSERT
AS 
--格式为 EXTERNAL NAME [程序集名].[命名空间.类名].[方法名]
    EXTERNAL NAME SqlServerProject1.[MyTriggers.Triggers].trigger1
GO
--这里可能会出现错误:"'external' 附近有语法错误。您可能需要将当前数据库的兼容级别设置为更高的值,以启用此功能。需要更改权限:
--ALTER DATABASE erp_sms_wms SET COMPATIBILITY_LEVEL = 90;
--GO

最后插入测试语句就可以看到结果啦!!

SELECT*FROM UsersAudit
INSERT INTO Users VALUES('name1','tes');
SELECT*FROM UsersAudit

SQL Server CLR系列(2)-创建触发器与手动部署_第4张图片

你可能感兴趣的:(数据库)