1. 程式人生 > >SQL Server觸發器練習

SQL Server觸發器練習

    觸發器的使用,其實在日常生活中還是很有幫助的。當你對一張表進行資料的怎刪改查操作的時候,同時也相對另外一張甚至幾張表進行同步修改操作,這個時候就會運用到觸發器的概念。

      我記得我剛接觸觸發器的時候是因為我的畢業設計需求。當對員工表進行修改時,自動修改管理員表,這裡用到了update觸發器;當對員工表進行新增的時候,自動在管理員表中新增欄位,並且建立初始的使用者名稱,密碼,這裡用到了insert觸發器。

      觸發器的運用可以極大程度上的減少我們對於多張表同時新增資料時的複雜程度。

下面是我自己練習時使用的測試程式碼:

/*create table student(
       stu_id int identity(1,1) primary key,
  stu_name varchar(10),
  stu_gender char(2),
  stu_age int,
)*/
/*
--建立insert觸發器
create trigger trig_insert
on student
after insert
as
begin
     if OBJECT_ID(N'student_sum',N'U') is null--判斷student_sum表是否存在
   create table student_sum(stuCount int default(0));--建立儲存學生人數的student_sum表
declare @stuNumber int;
select @stuNumber = count(*) from student;
if not exists (select * from student_sum)--判斷表中是否有記錄
   insert into student_sum values(0);
update student_sum set stuCount = @stuNumber;--把更新後總的學生數插入到student_sum表中
end*/


--測試觸發器trig_insert-->功能是向student插入資料的同時級聯插入到student_sum表中,更新stuCount
--因為是後觸發器,所以先插入資料,才出發觸發器;


--drop trigger tri_delete;


/*insert into
student(stu_name,stu_gender,stu_age)values('呂布','男',30);
select stuCount 學生總人數 from student_sum;
insert into
student(stu_name,stu_gender,stu_age)values('貂蟬','女',30);
select stuCount 學生總人數 from student_sum;
insert into
student(stu_name,stu_gender,stu_age)values('曹阿曼','男',40);
select stuCount 學生總人數 from student_sum;*/


/*--建立insert_forbidden,禁止使用者向student_sum表中插入資料
create trigger insert_forbiggen
on student_sum
after insert
as
begin
     RAISERROR('禁止直接向該表中插入資料,操作被禁止',1,1)--raiserror是用於丟擲一個錯誤
rollback transaction
end*/


--觸發觸發器insert_forbiggen
/*insert into
student_sum(stuCount)values(6);*/


--建立delete觸發器
/*create trigger trig_delete
on student
after delete
as
begin
      select stu_id as 已刪除的學生編號,stu_name,stu_gender,stu_age
 from deleted
end*/


--執行一條delete語句觸發trig_delete觸發器
--delete from student where stu_id = 7;


--建立update觸發器
/*create trigger trig_update
on student
after update
as
begin
     declare @stuCount int;
select @stuCount = count(*) from student;
update student_sum set stuCount = @stuCount;
select stu_id as 更新前學生編號,stu_name as 更新前學生姓名 from deleted
select stu_id as 更新後學生編號,stu_name as 更新後學生姓名 from inserted
end*/


--建立完成,執行一條語句觸發trig_update觸發器
--update student set stu_name = '張飛' where stu_id = 8;


--建立替代觸發器
--建立instead of觸發器
/*create trigger trig_inteadOf
on student
instead of insert
as
begin
     declare @stuAge int;
select @stuAge = (select stu_age from inserted)
if(@stuAge > 120)
select '插入年齡錯誤' as '失敗原因'
end*/


--執行語句觸發
--insert into student (stu_name,stu_gender,stu_age) values ('子龍','男',130);


--禁用巢狀
--exec sp_configure 'nested triggers',0;
--啟用巢狀
--exec sp_configure 'nested triggers',1;


--檢視觸發器
--檢視資料庫中所有的觸發器
/*use student
go
select * from sysobjects where xtype = 'TR'*/


--.sp_helptext檢視觸發器內容
/*use student
go
exec sp_helptext 'trig_insert'*/


--.sp_helptrigger檢視觸發器的屬性
/*use student
go
exec sp_helptrigger student*/


--禁用觸發器
--alter table student disable trigger trig_insert
--禁用觸發器
--alter table student enable trigger trig_insert