SQL Server基础操作(此随笔仅作为本人学习进度记录十 !--触发器)

触发器(同游标一样比较难理解,特殊的存储过程)

触发器是一种存储过程,只不过是一种特殊类型的存储过程,它的特殊性就在于根据某种特殊的情况下触发的,

存储过程的执行需要手动调用,而触发器作为一个存储过程它的执行,不是我们调用的,而是我们进行某些操作之后来触发它的,

它的原理相似于其它语言的事件句柄,

可以调用存储过程

它的主要作用就是用于实现由主键或外部键所不能保证的,复杂的参照完整性或数据一致性。

触发器还有以下几个功能:

                      1.可响应数据库的更新,触发器的操作可以通过调用一个或多个存储过程甚至可以通过调用外部过程来完成相应操作。

                      2.还可以跟踪数据库内数据的变化,并判断变化是否符合数据库的要求,例如(对数据库的更新,对表的更新)触发器可以侦测数据库内的操作从而

                        禁止数据库内未经许可的更新和变化,使数据库的修改和更新操作更加的安全,数据库运行更加稳定。

                      3.可以强化数据条件的约束,触发器可以实现比Cheak语句更为复杂的条件约束,(因为它是一个存储过程)更适合大型数据库管理系统中用来约束数据的完整性

                      4.级联和并行运行,触发器可以侦测数据库内的操作,并自动的级联影响整个数据库的各项内容。

    触发器的类型:
                 事后触发器,替代触发器,      

                       事后触发器是在事件发生之后(insert、update、delete)才执行的,才会调用这些触发器,而这些触发器的先后执行顺序可用由系统存储过程来指定,而且只能指定一个和最后一个

                       调用的触发器而中间无论多少个触发器只是以随机顺序来执行的,事后触发器可以在同一个表的某一个操作指定多个触发器。也就是说插入一条记录可以同时调用多个触发器

                 1.事后触发器:即After触发器,!!!它只能应用在表上,!!!但可以针对表的同一操作定义多个触发器,(譬如说对表插入这个操作,可以定义多个触发器),执行完一个存储过程,再执行另外一个, 

                   再执行下一个,在表上只能为每一个insert、update、delete、指定一个第一个执行的触发器和最后一个执行的触发器,假如创建了六个触发器,指定了第一个和第六个,

                   那么中间的这个四个触发器将以随机的顺序执行,无法手动指定。若创建了3个触发器,指定第一个和第六个,中间的只剩下一个,只能按照顺序执行。

              2.替代触发器:即 Instead Of触发器,此触发器与事后触发器最大的不同是该触发器并不是预先执行某一操作(insert、update、delete、)它会先执行这些代码,

                   一旦发生它仅仅是会执行触发器这些代码,并不会先执行这些操作。触发器执行了,但表中的记录没有做任何更改。

    两种类型触发的区别

                  事后触发器只能应用到表上,并且一个表的某一操作同时触发多个触发器,可以利用存储过程来指定哪一个触发器先执行,哪一个后执行。

                  而替代触发器不仅可以应用到表上,还可以应用到视图上,而主要的应用范围就是视图而且替代触发器不会先执行(insert、update、delete)这些操作,它仅仅会执行触发器本身的代码。

              创建事后触发器(事后触发器先执行对表的操作:删除、更新、插入记录然后才会调用触发器)

 create trigger testTriggerA on 网站职员表 for insert as \\创建触发器及触发器名字,并声明该触发器是为网站职员表创建的。
                                                           for insert as,对该表进行insert操作时会调用该触发器
 begin

 print‘testTriggerA被调用‘

 end

           查找触发器
  sp_helptext testTriggerA

  调用触发器:
             !!!调用触发器实际上是不需要手动来做的,只需要在表中插入记录的时候,就会调用这个触发器。

   \\利用insert into语句对网站职员表插入值,来引起触发器中的语句来触发触发器。
insert into 网站职员表 (职员编号,毕业院校,姓名,家庭住址,年龄,奖金,总收入,工资) values(800,‘沈阳大学‘,‘吴‘,‘辽宁‘,28,500,6500,6000)

    在数据库中键入该条语句的时候会弹出一个错误提示:!!!

  当 IDENTITY_INSERT 设置为 OFF 时不能为表 ‘网站职员表‘中的标识列插入显式值。

     !!!以上错误提示为:不能向该网站职员插入该值,以下为解决方法:

                set IDENTITY_INSERT 网站职员表 on  \\首先利用IDENTITY_INSERT语句对网站职员表开启

                insert into 网站职员表 (职员编号,毕业院校,姓名,家庭住址,年龄,奖金,总收入,工资) values(800,‘沈阳大学‘,‘吴‘,‘辽宁‘,28,500,6500,6000)

                set IDENTITY_INSERT 网站职员表 off  \\再利用IDENTITY_INSERT语句对网站职员表进行关闭

    !!!!!每执行一次,触发器都会被调用一次

 再创建两个触发器,都是在表中插入记录时调用这个触发器,使之每次插入记录时可以调用三个触发器!

 create trigger testTriggerB on 网站职员表 for insert as \\创建触发器及触发器名字,并声明该触发器是为网站职员表创建的。
                                                           for insert as,对该表进行insert操作时会调用该触发器
 begin

 print‘testTriggerA被调用‘

 end

 create trigger testTriggerC on 网站职员表 for insert as \\创建触发器及触发器名字,并声明该触发器是为网站职员表创建的。
                                                           for insert as,对该表进行insert操作时会调用该触发器
 begin

 print‘testTriggerA被调用‘

 end

上节课学习的是在一个表中的某一个操作(insert、update、delete),可以同时调用多个触发器

还可以在(调用、insert、update、delete)时调用触发器

                       更新的时候被调用
 create trigger testUpdateTriggerA on 网站职员表 for update as  \\创建触发器名字,并声明该触发器是为网站职员表创建的。
 begin                                                            对网站职员表进行update时候会调用该触发器。
 print‘更新触发器被调用‘
 end

                      删除的时候被调用

 create trigger testDeleteTriggerA on 网站职员表 for delete as \\删除时触发器被调用
 begin
 print‘testDeleteTriggerA触发器被调用‘
 end

学习如何利用sp_settriggerorder这个系统存储过程来改变同时触发多个触发器时,触发器的先后调用顺序(指定第一个和最后一个调用的触发器)

                再创建3个触发器

   testTriggerA被调用    \\插入一条记录同时调用6个触发器
   第二个触发器
   第三个触发器被调用
   testTriggerD触发器被调用。
   testTriggerE触发器被调用。
   testTriggerF触发器被调用。

                             指定触发器的调用先后顺序(只能指定第一个和最后一个)

sp_settriggerorder @triggername=‘testTriggerA‘,@order=‘first‘, @stmttype=‘insert‘\\利用sp_settriggerorder对触发器的顺序进行修改。

                  \\触发器的名字testTriggerA  \\触发器的顺序last \\触发器的类型insert

sp_settriggerorder @triggername=‘testTriggerF‘,@order=‘last‘, @stmttype=‘insert‘\\利用sp_settriggerorder对触发器的顺序进行修改。

                  \\触发器的名字testTriggerF  \\触发器的顺序last \\触发器的类型insert

          sp_settriggerorder是用于定义触发器执行先后顺序的一个系统存储过程

      sp_settriggerorder @triggername=‘testTriggerF‘,@order=‘none‘, @stmttype=‘insert‘

      \\取消触发器先后执行顺序的特性,只需将Oder改为none!!!!

                           创建替代触发器(用触发器中的代码来代替对表的某些操作)

       创建  触发器  自定义触发器的名字                 替代       删除
      create Trigger testInsteadTriggerA on 网站职员表 instead of delete as \\对网站职员表进行删除操作时,并不真正执行删除操作
      begin                                                                   而是执行触发器中的代码中(print‘替代触发器调用‘)
      print‘替代触发器调用‘
      end

     创建一个触发器,当向网站职员表中插入一条记录的时候,那么向网站经营项目表中就会同样插入一条记录

     并且可以用指定的插入的员工他的姓名来指定负责一个项目

     带有插入功能或者其它的特殊功能的触发器,最好用替代触发器

     create trigger triggerTestInsertA on 网站职员表 for insert as   \\每次向网站职员表中插入一条记录时都会调用这个触发器
     begin
     insert into 网站经营项目B (项目编号,项目名称,负责人,合作单位) values (1,‘视频教程‘,‘小伟‘,‘独立开发‘) \\此触发器的作用就是
     end                                                                                                     向网站经营项目B插入这样一条记录

     update 网站职员表 set 姓名=‘小赵‘ where 姓名=‘小伟‘   \\把网站职员表中的小伟改成小赵
                                     \\将姓名等于小伟的这个字段更新

                利用T-SQL语句修改数据库
                                                 \\update
alter trigger triggerTestInsertA on 网站职员表 for insert as \\修改该触发器,把更新时触发
begin                                                          改成插入时触发
print‘triggerTestInsertA触发器被调用‘
end

                利用T-SQL语句删除数据库           

            drop  trigger triggerTestInsertA 

利用两个存储过程:
            1.一个用于查看触发器的基本信息
            2.另一个查看触发器创建时所用的的代码

             查看触发器的基本信息

      exec sp_help triggerTestInsertA 

             查看触发器创建时所用的的代码

      exec sp_helptext triggerTestInsertA

原文地址:https://www.cnblogs.com/LNCC-ZhangXiang/p/11077450.html

时间: 2024-10-04 20:02:49

SQL Server基础操作(此随笔仅作为本人学习进度记录十 !--触发器)的相关文章

SQL Server基础操作(此随笔仅作为本人学习进度记录六 !--程序块和循环)

declare @test_Var int \\声明变量用declare,声明局部变量用@符号,变量的数据类型为整型int. (声明) set @test_Var=1000 \\为此变量赋值,赋值为1000. select @test_Var \\用select 语句进行显示此变量的值. 变量的声明以及赋值显示 局部变量:就是用户自定义的变量,作用范围仅在程序内部,在程序执行过程中暂存的变量的值,也可以存储从表或视图中查询出来的结果.局部变量在命名过程中必须以@开头 全局变量: 声明变量:声明变

SQL Server基础操作(此随笔仅作为本人学习进度记录五 !--数据类型)

二进制数据类型 binary varbinary Uniqueidentifier binarry(n):n用来表示数据的长度,长度为 1—8000,最低长度为1. varbinary:varbinary(n)!--具有可变动的长度类,型用来存储二进制数据的,.也是用来代表数据的长度,在输入数据的时候,必须在数据的前面加上Ox,作为数据的二进制标识若数据的长度过长, 那么系统会自动截去过长的部分若输入的数据的位数为奇数,则系统会在起始符号Ox后面加个0. Uniqueidentifier:也是二

SQL Server基础操作(此随笔仅作为本人学习进度记录九!--游标)

游标就是存储结果集,将从指定表中查询出符合条件的记录,组成了结果集,然后把它存到游标当中,如果要显示游标中的哪一条记录 游标(游动的标识) !!!!非常重要的知识点,比较难理解 !!!游标提供了对表中的数据检索的一种方式,一种灵活操作手段,只是检索表中数据的一种方式. 在操作的时候也可以把游标看做是一个数据库对象.就好像视图一样. 它也是依赖于T-sql语句来进行查询,把查询出来符合条件的记录,不是一下全部显示出来,可以一条记录一条记录的把它显示出来. 它每次只提取一条记录,每次只显示一条记录.

SQL Server基础操作(此随笔仅作为本人学习进度记录)

create database LtsDatabase \\创建数据库 on ( name=LtsDatabase_data,\\数据库名称 filename='d:\temp\LtsDatabase_data.mbf',\\文件所在位置,扩展名.mdf size=6, \\数据库文件初始化大小 maxsize=12, \\数据库文件最大值可以为多大 filegrowth=10% \\数据库超过现有的尺寸后,数据库增长率 ) log on \\对事物日志的描述 ( name=LtsDatabas

SQL Server基础操作(此随笔仅作为本人学习进度记录七 !--存储过程)

存储过程 存储过程分为系统存储过程和自定义存储过程 存储过程通过将处理数据的程序从客户端应用程序移动到服务器,存储过程是放在服务器上的,通过客户端下达指令调用存储过程的时候, 这个过程是在服务器上发生的,自然就不会占用网络的带宽就会降低网络流量.存储过程就是一组为了完成特定功能的T-SQL语句.就是一组语句随时随地拿出来调用. 经过编译后,它存储在SQLserver服务器端的数据库中,换句话说这个T-SQL语句不是普通的T-SQL语句,是经过编译的,存储在服务器中,它是有名称的,根据名称调用存储

SQL Server基础操作(此随笔仅作为本人学习进度记录三)

统计函数 select * from 教师资料 where 教师薪资>(select AVG(教师薪资) from 教师资料) \\从教师资料表中查出所有高于平均薪资的人员. use LtsDatabase alter table 网站职员表 \\修改此表 add 奖金 money \\增加奖金字段 更新奖金字段 use LtsDatabase update 网站职员表 set 奖金=500 \\更新网站职员表所有奖金更新至500元 计算每个员工的总收入是多少 use LtsDatabase s

SQL server基础知识(表操作、数据约束、多表链接查询)

SQL server基础知识 一.基础知识 (1).存储结构:数据库->表->数据 (2).管理数据库 增加:create database 数据库名称 删除:drop database 数据库名称 查询:select name from master..sysdatabases 修改:alter database 数据库名称(在 sql server 中修改与数据库关联的文件和文件组.在数据库中添加或删除文件和文件组.更改数据库或其文件和文件组的属性) (3).管理表 选择数据库:use 数

SQL Server基础

一.常用命令 1.使用命令行开启SQL Server服务 获取管理员权限的命令行工具: net start mssqlserver 开启sql server服务 net restart mssqlserver 重新启动sql server服务 net stop mssqlserver 关闭sql server服务 2.使用命令登陆(该方法可适用于在一台没有SQL Server的电脑去操作一台有SQL Server的电脑) 运行: sqpl ?/ [-S 服务器的名称]  [-U 登陆名] [-P

SQL Server基础知识

查看sql server版本 select @@VERSION 基本操作 use tty; 使用tty数据库 create table tt(name varchar(10)); 新建表tt insert into tt values('ftp'); 插入数据ftp select * from tt; 查看表tt delete from tt; 删除表表tt中的一条记录 运行命令的快捷方式: Alt+x 重启数据库服务 net restart mssqlserver 修改用户密码 企业管理器——