触发器

use demo_2;
go

--最简单的触发器,当向TB_Students表插入数据的时候,报告插入的记录
create trigger TG_STUDENTS_INSERT on TB_Students for insert as
begin
declare @stuId varchar(10);
declare @stuName nvarchar(20);

declare insertCursor cursor for select STU_ID,STU_NAME from inserted;
open insertCursor;

fetch insertCursor into @stuId,@stuName;

while(@@fetch_status = 0)
begin
print '学号: ' + @stuId + ' 姓名' + @stuName + '的学生被建立。';
fetch insertCursor into @stuId,@stuName;
end

close insertCursor;
deallocate insertCursor;
end
go

alter trigger TG_STUDENTS_UPDATE on TB_Students for Update as
begin
declare @oldStuId varchar(10);
declare @oldStuName nvarchar(20);
declare @oldStuGender nvarchar(1);
declare @oldStuBirthdate datetime;

declare @newStuId varchar(10);
declare @newStuName nvarchar(20);
declare @newStuGender nvarchar(1);
declare @newStuBirthdate datetime;

declare updateCursor cursor for select a.STU_ID as OLD_STU_ID, a.STU_NAME as OLD_STU_NAME,
a.STU_GENDER as OLD_STU_GENDER, a.STU_BIRTHDATE as OLD_STU_BIRTHDATE,
b.STU_ID as NEW_STU_ID, b.STU_NAME as NEW_STU_NAME, b.STU_GENDER as OLD_STU_GENDER,
b.STU_BIRTHDATE as NEW_STU_BIRTHDATE
from deleted as a inner join inserted as b on a.STU_KEY=b.STU_KEY;

open updateCursor;

fetch updateCursor into @oldStuId,@oldStuName, @oldStuGender, @oldStuBirthdate,
@newStuId, @newStuName, @newStuGender, @newStuBirthdate;

while(@@fetch_status = 0)
begin
print '学号:' + @oldStuId + ' 姓名' + @oldStuName
+ ' 性别:' + @oldStuGender + ' 生日:' + convert(nvarchar,@oldStuBirthdate,101)
+ '的学生被更改为 ' + '学号:' + @newStuId + ' 姓名' + @newStuName
+ ' 性别:' + @newStuGender + ' 生日:' + convert(nvarchar,@newStuBirthdate,101);

fetch updateCursor into @oldStuId,@oldStuName, @oldStuGender, @oldStuBirthdate,
@newStuId, @newStuName, @newStuGender, @newStuBirthdate;
end

close updateCursor;
deallocate updateCursor;
end
go

create trigger TG_STUDENTS_DELETE on TB_STUDENTS for delete as
begin
declare @stuId varchar(10);
declare @stuName nvarchar(20);

declare deleteCursor cursor for select STU_ID,STU_NAME from deleted;
open deleteCursor;

fetch deleteCursor into @stuId,@stuName;

while(@@fetch_status = 0)
begin
print '学号: ' + @stuId + ' 姓名' + @stuName + '的学生被删除。';
fetch deleteCursor into @stuId,@stuName;
end

close deleteCursor;
deallocate deleteCursor;
end

insert into TB_STUDENTS(STU_KEY,STU_ID,STU_NAME,STU_GENDER,CLS_ID,STU_BIRTHDATE)
values (newid(), '20090315','Tom','男', '77736c72-bbc6-4bdd-83d1-5fe3de1d886c','1990-05-23');

insert into TB_STUDENTS(STU_KEY,STU_ID,STU_NAME,STU_GENDER,CLS_ID,STU_BIRTHDATE)
values (newid(), '20090317','Snoopy','男', '77736c72-bbc6-4bdd-83d1-5fe3de1d886c','1990-05-23');

update TB_STUDENTS set STU_NAME='Tom Cruss', STU_BIRTHDATE='1988-02-14' where STU_NAME='Tom';
delete from TB_STUDENTS where STU_NAME='Jerry';

--利用触发器保证业务的完整性

use TRANS_DEMO;
go

create trigger TG_BANK_ACCOUNTS_UPDATE on BANK_ACCOUNTS for update as
begin
declare @accNum nvarchar(20);
declare @oldBalance float;
declare @newBalance float;
declare @desc nvarchar(50);

declare curBalance cursor for select a.ACC_NUM, a.BALANCE as OLD_BALANCE,
b.BALANCE as NEW_BALANCE from deleted as a
inner join inserted as b on a.ACC_NUM=b.ACC_NUM;

open curBalance;
fetch curBalance into @accNum, @oldBalance, @newBalance;

while(@@fetch_status=0)
begin
if(@newBalance > @oldBalance)
begin
set @desc = '存入';
end
else if(@newBalance < @oldBalance)
begin
set @desc = '扣除';
end
else
begin
fetch curBalance into @accNum, @oldBalance, @newBalance;
continue;
end

insert into OPER_LOGS (ACC_NUM,BALANCE_BEFORE,AMOUNT,BALANCE_AFTER,
OPER_DESC, OPER_TIME, OPERATOR) values
(@accNum, @oldBalance, @newBalance-@oldBalance, @newBalance,
@desc, GetDate(), System_User);

fetch curBalance into @accNum, @oldBalance, @newBalance;
end

close curBalance;
deallocate curBalance;
end

go

alter table OPER_LOGS alter column OPERATOR nvarchar(200) not null;
go

begin transaction
begin try
update BANK_ACCOUNTS set BALANCE=BALANCE-2000 where ACC_NUM='37432514332'
update BANK_ACCOUNTS set BALANCE=BALANCE+2000 where ACC_NUM='37432514357'
commit transaction
end try
begin catch
print Error_Message();
rollback transaction
end catch

--使用Instead Of触发器替换对于表中记录的删除操作

alter table BANK_ACCOUNTS add DEL bit not null default 0; --为帐户表增加一个删除标记字段
go

select * from BANK_ACCOUNTS;
go

alter trigger TG_BANK_ACCOUNTS_DELETE on BANK_ACCOUNTS instead of delete as
begin
update BANK_ACCOUNTS set DEL=1 where ACC_NUM in
(select ACC_NUM from deleted where DEL=0);

delete from BANK_ACCOUNTS where ACC_NUM in
(select ACC_NUM from deleted where DEL=1);
end

go

delete from BANK_ACCOUNTS where ACC_NUM='37432514332';
go

select * from BANK_ACCOUNTS;
go

--查询没有被删除的记录
select * from BANK_ACCOUNTS where DEL=0;

--查询已经被删除的记录
select * from BANK_ACCOUNTS where DEL=1;

--恢复已经被删除的记录
update BANK_ACCOUNTS set DEL=0 where ACC_NUM='37432514332';


--彻底删除已经被删除的记录
delete from BANK_ACCOUNTS where DEL=1; --删除失败,违反外键约束
go

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值