20141113--SQL 事务

---------------------触发器-----------------------------
--触发器本质上还是一个存储过程,trigger
--只不过不是通过exec调用执行,而是通过增删改查数据库的操作来触发
--针对主外键表操作时 将关联的表一起修改
--触发器 方便记忆的命名格式:Tr(缩写)_(表名)_(增/删/改)
--instead of 在...之前  等于 替换操作,只执行触发器里面的语句
--for (after) 在...之后  先执行语句在执行触发器内的语句
select *from Student--学生信息

alter trigger Tr_student_delete
on student
instead of delete
as
    delete from score where sno=109
    delete from Student where Sno=109
go
delete from Student where Sno=109

--------------------参数-------------------------
create trigger tr_dongtai
on teacher
instead of delete
as
begin
    declare @tno char(10)
    set @tno=(select tno from deleted)--deleted虚拟表,
    update teacher set tname='刘燕' where tno=@tno
end
go
drop trigger tr_dongtai
select * from Teacher
delete from Teacher where Tno='804'
-----------------------------------------
create trigger tr_teacher_insert
on teacher 
for insert
as
begin
    declare @tno varchar(50)
    set @tno =(select tno from inserted)
    delete from teachar where tno=@tno
end
--------------------禁用,开启
alter table teacher disable trigger all--禁用所有触发器
alter table teacher enable trigger all--开启所有触发器
--all改成触发器名 可以开启或禁用单个触发器

---------------------------------
select *from Teacher--教师信息
select *from Course--课程信息
select *from Score--分数,课程
select *from Student--学生信息
----------------------事务------------------------
--if @@error>0  每一句语句后可以加一个if,然后跟上goto 直接跳转到这里(事务名)
--如果只在最后加if,则尝试执行完所有的命令语句,如果有错则回滚事务。
--goto TranRollBack(goto 后面只是一个事务名)
begin tran--开始事务,每个语句都会尝试执行,
insert into student values ('111','张三','','1988-1-8','95033')
if @@error>0--@@error 上一次的错误,0表示没错,不等于0表示有错
goto Back--goto,跳转到.(事务名).地方
insert into Course values ('3-105','语文','804')
if @@error>0
goto Back
insert into score values ('111','3-105',98)
if @@error>0
begin --如果任何一条有错误 则回滚事务,等于没有执行过这些语句
Back:--事务名
rollback tran--回滚事务,
end
else--没有错误
begin
commit tran --提交
end

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

消息输出:

(1 行受影响)  --尝试插入了一行数据,但是后面有的语句出错,所以回滚事务, 表没有收到影响
消息 2627,级别 14,状态 1,第 5 行
违反了 PRIMARY KEY 约束 'PK__Course__C1FE637307020F21'。不能在对象 'dbo.Course' 中插入重复键。
语句已终止。

原文地址:https://www.cnblogs.com/Tirisfal/p/4095041.html