使用C#创建SQL Server CLR触发器

1星 需积分: 50 60 下载量 25 浏览量 更新于2024-07-22 2 收藏 127KB DOC 举报
"C#在程序中创建数据库触发器并调用相关数据,主要涉及SQL Server 2014中的CLR(Common Language Runtime)触发器,这是.NET Framework与SQL Server集成的一部分,允许使用C#等.NET语言来编写触发器。" 在SQL Server 2014中,你可以使用C#来创建数据库触发器,这得益于SQL Server与.NET Framework的CLR集成。CLR触发器让你能够利用.NET Framework的强大功能来扩展SQL Server的功能,而不是局限于Transact-SQL。这种集成提供了更多的灵活性和更丰富的编程模型。 什么是触发器? 触发器是一种特殊的存储过程,它会在特定的数据库事件发生时自动执行。SQL Server有两种主要的触发器类型:DML(Data Manipulation Language)触发器和DDL(Data Definition Language)触发器。DML触发器在INSERT、UPDATE或DELETE语句执行后触发,用于监视和控制对表或视图的数据更改。DDL触发器则响应如CREATE、ALTER和DROP等数据库结构改变的语句,常用于执行审计和数据库操作的管理任务。 CLR触发器的特性 与使用Transact-SQL编写的触发器不同,CLR触发器有以下特点: 1. 它们可以访问INSERTED和DELETED虚拟表,这些表分别保存了操作前后数据的状态,使得在触发器中处理新旧数据变得可能。 2. CLR触发器可以识别UPDATE操作中修改了哪些列,虽然没有直接的UPDATE(column)和COLUMNS_UPDATED()函数,但可以通过SqlTriggerContext类获取这些信息。 3. 对于DDL触发器,它们能获取执行DDL语句影响的数据库对象的相关信息,这对于实施数据库级别的控制和审计非常有用。 使用SqlTriggerContext类 SqlTriggerContext类是专为CLR触发器设计的,它提供了触发器执行上下文的相关信息。这个类无法直接实例化,而是通过访问当前SqlContext的SqlTriggerContext属性来获取。例如: ```csharp SqlTriggerContext myTriggerContext = SqlContext.TriggerContext; ``` 通过这个类,你可以获取触发器被触发的原因(如INSERT、UPDATE或DELETE),以及在UPDATE操作中哪些列发生了变化等信息。 创建和调用CLR触发器 创建CLR触发器的过程通常涉及以下步骤: 1. 编写一个C#类,该类继承自`System.Data.SqlClient.SqlTrigger`,并实现所需的逻辑。 2. 将这个类编译成一个DLL。 3. 在SQL Server中创建一个Assembly,将DLL作为源。 4. 使用`CREATE TRIGGER`语句创建触发器,并指定使用刚创建的Assembly中的类。 使用C#创建的触发器可以在程序中调用,与普通的Transact-SQL触发器相同,但是其内部逻辑是用.NET代码实现的,这使得触发器可以调用.NET库,执行复杂的数据处理和业务逻辑。 使用C#创建数据库触发器提供了更强大的编程能力,使得你可以利用.NET Framework的功能来增强SQL Server的事件响应能力。然而,也需要注意,过度使用触发器可能导致性能问题,因此在设计时应考虑效率和可维护性。在某些情况下,使用触发器可能不是最佳选择,此时应考虑其他解决方案,如存储过程或应用层逻辑。
2017-05-06 上传
C# 访问Oracle示例+PL/SQL+存储过程+触发器 完整示例 测试可用 --PL/SQL基础1 declare begin dbms_output.('不输出不换行'); dbms_output.put_line('输出并换行'); end; --PL/SQL基础2 declare dig number(20,2); begin select avg(price) into dig from products; dbms_output.put_line('电子产品的平均价格是'||dig); end; --PL/SQL基础3 根据产品编号获得产品对象 --pname products.name%type; pname变量的类型与products.name列的类型一样 declare pid constant products.id%type:=1; --定义常量,初值1 pname products.name%type; pdate products.adddate%type; begin --pid:=1; select name,adddate into pname,pdate from products where id=pid; dbms_output.put_line('产品名称是:'||pname||',日期'||pdate); end; --PL/SQL基础4 根据产品编号获得产品对象 --obj products%rowtype; obj与products表的单行类型一样,可以通过点运算取值obj.price declare obj products%rowtype; begin select * into obj from products where id=&编号; dbms_output.put_line('产品名称是:'||obj.name||',价格:'||obj.price); end; --PL/SQL基础5 条件if declare vid products.id%type; vprice products.price%type; begin vid:=&编号; select price into vprice from products where id=vid; if vprice100 and vprice<=1000 then dbms_output.put_line('价格在100—1000之间'); else dbms_output.put_line('价格在1000以上'); end if; end; --PL/SQL基础5 多条件case begin case '&等级' when 'A' then dbms_output.put_line('优秀'); when 'B' then dbms_output.put_line('合格'); when 'C' then dbms_output.put_line('不合格'); end case; end; select id, name, typeid, price, adddate from products create table students( Id int primary key, sex int ) insert into students select 1,1 from dual union select 2,0 from dual union select 3,1 from dual union select 4,0 from dual union select 5,1 from dual insert into students(Id) values(6) select * from students; select translate(translate('1心1意 3心2意','1','一'),'3','三') from dual; select id,nvl(translate(translate(sex,1,'女'),0,'男'),'未知') from students; select id,case as 性别 from( sele