加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

SqlServer和Oracle中一些常用的sql语句8 触发器和事务

发布时间:2020-12-12 13:57:56 所属栏目:MsSql教程 来源:网络整理
导读:--创建和执行事后触发器--更新仓库备份表中记录时自动创建数据表且插入三条记录create trigger db_trigger1 on 仓库备份 for updateasbegin if Exists(select * from sys.sysobjects where id=OBJECT_ID('db_tabletriuser')) drop table db_tabletriuser els
--创建和执行事后触发器
--更新仓库备份表中记录时自动创建数据表且插入三条记录
create trigger db_trigger1 on 仓库备份 for update
as
begin
  if Exists(select * from sys.sysobjects  where id=OBJECT_ID('db_tabletriuser'))
    drop table db_tabletriuser
  else
  begin
     create table db_tabletriuser(
         userid  int identity(1,1) primary key,username  varchar(50),userpwd   varchar(50)
      )
    insert into db_tabletriuser(username,userpwd) values('hy1','111')
    insert into db_tabletriuser(username,userpwd) values('hy2','222')
    insert into db_tabletriuser(username,userpwd) values('hy3','333')
   end
end

--test
update 仓库备份 set 面积=面积-100 where 仓库号='wh1'      
-----------------------------------------------------------

--删除功能触发器
--实现当删除职工表中的一条记录时,删除该职工所对应的订购单信息
Create trigger db_delete_trigger on 职工 for delete
as
begin
  declare @t varchar(10)
  select @t=职工号 from deleted
  delete from 订购单 where 职工号=@t
end

--test
delete from  职工 where 职工号 ='zg5'
-------------------------------------------------------

--更新功能触发器
--实现更新仓库表中一条记录的仓库号时,把职工表中对应的仓库号也进行修改
create trigger db_update_trigger on 仓库 for update
as
begin
  declare @old char(10)
  declare @new char(10)
  select @new=仓库号 from inserted
  select @old=仓库号 from deleted
  update 职工 set 仓库号=@new where 仓库号=@old
end

--test
update 仓库 set 仓库号='modifywh2' where 仓库号='wh2'
------------------------------------------------------------

--嵌套触发器
--实现当删除仓库表中一个仓库信息时,同时删除该仓库中所有职工的信息
--同时触发删除该仓库所有职工的订购单信息
create trigger db_Text_trigger1 on 仓库 for delete
as
begin
  declare @t varchar(10)
  select @t=仓库号 from  deleted
  delete from 职工 where 仓库号=@t
end

create trigger db_Text_trigger2 on 职工 for delete
as
begin
  delete from 订购单 where 职工号 in (select 职工号 from deleted)
end

--test
delete from 仓库 where 仓库号='wh1'
--------------------------------------------------------

--创建触发器实现在仓库备份表中插入,更新或删除记录时自动发送邮件
create trigger db_trigger2 on 仓库备份 for Insert,Update,Delete      
as
begin
  execute xp_sendmail 'zhoufeng@163.com'
end   

--禁用和启用触发器
--disable 禁用;Enable 启用
alter table 仓库备份
disable trigger db_trigger1

alter table 仓库备份
Enable trigger db_trigger1


alter table 仓库备份
disable trigger db_trigger1,db_trigger2

alter table 仓库备份
Enable trigger all      

--保护数据表不被修改和删除的触发器
create trigger db_DDL_trigger1
on database
for drop_table,Alter_table
as
begin
  print '不能修改和删除当前数据库中的数据表!'
  rollback
end

drop table 仓库备份   

--保护数据库不被删除的触发器
create trigger db_DDL_trigger2
on all server
for drop_database
as
begin
  print '不能删除当前服务器中的任何数据库'
  rollback
end

drop database  db_business  

--记录数据库操作日志的触发器
create table 记录日志表
(
  日志编号     int identity(1,事件         varchar(600) null,所用语句     varchar(8000)  null,操作者       varchar(60)  null,发生时间     datetime     null
)

create trigger db_DDL_trigger3
on database 
for DDL_Database_level_Events
as
begin
   declare  @log xml
   set @log =Eventdata()
   insert into 记录日志表(事件,所用语句,操作者,发生时间) values
   (
     @log.value('(/Event_Instance/EventType)[1]','nvarchar(100)'),@log.value('(/Event_Instance/TSQLCommand)[1]','nvarchar(2000)'),Convert(nvarchar(100),Current_user),Getdate()
   )
end

--test
create table db_table2
(
  仓库编号  int not null,仓库号   varchar(50) not null,城市     varchar(50) not null,面积     int
)

select * from 记录日志表
------------------------------------------
--事务
begin transaction update_data
use db_business 
go
update 职工备份 set 姓名='事务修改' where 职工号='zg2'
rollback transaction update_data --回滚

--test
select * from 职工备份

--------------------------

begin transaction update_data
use db_business 
go
update 职工备份 set 姓名='事务修改' where 职工号='zg2'
commit transaction update_data --提交

--test
select * from 职工备份

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读