SQL的触发器
作者:admin 日期:2010-03-17
SQL代码
- [1].触发器的概念
- 触发器是一种特殊类型的存储过程,当指定表中的数据发生变化时触发器自动生效。它与表紧密相连,可以看做是表定义的一部分。触发器不能通过名称被直接调用,更不允许设置参数。
- 在SQL Server中一张表可以有多个触发器。用户可以跟据Insert、Update或Delete语句对触发器进行设置,也可以对一张表上的特定操作设置多个触发器。触发器可以包含复杂的Transact-SQL语句。不论触发器所进行的操作有多复杂,触发器都只作为一个独立的单元被执行,被看作是一个事务。如果在执行触发器的过程中发生了错误,则整个事务将会自动回滚。
- [2].触发器的优点
- 1.触发器自动执行
- 对表中的数据进行修改后,触发器立即被激活。
- 2.可以调用存储过程
- 为了实现复杂的数据库更新操作,触发器可以调用一个或多个存储过程,甚至可以通过调用外部过程(不是数据库管理系统本身)完成相应的操作。
- 3.可以强化数据条件约束
- 触发器能够实现比CHECK约束更为复杂的数据完整性约束。在数据库中,为了实现数据完整性约束,可以使用CHECK约束或触发器。CHECK约束不允许引用其他表中的列来完成检查工作,而触发器可以引用其他表中的列。它更适合在大型数据库管理系统中用来约束数据的完整性。
- 4.触发器可以楚止或回滚违反引用完整性的更改
- 触发器可以检测数据库内的操作,从而取消了数据库未经许可的更新操作,使数据库修改、更新操作更安全,数据库的运行也更稳定。
- 5.级联、并行运行
- 触发器能够对数据库中的相关表实现级联更改。触发器是基于一个表创建的,但是可以针对多个表进行操作,实现数据库中相关表的级联更改。
- 6.同表多触发器
- 一个表中可以同时存在3个不同操作的触发器(Insert、Update和Delete)。
- [3].触发器的种类
- SQL Server支持两种类型的触发器:AFTER触发器和INSTEAD OF触发器。
- AFTER触发器又称为后触发器,该类触发器是在引起触发器执行的修改语句成功完成后执行。此类触发器只有在执行某一操作(Insert、Update和Delete)之后,触发器才被触发,如果修改语句错误,触发器将不会执行。AFTER触发器只能定义在表上,不能创建在视图上,但可以为针对表的同一操作定义多个触发器。可使用 sp_settriggerorder指定表上第一个和最后一个执行的AFTER触发器,在表上只能为每个INSETR、Update和Delete操作规程指定第一个执行和最后一个执行的AFTER触发器。
- INSTEAD OF触发器又称为替代触发器,当引起触发器执行的修改语句停止时,该类触发器代替触发操作执行。它可以在表上定义,也可以在视图上定义。对于每个触发操作(Insert、Update和Delete),只能定义一个INSTEAD OF触发器。
- INSTEAD OF触发器与AFTER触发器的最大不同之处在于INSTEAD OF触发器并不是在执行预定义的操作(如Insert、Update和Delete)时被触发,而仅仅是执行触发器本身。
- [4].触发器的创建
- 1.使用企业管理器创建触发器
- 在企业管理器中为数据库“MR_SQL”中的“MR_Stu_XX”表创建一个名为 “TRI_StuXX_Insert”的触发器,实现在“MR_Stu_XX”表中添加数据时,在“TRI_pp”表中自动添加数据。
- 操作步骤如下:
- (1)在操作系统的任务栏中单击“开始”菜单,选择“程序”→“Microsoft SQL Server”→“企业管理器” 命令,打开控制台目录。
- (2)在控制台目录中依次展开Microsoft SQL Server、SQL Server组、服务器、数据库的节点。
- (3)选择指定数据库中的指定表,单击鼠标右键,在快捷菜单中选择“所有任务”→“管理触发器”命令。
- (4)执行“管理触发器”命令后,打开“触发器属性”对话框,如图1所示。在“名称”文本框中输入触发器的名称,例如用触发器名“TRI_StuXX_Insert”替换[TRIGGER NAME],如图2所示。
- (5)删除FOR关键字后面的Update和Delete,使触发器具有添加(Insert)功能,如果让触发器具有更新或删除的功能,在FOR关键字后面保留Update或 Delete,Insert 、Update和Delete可以同时使用。
- (6)在“文本”文本框中输入触发器文本,SQL语句如下。
- Insert INTO TRI_pp (MR_id,MR_name,MR_char,MR_sum,MR_eng) VALUES ('001','张三',0.0,0.0,0.0)
- (7)如果没有任何错误,单击“应用”按钮,将触发器保存到数据库中。
- 2.使用Transact-SQL创建触发器
- Create TRIGGER语句用于创建触发器,触发器是一种特殊的存储过程,在用户试图对指定的表执行指定的数据修改语句时自动执行。 SQL Server 允许为任何给定的Insert、Update或Delete语句创建多个触发器。
- 语法:
- Create TRIGGER trigger_name
- ON { table | view }
- [ WITH ENCRYPTION ]
- {
- { { FOR | AFTER | INSTEAD OF } { [ Insert ] [ , ] [ Update ] }
- [ WITH APPEND ]
- [ NOT FOR REPLICATION ]
- AS
- [ { IF Update ( column )
- [ { AND | or } Update ( column ) ]
- [ ...n ]
- | IF ( COLUMNS_UpdateD ( ) { bitwise_operator } updated_bitmask )
- { comparison_operator } column_bitmask [ ...n ]
- } ]
- sql_statement [ ...n ]
- }
- }
- 参数说明:
- l trigger_name:触发器的名称。触发器名称必须符合标识符规则,并且在数据库中必须惟一。可以选择是否指定触发器所有者名称。
- l table | view:执行触发器的表或视图,有时称为触发器表或触发器视图。可以选择是否指定表或视图的所有者名称。
- l AFTER:指定触发器只有在触发SQL语句中指定的所有操作都已成功执行后才被激活。所有的引用级联操作和约束检查也必须成功完成后,才能执行此触发器。
- l INSTEAD OF:指定执行触发器而不是执行触发 SQL 语句,从而替代触发语句的操作。
- l WITH APPEND:指定应该添加现有类型的其他触发器。只有当兼容级别是65或更低时,才需要使用该可选子句。
- l NOT FOR REPLICATION:表示当复制进程更改触发器所涉及的表时,不应执行该触发器。
- l AS:触发器要执行的操作。
- l sql_statement:触发器的条件和操作。触发器条件指定其他准则,以确定Delete、Insert或Update语句是否导致执行触发器操作。
- l column:要测试 Insert或Update操作的列名。该列可以是SQL Server支持的任何数据类型。
- l bitwise_operator:用于比较运算的位运算符。
- l updated_bitmask:整型位掩码,表示实际更新或插入的列。
- l comparison_operator:比较运算符。使用等号(=)检查updated_bitmask中指定的所有列是否都实际进行了更新。使用大于号(>)检查 updated_bitmask中指定的任一列或某些列是否已更新。
- l column_bitmask:要检查的列的整型位掩码,用来检查是否已更新或插入了这些列。
- 本示例是建立两个相关表“MR_Stu_XX”和“MR_Stu_CJ”,它们都有“学生编号”和 “学生姓名”字段,并且类型相同。在“MR_Stu_XX”表中创建三个触发器,在对“MR_Stu_XX”表进行添加修改的同时,对 “MR_Stu_CJ”表也进行相应的操作。
- 操作步骤如下:
- (1)在“MR_SQL”数据库中创建“MR_Stu_CJ”表和 “MR_Stu_XX”表。
- (2)为“MR_Stu_XX”表创建触发器,SQL语句如下:
- 用Insert语句创建触发器,当在 “MR_Stu_XX”表中添加数据时,“MR_Stu_CJ”表也添加相应的数据。SQL语句如下:
- USE MR_SQL
- GO
- Create TRIGGER TRI_StuXX_Insert ON dbo.MR_Stu_XX
- FOR Insert
- AS
- DECLARE @id Char(4),@name Char(10)
- Select @id=学生编号,@name=学生姓名 from inserted
- Insert INTO MR_Stu_CJ (学生编号,学生姓名,语文,数学,英语) VALUES (@id,@name,0.0,0.0,0.0)
- GO
- 注意:在表中添加数据时,将添加的数据存放在系统临时表“inserted”中。
- 用Delete语句创建触发器,当在 “MR_Stu_XX”表中删除数据时,“MR_Stu_CJ”表也删除相应的数据。SQL语句如下:
- USE MR_SQL
- GO
- Create TRIGGER TRI_StuXX_Delete ON [dbo].[MR_Stu_XX]
- FOR Delete
- AS
- DECLARE @id char(4),@name char(10)
- select @id=学生编号,@name=学生姓名 from deleted
- Delete MR_Stu_CJ where 学生编号=@id and 学生姓名=@name
- GO
- 注意:在表中删除数据时,将删除的数据存放在系统临时表deleted中。
- 用Update语句创建触发器,当在“MR_Stu_XX”表中更新数据时,“MR_Stu_CJ”表也更新相应的数据。SQL语句如下:
- USE MR_SQL
- GO
- Create TRIGGER TRI_StuXX_Uudate ON [dbo].[MR_Stu_XX]
- FOR Update
- AS
- DECLARE @id char(4),@name char(10)
- select @id=学生编号 from deleted
- select @name=学生姓名 from Inserted
- Update MR_Stu_CJ SET 学生姓名=@name Where 学生编号 = @id
- GO
- 注意:在表中更新数据时,将更新前的数据存放在系统临时表“deleted”中,将更新后的数据存放在系统临时表“inserted”中。
- 3.创建触发器的注意事项
- (1)触发器是一个数据库对象,它的命名必须符合SQL Server 2000的标识符命名规则。
- (2)Create TRIGGER语句必须是批处理中的第一个语句。也就是说,如果该语句前面还有其他语句,应该使用批处理结束符GO隔开。
- (3)不能在临时表或系统表上创建触发器,但是在触发器中可以引用临时表,不能引用系统表。
- (4)创建触发器的权限默认分配给表的所有者,且不能将该权限转给其他用户。
- (5)触发器可以引用当前数据库以外的对象,但只能在当前数据库中创建触发器。
- (6)在含有用 Delete或Update操作定义的外键的表中,不能定义INSTEAD OF和INSTEAD OF Update触发器。
- (7)WRITETEXT 语句不会引发Insert或Update触发器。
- (8)TRUNCATE TABLE语句不能引发Delete触发器,因为该语句没有记录。
SQL Server的触发器
作者:admin 日期:2010-03-16
[1].触发器的概念
触发器是一种特殊类型的存储过程,当指定表中的数据发生变化时触发器自动生效。它与表紧密相连,可以看做是表定义的一部分。触发器不能通过名称被直接调用,更不允许设置参数。
在SQL Server中一张表可以有多个触发器。用户可以跟据Insert、Update或Delete语句对触发器进行设置,也可以对一张表上的特定操作设置多个触发器。触发器可以包含复杂的Transact-SQL语句。不论触发器所进行的操作有多复杂,触发器都只作为一个独立的单元被执行,被看作是一个事务。如果在执行触发器的过程中发生了错误,则整个事务将会自动回滚。
Delphi与SQL触发器
作者:admin 日期:2010-03-16
Delphi代码
- 触发器
- 1.利用触发器添加数据
- 用触发器对相关表添加数据时,所添加的记录将存储在系统临时表“inserted”中,可以将该表中的字段信息添加到其他表的相应字段中。在用触发器向其他表添加数据时,应注意表中的字段是否有不为空的记录。
- 下面利用触发器在“tb_Stu”表中添加记录后,在“tb_Mark”表中会自动添加相应的记录。
- 操作步骤如下:
- (1)运行Delphi,在窗体中添加TADOConnection、TADOQuery、TDataSource、TButton、TEdit和TDBGrid等组件。
- (2)主要程序代码如下:
- with ADOQuery3 do
- begin
- Close;
- SQL.Clear;
- SQL.Add('Create TRIGGER '+Edit1.Text+' ON dbo.tb_Stu');
- SQL.Add('FOR Insert');
- SQL.Add('AS');
- SQL.Add('DECLARE @id Int,@name varChar(10)');
- SQL.Add('Select @id=学生编号,@name=学生姓名 from inserted');
- SQL.Add('Insert INTO tb_Mark (学生编号,学生姓名,高数,外语,计算机文化基础,马经,数据库管理,数据结构,软件工程) VALUES (@id,@name,0,0,0,0,0,0,0)');
- EXECSQL;
- end;
- 2.利用触发器更新数据
- 在表中更新数据时,将更新前的数据存放在系统临时表“deleted”中,将更新后的数据存放在系统临时表“inserted”中。在触发器中可以根据“deleted”表中的字段对相关表进行查询,并用“inserted”表中的数据修改相关表中的信息。
- 下面利用触发器在“tb_Stu”表中更新记录后,在“tb_Mark”表中会自动更新相关的数据。
- 操作步骤如下:
- (1)运行Delphi,在窗体中添加TADOConnection、TADOQuery、TDataSource、TButton、TEdit和TDBGrid等组件。
- (2)主要程序代码如下:
- with ADOQuery3 do
- begin
- Close;
- SQL.Clear;
- SQL.Add('Create TRIGGER '+Edit1.Text+' ON dbo.tb_Stu');
- SQL.Add('FOR Update');
- SQL.Add('AS');
- SQL.Add('DECLARE @id Int,@name varchar(10)');
- SQL.Add('select @id=学生编号 from deleted');
- SQL.Add('select @name=学生姓名 from Inserted');
- SQL.Add('Update tb_Mark SET 学生姓名=@name Where 学生编号 = @id');
- EXECSQL;
- end;
- 3.利用触发器删除数据
- 在对表中的数据进行删除时,会将删除的记录存入系统临时表“deleted”中,触发器将利用该表中的信息在相关表中进行查询,并删除符合条件的记录。
- * 注意:如果某两个表是一对一的关系,那么触发器应创建在从表中。
- 下面利用触发器在“tb_Stu”表中删除记录后,“tb_Mark”表将自动删除相关的记录。
- 操作步骤如下:
- (1)运行Delphi,在窗体中添加TADOConnection、TADOQuery、TDataSource、TButton、TEdit和TDBGrid等组件。
- (2)主要程序代码如下:
- with ADOQuery3 do
- begin
- Close;
- SQL.Clear;
- SQL.Add('Create TRIGGER '+Edit1.Text+' ON dbo.tb_Stu');
- SQL.Add('FOR Delete ');
- SQL.Add('AS');
- SQL.Add('DECLARE @id Int,@name varchar(10)');
- SQL.Add('select @id=学生编号,@name=学生姓名 from deleted');
- SQL.Add('Delete tb_Mark where 学生编号=@id and 学生姓名=@name');
- EXECSQL;
- end;







