关闭

触发器

210人阅读 评论(0) 收藏 举报
分类:


 一张清晰的图,勾起你学习的兴趣:

 

 

 

 

 详细的内容介绍满足你学习的热情:

 

 

 

壹:触发器的基本内容

 

一,概念:

 是一种特殊类型的存储过程。

 又不同于普通的存储过程。

 主要区别:1,触发器主要是通过事件进行触发而被执行的(例如:插入、修改或删除记录时,SQL Server就会自动执行触发器所定义的SQL语句,以确保数据的完整性)

          2,而存储过程可以通过存储过程的名称直接被调用

 

二,功能:

1,级联修改数据库中相关的表

例如:数据库company中有两个表:

(本表纯属虚构,请勿模仿)

 project表:

项目信息

项目合作客户名

2012730号翻盖狼房师范学院

韩学敏

201283号收购世纪石油学院

陈金荣

201284号起诉圆晨

李双喆

201086号捐资孤儿院

李双喆

customer表:

客户名

公司

职务

陈金荣

家里蹲大学

校长

李双喆

无所事事企业

公关部门总经理

韩学敏

游手好闲有限公司

总裁

如上两张表:如果在project表中将所有客户名为“李双喆”的字段改为null或其他值,或者删除整条和“李双喆”有关的记录,而使用触发器就可以实现这样的功能。

2,执行比核查约束更为复杂的约束操作。

 (在触发器中可以书写更为复杂的TSQL语句。例如:可以引用多个表,并使用if...else等语句做更复杂的检查)

3,拒绝或回滚违反引用完整的操作。检查对数据表的操作是否违反引用完整性,并选择相应的操作。

4,比较表修改前后之间的差别,并根据差别采取相应的操作。

例如:若想规定每次工资的变动幅度不能超过40%,使用触发器可以将改后的表数据和修改前的表数据进行比较,若超出40%,可以回滚该修改操作。

 

三,类型(5种):

 1Update触发器:进行更新操作时触发。

 2Insert触发器:进行插入操作时触发。

 3Delete触发器:进行删除操作时触发。

 4Instead of触发器:不执行插入、更新、删除操作时,将触发Instead of触发器。

 5After触发器:在一个触发动作发生之后激发,并提供一种机制以便控制多个触发器的执行顺序。

 

注意1Insert ofAfter触发器是SQL Server2000新增的触发器。

                  2,须知After触发器(1)要求只有执行某一操作(InsertUpdateDelete)之后触发器才被触发,且只能在表上定义。(2)可以为针对表的同一操作定义多个触发器。(3After触发器可以定义哪一个触发器被最先触发,哪一个被最后触发,通常使用系统过程sp_settriggerorder来完成此任务。

                 3,须知Instead of触发器:(1)此触发器表示并不执行其所定义的操作(InsertUpdateDelete)而仅是执行触发器本身。(2)既可在表上定义Instead of触发器,也可以在视图上定义;但对同一操作只能定义一个。)

 

四,主要优点:

1,触发器是自动的:当对表中的数据作了任何修改(比如手工输入或者应用程序才去的操作)之后立即被激活。——一触即发

2,触发器可以通过数据库中的相关表进行层叠更改。

3,触发器可以强制限制,这些限制比用Check约束所定义的更复杂。而且比使用核查约束更为方便的是,触发器可以引用其他数据表中的列。

 

 

五,创建触发器的规则和限制:

 

1Create Trigger语句必须是批处理中的第一个语句,且该批处理中随和出现的其它所有语句都将被解释为Create Trigger语句定义的一部分。

2,在默认情况下,创建触发器的权限将分配给数据表的所有者,且不能将该权限转给其它用户。

3,触发器是数据库对象,其名称必须遵循标识符的命名规则。

4,虽然触发器可以引用当前数据库以外的对象,但只能在当前数据库中创建触发器。

 

5,虽然不能在临时数据表上创建触发器,但是触发器可以引用临时数据表。

6,既不能在系统数据表上创建触发器,也不可以引用系统数据表。

7,在包含使用deleteupdate操作定义的外键的表中,不能定义instead of instead of update触发器。

8,虽然Trucate Table语句类似于没有Where子句(用于删除行)的Delete语句,丹他并不会引发Delete触发器,因为Truncate Table语句没有被记入日志。

9Writetext语句不会引发insertupdate触发器。

10,下面的语句不可以用于创建触发器:Alter DatabaseCreate DatabaseDisk InitDisk Resize Drop DatabaseLoad DatabaseLoad LogReconfigureReconfigureRestore DatabaseRestore Log

11,当创建一个触发器时必须指定:(1)名称(2)在其上定义触发器的表(3)触发器将何时激发;(4)激活触发器的数据修改语句

 

 

贰:触发器的管理

 

一,使用企业管理器管理:

 1,创建

 2,查看:(1)查看相关数据;

         2)查看定义文本;

                     

 3,修改

 4,删除

二,使用TSQL语句管理:

 

1,创建

2,查看:(1)查看相关数据;

         2)查看定义文本;

         3)查看所有者和创建日期

3,修改

4,删除

                                                   

详细介绍使用TSQL语句管理触发器:

1,创建:

1)语法格式

Create Trigger trigger_name

On Table| View

[With Encryption]

{For | Afrer | Instead of}

{ [Insert] [, ] [Update]  [, ] [Delete] }

 AS

 sql_statements [...n]

 

 

 

2)各参数说明:

                  

trigger_name:是用户要创建的触发器的名字。触发器的名字必须符合MS SQL Server 的命名规则,且其名字在当前数据库中必须是惟一的

Table:是与用户创建的触发器相关联的表的名字,并且该表已经存在。

WITH ENCRYPTION:表示对包含有CREATE TRIGGER 文本的syscomments 表进行加密

[DELETE] [,] [INSERT] [,] [UPDATE]:关键字用来指明哪种数据操作将激活触发器,至少要指明一个选项,在触发器的定义中三者的顺序不受限制,且各选项要用逗号隔开。

AFTER:表示只有在执行了指定的操作INSERT、DELETE、UPDATE 之后触发器才被激活,执行触发器中的SQL语句。若使用关键字FOR ,则表示为AFTER 触发器,且该类型触发器仅能在表上创建。

INSTEAD OF:当为表或视图定义了针对某一操作INSERT、 DELETE、UPDATE 的INSTEAD OF 类型触发器,且执行了相应的操作时,尽管触发器被触发,但相应的操作并不被执行,而运行的仅是触发器SQL 语句本身。

 

3)例子:

    

Use company

Go

--创建触发器

Create trigger 触发器_欢迎新员工

On employee

After insert

As

Print ‘新员工加入本公司,欢迎欢迎!’

go

 

--创建触发器

Create trigger 触发器_员工走了

On employee

After delete

As

Print ‘真遗憾你离开公司!’

go

 

Set nocount on

--插入一条记录试试触发器操作

Insert into employee(员工id,姓名,性别,工资)

Values(20068,’赵一’,‘男’,1000)

--删除一条记录试试

Delete from employee

Where 员工id = ‘20067’

go

 

2,查看:

1)查看相关数据:

       

语法:exec_helptrigger 'table' [,'type']

参数说明:table:触发器所在的表名

                     Type:指定列出的操作类型的触发器。若不指定,则列出所有的 触发器

 

例子:exec sp_helptrgger 'employee'

 

 (2)查看定义文本:

语法:Sp_helptext'trigger_name'

例子:exec sp_helptext'触发器_欢迎新员工'

注意:若在定义触发器时对定义文本进行加密处理,则不能使用任何方法查看触发器的定义文本。)

3)查看所有者和创建日期:

语法:exec sp_help 'trigger_name'

例子:exec sp_help'触发器_欢迎新员工'

 

3,修改

语法格式:

ALTER TRIGGER trigger_name 
ON table|view 
[WITH ENCRYPTION] 
{FOR | AFTER | INSTEAD OF }

 { [DELETE] [,][INSERT][,][UPDATE]}
AS
  sql_statement[...n]

 

注意:就是创建触发器的语句中的create换为alter,其余部分完全相同。但是在alter trigger中引用的触发器名必须是已经存在的触发器名)

4,删除:

语法格式: Drop trigger trigger_name [,...n]

例子:Drop trigger触发器_员工走了

注意:当删除数据表时,也将同时删除所有与该数据表相关联的触发器。而且当删除触发器时,系统也将从sysobjects和syscomments系统表中删除有关该触发器的信息。)

 一张清晰的图,勾起你学习的兴趣:

 

 

 

 

 详细的内容介绍满足你学习的热情:

 

 

 

壹:触发器的基本内容

 

一,概念:

 是一种特殊类型的存储过程。

 又不同于普通的存储过程。

 主要区别:1,触发器主要是通过事件进行触发而被执行的(例如:插入、修改或删除记录时,SQL Server就会自动执行触发器所定义的SQL语句,以确保数据的完整性)

          2,而存储过程可以通过存储过程的名称直接被调用

 

二,功能:

1,级联修改数据库中相关的表

例如:数据库company中有两个表:

(本表纯属虚构,请勿模仿)

 project表:

项目信息

项目合作客户名

2012730号翻盖狼房师范学院

韩学敏

201283号收购世纪石油学院

陈金荣

201284号起诉圆晨

李双喆

201086号捐资孤儿院

李双喆

customer表:

客户名

公司

职务

陈金荣

家里蹲大学

校长

李双喆

无所事事企业

公关部门总经理

韩学敏

游手好闲有限公司

总裁

如上两张表:如果在project表中将所有客户名为“李双喆”的字段改为null或其他值,或者删除整条和“李双喆”有关的记录,而使用触发器就可以实现这样的功能。

2,执行比核查约束更为复杂的约束操作。

 (在触发器中可以书写更为复杂的TSQL语句。例如:可以引用多个表,并使用if...else等语句做更复杂的检查)

3,拒绝或回滚违反引用完整的操作。检查对数据表的操作是否违反引用完整性,并选择相应的操作。

4,比较表修改前后之间的差别,并根据差别采取相应的操作。

例如:若想规定每次工资的变动幅度不能超过40%,使用触发器可以将改后的表数据和修改前的表数据进行比较,若超出40%,可以回滚该修改操作。

 

三,类型(5种):

 1Update触发器:进行更新操作时触发。

 2Insert触发器:进行插入操作时触发。

 3Delete触发器:进行删除操作时触发。

 4Instead of触发器:不执行插入、更新、删除操作时,将触发Instead of触发器。

 5After触发器:在一个触发动作发生之后激发,并提供一种机制以便控制多个触发器的执行顺序。

 

注意1Insert ofAfter触发器是SQL Server2000新增的触发器。

                  2,须知After触发器(1)要求只有执行某一操作(InsertUpdateDelete)之后触发器才被触发,且只能在表上定义。(2)可以为针对表的同一操作定义多个触发器。(3After触发器可以定义哪一个触发器被最先触发,哪一个被最后触发,通常使用系统过程sp_settriggerorder来完成此任务。

                 3,须知Instead of触发器:(1)此触发器表示并不执行其所定义的操作(InsertUpdateDelete)而仅是执行触发器本身。(2)既可在表上定义Instead of触发器,也可以在视图上定义;但对同一操作只能定义一个。)

 

四,主要优点:

1,触发器是自动的:当对表中的数据作了任何修改(比如手工输入或者应用程序才去的操作)之后立即被激活。——一触即发

2,触发器可以通过数据库中的相关表进行层叠更改。

3,触发器可以强制限制,这些限制比用Check约束所定义的更复杂。而且比使用核查约束更为方便的是,触发器可以引用其他数据表中的列。

 

 

五,创建触发器的规则和限制:

 

1Create Trigger语句必须是批处理中的第一个语句,且该批处理中随和出现的其它所有语句都将被解释为Create Trigger语句定义的一部分。

2,在默认情况下,创建触发器的权限将分配给数据表的所有者,且不能将该权限转给其它用户。

3,触发器是数据库对象,其名称必须遵循标识符的命名规则。

4,虽然触发器可以引用当前数据库以外的对象,但只能在当前数据库中创建触发器。

 

5,虽然不能在临时数据表上创建触发器,但是触发器可以引用临时数据表。

6,既不能在系统数据表上创建触发器,也不可以引用系统数据表。

7,在包含使用deleteupdate操作定义的外键的表中,不能定义instead of instead of update触发器。

8,虽然Trucate Table语句类似于没有Where子句(用于删除行)的Delete语句,丹他并不会引发Delete触发器,因为Truncate Table语句没有被记入日志。

9Writetext语句不会引发insertupdate触发器。

10,下面的语句不可以用于创建触发器:Alter DatabaseCreate DatabaseDisk InitDisk Resize Drop DatabaseLoad DatabaseLoad LogReconfigureReconfigureRestore DatabaseRestore Log

11,当创建一个触发器时必须指定:(1)名称(2)在其上定义触发器的表(3)触发器将何时激发;(4)激活触发器的数据修改语句

 

 

贰:触发器的管理

 

一,使用企业管理器管理:

 1,创建

 2,查看:(1)查看相关数据;

         2)查看定义文本;

                     

 3,修改

 4,删除

二,使用TSQL语句管理:

 

1,创建

2,查看:(1)查看相关数据;

         2)查看定义文本;

         3)查看所有者和创建日期

3,修改

4,删除

                                                   

详细介绍使用TSQL语句管理触发器:

1,创建:

1)语法格式

Create Trigger trigger_name

On Table| View

[With Encryption]

{For | Afrer | Instead of}

{ [Insert] [, ] [Update]  [, ] [Delete] }

 AS

 sql_statements [...n]

 

 

 

2)各参数说明:

                  

trigger_name:是用户要创建的触发器的名字。触发器的名字必须符合MS SQL Server 的命名规则,且其名字在当前数据库中必须是惟一的

Table:是与用户创建的触发器相关联的表的名字,并且该表已经存在。

WITH ENCRYPTION:表示对包含有CREATE TRIGGER 文本的syscomments 表进行加密

[DELETE] [,] [INSERT] [,] [UPDATE]:关键字用来指明哪种数据操作将激活触发器,至少要指明一个选项,在触发器的定义中三者的顺序不受限制,且各选项要用逗号隔开。

AFTER:表示只有在执行了指定的操作INSERT、DELETE、UPDATE 之后触发器才被激活,执行触发器中的SQL语句。若使用关键字FOR ,则表示为AFTER 触发器,且该类型触发器仅能在表上创建。

INSTEAD OF:当为表或视图定义了针对某一操作INSERT、 DELETE、UPDATE 的INSTEAD OF 类型触发器,且执行了相应的操作时,尽管触发器被触发,但相应的操作并不被执行,而运行的仅是触发器SQL 语句本身。

 

3)例子:

    

Use company

Go

--创建触发器

Create trigger 触发器_欢迎新员工

On employee

After insert

As

Print ‘新员工加入本公司,欢迎欢迎!’

go

 

--创建触发器

Create trigger 触发器_员工走了

On employee

After delete

As

Print ‘真遗憾你离开公司!’

go

 

Set nocount on

--插入一条记录试试触发器操作

Insert into employee(员工id,姓名,性别,工资)

Values(20068,’赵一’,‘男’,1000)

--删除一条记录试试

Delete from employee

Where 员工id = ‘20067’

go

 

2,查看:

1)查看相关数据:

       

语法:exec_helptrigger 'table' [,'type']

参数说明:table:触发器所在的表名

                     Type:指定列出的操作类型的触发器。若不指定,则列出所有的 触发器

 

例子:exec sp_helptrgger 'employee'

 

 (2)查看定义文本:

语法:Sp_helptext'trigger_name'

例子:exec sp_helptext'触发器_欢迎新员工'

注意:若在定义触发器时对定义文本进行加密处理,则不能使用任何方法查看触发器的定义文本。)

3)查看所有者和创建日期:

语法:exec sp_help 'trigger_name'

例子:exec sp_help'触发器_欢迎新员工'

 

3,修改

语法格式:

ALTER TRIGGER trigger_name 
ON table|view 
[WITH ENCRYPTION] 
{FOR | AFTER | INSTEAD OF }

 { [DELETE] [,][INSERT][,][UPDATE]}
AS
  sql_statement[...n]

 

注意:就是创建触发器的语句中的create换为alter,其余部分完全相同。但是在alter trigger中引用的触发器名必须是已经存在的触发器名)

4,删除:

语法格式: Drop trigger trigger_name [,...n]

例子:Drop trigger触发器_员工走了

注意:当删除数据表时,也将同时删除所有与该数据表相关联的触发器。而且当删除触发器时,系统也将从sysobjects和syscomments系统表中删除有关该触发器的信息。)

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:165819次
    • 积分:4567
    • 等级:
    • 排名:第6680名
    • 原创:287篇
    • 转载:36篇
    • 译文:0篇
    • 评论:11条
    最新评论