--创建和执行事后触发器
--更新仓库备份表中记录时自动创建数据表且插入三条记录
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,1) primary key,
事件 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 职工备份
BEGIN TRY
BEGIN TRANSACTION trans1 --开始事务 trans1称事务保存点可选(提交、回滚类似)
INSERT INTO dbo.TestTable( D_Name, D_Password, D_Else )VALUES ( '11','22','33')
INSERT INTO dbo.TestTable( D_Name, D_Password, D_Else )VALUES ( '11','22','33','4444')
COMMIT TRANSACTION trans1--提交事务
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION trans1--回滚事务 上面插入有误 全部回滚
END CATCH

SqlServer和Oracle中一些常用的sql语句8 触发器和事务的更多相关文章

  1. SqlServer和Oracle中一些常用的sql语句9 SQL优化

    --SQL查询优化 尽量避免使用or,not,distinct运算符,简化连接条件 /*Or运算符*/ use db_business go select * from 仓库 where 城市='北京 ...

  2. SqlServer和Oracle中一些常用的sql语句5 流程控制语句

    --在sql语句中 begin...end 用来设定一个程序块 相关于c#中的{} declare @yz real,@w int --声明变量 set @w=120 --为变量赋值 if @w< ...

  3. SqlServer和Oracle中一些常用的sql语句10 特殊应用

    --482, ORACLE / SQL SERVER --订购数量超过平均值的书籍 WITH Orders_Book AS ( SELECT Book_Name, SUM(Qty) Book_Qty ...

  4. SqlServer和Oracle中一些常用的sql语句3 行列转换

    --217, SQL SERVER SELECT Cust_Name , MAX(CASE WHEN Order_Date ='2009-08-01' THEN AR END) "2009- ...

  5. SqlServer和Oracle中一些常用的sql语句6 存储过程

    --不带参数的存储过程 CREATE procedure proc_sql1 as begin declare @i int set @i=0 while @i<26 begin print c ...

  6. SqlServer和Oracle中一些常用的sql语句7 游标

    declare db_cursor4 scroll cursor for select * from 供应商 --声明游标 open db_cursor4 --打开游标 fetch first fro ...

  7. SqlServer和Oracle中一些常用的sql语句4 局部/全局变量

    --把wh1仓库号中姓名含有"平"字的职工工资在原来的基础上加288 update 职工备份 set 工资=工资+288 where 仓库号='wh1' and 姓名 like ' ...

  8. SqlServer 获取字符串中小写字母的sql语句

    SQL字符串截取(SubString) 作用:返回第一个参数中从第二个参数指定的位置开始.第三个参数指定的长度的子字符串. 有时候我们会截取字符串中的一些特殊想要的东西,大小写字母.模号.汉字.数字等 ...

  9. SqlServer 查看备份文件中逻辑文件信息的Sql语句

    RESTORE FILELISTONLY FROM DISK = 'D:\All\DataBase\(2013-12-18)-1.bak' 用来查看备份文件中的逻辑文件信息. 相关信息:SqlServ ...

随机推荐

  1. JTemplates 的使用

    注意事项:一定要放在Jquery的页面加载完成事件内  : $(function{}); <script src="~/Js/jquery-2.1.0.js">< ...

  2. YYHS-NOIP2017SummerTraining0914-问题 A: 组合数问题

    题目描述 组合数C(n,m)表示的是从n个物品中选出m个物品的方案数.举个例子,从(1, 2, 3)三个物品中选择两个物品可以有(1, 2),(1, 3),(2, 3)这三种选择方法.根据组合数的定义 ...

  3. AOP TP框架有感

    自学AOP感觉面向切面编程是一种利器,同时也是一种潜在的威胁.他就像一把手术刀,无论哪个器官有问题他都可以把他切开,修复它,但是使用的多了身体也会受不了... AOP应该算是面向对象的一种补充,但是, ...

  4. EmEditor编辑器正则表达式的优点

    (1)^[ \t]*\n这个正则表达式代表所有的空行,指含有零个或零个以上空格或制表符.以换行符结尾.不含其它字符的行.(2)(^|(?<=中国)).*?(?=中国|$)用正则表达式匹配特定字符 ...

  5. 团队项目汇总beta

    一.Daily Scrum Meeting[Alpha] 4.23-第一天 4.24-第二天 4.25-第三天 4.26-第四天 4.27-第五天 4.28-第六天 4.29-第七天 二.Daily ...

  6. 201521123015 《Java程序设计》第5周学习总结

    1. 本周学习总结 1.1 尝试使用思维导图总结有关多态与接口的知识点. 2. 书面作业 1.代码阅读:Child压缩包内源代码 1.1 com.parent包中Child.java文件能否编译通过? ...

  7. 201521123045 《Java程序设计》第5周学习总结

    第5周-继承.多态.抽象类与接口 1. 本周学习总结 2. 书面作业 Q1.代码阅读:Child压缩包内源代码 1.1 com.parent包中Child.java文件能否编译通过?哪句会出现错误?试 ...

  8. 多线程面试题系列(7):经典线程同步 互斥量Mutex

    前面介绍了关键段CS.事件Event在经典线程同步问题中的使用.本篇介绍用互斥量Mutex来解决这个问题. 互斥量也是一个内核对象,它用来确保一个线程独占一个资源的访问.互斥量与关键段的行为非常相似, ...

  9. [05] 利用private来封装

    我们知道,面向对象开发的三大特点是:封装性.继承性.多态性 所谓封装性,实际上是表达了一种信息隐藏.从表面上来阐述,就是使用private修饰符来对属性或者方法进行信息隐藏,而使用public的方法控 ...

  10. java基础知识5--集合类(Set,List,Map)和迭代器Iterator的使用

    写的非常棒的一篇总结: http://blog.csdn.net/speedme/article/details/22398395#t1 下面主要看各个集合如何使用迭代器Iterator获取元素: 1 ...