Tag: 触发器预览模式: 普通 | 列表

SQL的触发器

SQL代码
  1. [1].触发器的概念  
  2. 触发器是一种特殊类型的存储过程,当指定表中的数据发生变化时触发器自动生效。它与表紧密相连,可以看做是表定义的一部分。触发器不能通过名称被直接调用,更不允许设置参数。  
  3.   
  4. 在SQL Server中一张表可以有多个触发器。用户可以跟据InsertUpdateDelete语句对触发器进行设置,也可以对一张表上的特定操作设置多个触发器。触发器可以包含复杂的Transact-SQL语句。不论触发器所进行的操作有多复杂,触发器都只作为一个独立的单元被执行,被看作是一个事务。如果在执行触发器的过程中发生了错误,则整个事务将会自动回滚。  
  5.   
  6. [2].触发器的优点  
  7. 1.触发器自动执行  
  8. 对表中的数据进行修改后,触发器立即被激活。  
  9.   
  10. 2.可以调用存储过程  
  11. 为了实现复杂的数据库更新操作,触发器可以调用一个或多个存储过程,甚至可以通过调用外部过程(不是数据库管理系统本身)完成相应的操作。  
  12.   
  13. 3.可以强化数据条件约束  
  14. 触发器能够实现比CHECK约束更为复杂的数据完整性约束。在数据库中,为了实现数据完整性约束,可以使用CHECK约束或触发器。CHECK约束不允许引用其他表中的列来完成检查工作,而触发器可以引用其他表中的列。它更适合在大型数据库管理系统中用来约束数据的完整性。  
  15.   
  16. 4.触发器可以楚止或回滚违反引用完整性的更改  
  17. 触发器可以检测数据库内的操作,从而取消了数据库未经许可的更新操作,使数据库修改、更新操作更安全,数据库的运行也更稳定。  
  18.   
  19. 5.级联、并行运行  
  20. 触发器能够对数据库中的相关表实现级联更改。触发器是基于一个表创建的,但是可以针对多个表进行操作,实现数据库中相关表的级联更改。  
  21.   
  22. 6.同表多触发器  
  23. 一个表中可以同时存在3个不同操作的触发器(InsertUpdateDelete)。  
  24.   
  25. [3].触发器的种类  
  26. SQL Server支持两种类型的触发器:AFTER触发器和INSTEAD OF触发器。  
  27.   
  28. AFTER触发器又称为后触发器,该类触发器是在引起触发器执行的修改语句成功完成后执行。此类触发器只有在执行某一操作(InsertUpdateDelete)之后,触发器才被触发,如果修改语句错误,触发器将不会执行。AFTER触发器只能定义在表上,不能创建在视图上,但可以为针对表的同一操作定义多个触发器。可使用 sp_settriggerorder指定表上第一个和最后一个执行的AFTER触发器,在表上只能为每个INSETR、UpdateDelete操作规程指定第一个执行和最后一个执行的AFTER触发器。  
  29.   
  30. INSTEAD OF触发器又称为替代触发器,当引起触发器执行的修改语句停止时,该类触发器代替触发操作执行。它可以在表上定义,也可以在视图上定义。对于每个触发操作(InsertUpdateDelete),只能定义一个INSTEAD OF触发器。  
  31.   
  32. INSTEAD OF触发器与AFTER触发器的最大不同之处在于INSTEAD OF触发器并不是在执行预定义的操作(如InsertUpdateDelete)时被触发,而仅仅是执行触发器本身。  
  33.   
  34. [4].触发器的创建  
  35.   
  36. 1.使用企业管理器创建触发器  
  37.   
  38. 在企业管理器中为数据库“MR_SQL”中的“MR_Stu_XX”表创建一个名为 “TRI_StuXX_Insert”的触发器,实现在“MR_Stu_XX”表中添加数据时,在“TRI_pp”表中自动添加数据。  
  39.   
  40. 操作步骤如下:  
  41.   
  42. (1)在操作系统的任务栏中单击“开始”菜单,选择“程序”→“Microsoft SQL Server”→“企业管理器” 命令,打开控制台目录。  
  43.   
  44. (2)在控制台目录中依次展开Microsoft SQL Server、SQL Server组、服务器、数据库的节点。  
  45.   
  46. (3)选择指定数据库中的指定表,单击鼠标右键,在快捷菜单中选择“所有任务”→“管理触发器”命令。  
  47.   
  48. (4)执行“管理触发器”命令后,打开“触发器属性”对话框,如图1所示。在“名称”文本框中输入触发器的名称,例如用触发器名“TRI_StuXX_Insert”替换[TRIGGER NAME],如图2所示。  
  49.   
  50. (5)删除FOR关键字后面的UpdateDelete,使触发器具有添加(Insert)功能,如果让触发器具有更新或删除的功能,在FOR关键字后面保留Update或 DeleteInsert 、UpdateDelete可以同时使用。  
  51.   
  52. (6)在“文本”文本框中输入触发器文本,SQL语句如下。  
  53. Insert INTO TRI_pp (MR_id,MR_name,MR_char,MR_sum,MR_eng) VALUES ('001','张三',0.0,0.0,0.0)  
  54.   
  55. (7)如果没有任何错误,单击“应用”按钮,将触发器保存到数据库中。  
  56.   
  57.   
  58. 2.使用Transact-SQL创建触发器  
  59.   
  60. Create TRIGGER语句用于创建触发器,触发器是一种特殊的存储过程,在用户试图对指定的表执行指定的数据修改语句时自动执行。 SQL Server 允许为任何给定的InsertUpdateDelete语句创建多个触发器。  
  61.   
  62. 语法:  
  63.   
  64. Create TRIGGER trigger_name  
  65.   
  66. ON { table | view }  
  67.   
  68. WITH ENCRYPTION ]  
  69.   
  70. {  
  71.   
  72.    { { FOR | AFTER | INSTEAD OF } { [ Insert ] [ , ] [ Update ] }  
  73.   
  74.       [ WITH APPEND ]  
  75.   
  76.       [ NOT FOR REPLICATION ]  
  77.   
  78.       AS  
  79.   
  80.       [ { IF Update ( column )  
  81.   
  82.       [ { AND | or } Update ( column ) ]  
  83.   
  84.          [ ...n ]  
  85.   
  86.       | IF ( COLUMNS_UpdateD ( ) { bitwise_operator } updated_bitmask )  
  87.   
  88.         { comparison_operator } column_bitmask [ ...n ]  
  89.   
  90.       } ]  
  91.   
  92.       sql_statement [ ...n ]  
  93.   
  94.    }  
  95.   
  96. }  
  97.   
  98. 参数说明:  
  99.   
  100. l    trigger_name:触发器的名称。触发器名称必须符合标识符规则,并且在数据库中必须惟一。可以选择是否指定触发器所有者名称。  
  101.   
  102. l    table | view:执行触发器的表或视图,有时称为触发器表或触发器视图。可以选择是否指定表或视图的所有者名称。  
  103.   
  104. l    AFTER:指定触发器只有在触发SQL语句中指定的所有操作都已成功执行后才被激活。所有的引用级联操作和约束检查也必须成功完成后,才能执行此触发器。  
  105.   
  106. l    INSTEAD OF:指定执行触发器而不是执行触发 SQL 语句,从而替代触发语句的操作。  
  107.   
  108. l    WITH APPEND:指定应该添加现有类型的其他触发器。只有当兼容级别是65或更低时,才需要使用该可选子句。  
  109.   
  110. l    NOT FOR REPLICATION:表示当复制进程更改触发器所涉及的表时,不应执行该触发器。  
  111.   
  112. l    AS:触发器要执行的操作。  
  113.   
  114. l    sql_statement:触发器的条件和操作。触发器条件指定其他准则,以确定DeleteInsertUpdate语句是否导致执行触发器操作。  
  115.   
  116. l    column:要测试 InsertUpdate操作的列名。该列可以是SQL Server支持的任何数据类型。  
  117.   
  118. l    bitwise_operator:用于比较运算的位运算符。  
  119.   
  120. l    updated_bitmask:整型位掩码,表示实际更新或插入的列。  
  121.   
  122. l    comparison_operator:比较运算符。使用等号(=)检查updated_bitmask中指定的所有列是否都实际进行了更新。使用大于号(>)检查 updated_bitmask中指定的任一列或某些列是否已更新。  
  123.   
  124. l    column_bitmask:要检查的列的整型位掩码,用来检查是否已更新或插入了这些列。  
  125.   
  126. 本示例是建立两个相关表“MR_Stu_XX”和“MR_Stu_CJ”,它们都有“学生编号”和 “学生姓名”字段,并且类型相同。在“MR_Stu_XX”表中创建三个触发器,在对“MR_Stu_XX”表进行添加修改的同时,对 “MR_Stu_CJ”表也进行相应的操作。  
  127. 操作步骤如下:  
  128. (1)在“MR_SQL”数据库中创建“MR_Stu_CJ”表和 “MR_Stu_XX”表。  
  129. (2)为“MR_Stu_XX”表创建触发器,SQL语句如下:  
  130. Insert语句创建触发器,当在 “MR_Stu_XX”表中添加数据时,“MR_Stu_CJ”表也添加相应的数据。SQL语句如下:  
  131.   
  132. USE MR_SQL  
  133. GO  
  134. Create TRIGGER TRI_StuXX_Insert ON dbo.MR_Stu_XX  
  135. FOR Insert  
  136. AS  
  137. DECLARE @id Char(4),@name Char(10)  
  138. Select @id=学生编号,@name=学生姓名  from inserted  
  139. Insert INTO MR_Stu_CJ (学生编号,学生姓名,语文,数学,英语) VALUES (@id,@name,0.0,0.0,0.0)  
  140. GO  
  141. 注意:在表中添加数据时,将添加的数据存放在系统临时表“inserted”中。  
  142.   
  143. Delete语句创建触发器,当在 “MR_Stu_XX”表中删除数据时,“MR_Stu_CJ”表也删除相应的数据。SQL语句如下:  
  144. USE MR_SQL  
  145. GO  
  146. Create TRIGGER TRI_StuXX_Delete ON [dbo].[MR_Stu_XX]  
  147. FOR Delete  
  148. AS  
  149. DECLARE @id char(4),@name char(10)  
  150. select @id=学生编号,@name=学生姓名 from deleted  
  151. Delete MR_Stu_CJ where 学生编号=@id and 学生姓名=@name  
  152. GO  
  153. 注意:在表中删除数据时,将删除的数据存放在系统临时表deleted中。  
  154.   
  155. Update语句创建触发器,当在“MR_Stu_XX”表中更新数据时,“MR_Stu_CJ”表也更新相应的数据。SQL语句如下:  
  156. USE MR_SQL  
  157. GO  
  158. Create TRIGGER TRI_StuXX_Uudate ON [dbo].[MR_Stu_XX]  
  159. FOR Update  
  160. AS  
  161. DECLARE @id char(4),@name char(10)  
  162. select @id=学生编号 from deleted  
  163. select @name=学生姓名 from Inserted  
  164. Update MR_Stu_CJ SET 学生姓名=@name Where 学生编号 = @id  
  165. GO  
  166. 注意:在表中更新数据时,将更新前的数据存放在系统临时表“deleted”中,将更新后的数据存放在系统临时表“inserted”中。  
  167.   
  168. 3.创建触发器的注意事项  
  169.   
  170. (1)触发器是一个数据库对象,它的命名必须符合SQL Server 2000的标识符命名规则。  
  171.   
  172. (2)Create TRIGGER语句必须是批处理中的第一个语句。也就是说,如果该语句前面还有其他语句,应该使用批处理结束符GO隔开。  
  173.   
  174. (3)不能在临时表或系统表上创建触发器,但是在触发器中可以引用临时表,不能引用系统表。  
  175.   
  176. (4)创建触发器的权限默认分配给表的所有者,且不能将该权限转给其他用户。  
  177.   
  178. (5)触发器可以引用当前数据库以外的对象,但只能在当前数据库中创建触发器。  
  179.   
  180. (6)在含有用 DeleteUpdate操作定义的外键的表中,不能定义INSTEAD OFINSTEAD OF Update触发器。  
  181.   
  182. (7)WRITETEXT 语句不会引发InsertUpdate触发器。  
  183.   
  184. (8)TRUNCATE TABLE语句不能引发Delete触发器,因为该语句没有记录。  

Tags: SQL 触发器

分类:MSSQL | 固定链接 | 评论: 0 | 引用: 0 | 查看次数: 73

SQL Server的触发器


[1].触发器的概念
触发器是一种特殊类型的存储过程,当指定表中的数据发生变化时触发器自动生效。它与表紧密相连,可以看做是表定义的一部分。触发器不能通过名称被直接调用,更不允许设置参数。

在SQL Server中一张表可以有多个触发器。用户可以跟据Insert、Update或Delete语句对触发器进行设置,也可以对一张表上的特定操作设置多个触发器。触发器可以包含复杂的Transact-SQL语句。不论触发器所进行的操作有多复杂,触发器都只作为一个独立的单元被执行,被看作是一个事务。如果在执行触发器的过程中发生了错误,则整个事务将会自动回滚。

查看更多...

Tags: SQL 触发器

分类:MSSQL | 固定链接 | 评论: 0 | 引用: 0 | 查看次数: 189

Delphi与SQL触发器

Delphi代码
  1. 触发器  
  2.   
  3. 1.利用触发器添加数据  
  4. 用触发器对相关表添加数据时,所添加的记录将存储在系统临时表“inserted”中,可以将该表中的字段信息添加到其他表的相应字段中。在用触发器向其他表添加数据时,应注意表中的字段是否有不为空的记录。  
  5. 下面利用触发器在“tb_Stu”表中添加记录后,在“tb_Mark”表中会自动添加相应的记录。  
  6. 操作步骤如下:  
  7. 1)运行Delphi,在窗体中添加TADOConnection、TADOQuery、TDataSource、TButton、TEdit和TDBGrid等组件。  
  8. 2)主要程序代码如下:  
  9.   with ADOQuery3 do  
  10.   begin  
  11.     Close;  
  12.     SQL.Clear;  
  13.     SQL.Add('Create TRIGGER '+Edit1.Text+' ON dbo.tb_Stu');  
  14.     SQL.Add('FOR Insert');  
  15.     SQL.Add('AS');  
  16.     SQL.Add('DECLARE @id Int,@name varChar(10)');  
  17.     SQL.Add('Select @id=学生编号,@name=学生姓名  from inserted');  
  18.     SQL.Add('Insert INTO tb_Mark (学生编号,学生姓名,高数,外语,计算机文化基础,马经,数据库管理,数据结构,软件工程) VALUES (@id,@name,0,0,0,0,0,0,0)');  
  19.     EXECSQL;  
  20.   end;  
  21.     
  22.     
  23. 2.利用触发器更新数据  
  24. 在表中更新数据时,将更新前的数据存放在系统临时表“deleted”中,将更新后的数据存放在系统临时表“inserted”中。在触发器中可以根据“deleted”表中的字段对相关表进行查询,并用“inserted”表中的数据修改相关表中的信息。  
  25. 下面利用触发器在“tb_Stu”表中更新记录后,在“tb_Mark”表中会自动更新相关的数据。  
  26. 操作步骤如下:  
  27. 1)运行Delphi,在窗体中添加TADOConnection、TADOQuery、TDataSource、TButton、TEdit和TDBGrid等组件。  
  28. 2)主要程序代码如下:  
  29.   with ADOQuery3 do  
  30.   begin  
  31.     Close;  
  32.     SQL.Clear;  
  33.     SQL.Add('Create TRIGGER '+Edit1.Text+' ON dbo.tb_Stu');  
  34.     SQL.Add('FOR Update');  
  35.     SQL.Add('AS');  
  36.     SQL.Add('DECLARE @id Int,@name varchar(10)');  
  37.     SQL.Add('select @id=学生编号 from deleted');  
  38.     SQL.Add('select @name=学生姓名 from Inserted');  
  39.     SQL.Add('Update tb_Mark SET 学生姓名=@name Where 学生编号 = @id');  
  40.     EXECSQL;  
  41.   end;  
  42.     
  43.     
  44. 3.利用触发器删除数据  
  45. 在对表中的数据进行删除时,会将删除的记录存入系统临时表“deleted”中,触发器将利用该表中的信息在相关表中进行查询,并删除符合条件的记录。  
  46. * 注意:如果某两个表是一对一的关系,那么触发器应创建在从表中。  
  47. 下面利用触发器在“tb_Stu”表中删除记录后,“tb_Mark”表将自动删除相关的记录。  
  48. 操作步骤如下:  
  49. 1)运行Delphi,在窗体中添加TADOConnection、TADOQuery、TDataSource、TButton、TEdit和TDBGrid等组件。  
  50. 2)主要程序代码如下:  
  51.   with ADOQuery3 do  
  52.   begin  
  53.     Close;  
  54.     SQL.Clear;  
  55.     SQL.Add('Create TRIGGER '+Edit1.Text+' ON dbo.tb_Stu');  
  56.     SQL.Add('FOR Delete ');  
  57.     SQL.Add('AS');  
  58.     SQL.Add('DECLARE @id Int,@name varchar(10)');  
  59.     SQL.Add('select @id=学生编号,@name=学生姓名 from deleted');  
  60.     SQL.Add('Delete tb_Mark where 学生编号=@id and 学生姓名=@name');  
  61.     EXECSQL;  
  62.   end;  

Tags: Delphi 触发器

分类:Delphi | 固定链接 | 评论: 0 | 引用: 0 | 查看次数: 81