SQL SERVER-10-觸發器|遊標|動態sql
1.觸發器 --可以理解為一個特殊的儲存過程,在某一個動作執行的時候,自動執行,而不需要人手動執行
--觸發器的分類 --1.DML觸發器 --insert,delete,update(不支援select) --after觸發器,instead of 觸發器(相當於其他資料庫的before觸發器,是一個替代),(不支援before觸發器)
--2.DDL觸發器 --create table,create database,alter,drop
--兩張特殊的表,inserted表和deleted表 --可以把這兩張表看做臨時表 --inserted表,insert和update觸發器會用到 --deleted表,delete和update觸發器會用到
--在insert的時候,先在資料表和inserted表中都插入資料,在提交之後,資料表資料儲存,inserted表中資料銷燬 --在delete的時候,先把資料表中要刪除的資料移動到deleted表中,然後刪除資料表表中資訊,提交之後銷燬deleted表中的資料 --在update的時候,先把資料表中要修改的資料放到deleted表中,然後刪除原資料,再把新的資料儲存到inserted表中和資料表中,提交之後銷燬inserted和deleted表中資料
--sql server沒有行級觸發器,只有表級觸發器 --如果一條sql語句刪除了多行記錄,只會觸發一次觸發器
--操作,建立觸發器在刪除資料的時候對刪除資料進行備份 select * from TblPerson --為TblPerson表編寫一個觸發器,當刪除該表中的記錄的時候,把刪除的記錄備份到一個備份表中 --TblPersonBakTable
--1.先建立一個沒有資料的用來備份的表 select top 0 * into TblPersonBakTable from TblPerson --建立備份表之後查詢一下看看是否成功和是否有資料 select * from TblPersonBakTable
--2.建立刪除觸發器 create trigger tri_delete_TblPerson on TblPerson for delete --型別為刪除觸發器,這裡的for也可以換成after,他們都表示after觸發器 as begin --把已經刪除的記錄備份到另一個表中 --1.如何獲得那些已經刪除的資料?? --select * from deleted --2.把這些已經刪除的資料備份到一個新表中 insert into TblPersonBakTable select uname,uage,uheight from deleted --1.開啟事務之後,執行刪除語句,把需要刪除的資料儲存到inserted表中 --2.刪除資料表中的資料 --3.觸發器執行 --4.提交commit --如果這裡執行roolback,則刪除的事務會被回滾,刪除不再繼續 --roolback end
--如果想要一個觸發器在執行增刪改的時候都觸發,只需要在for後面跟上需要執行的操作即可 --create trigger tri_delete_TblPerson on TblPerson --for delete,insert,update --執行增,刪,改都會觸發該觸發器 --as --begin -- --把已經刪除的記錄備份到另一個表中 -- --1.如何獲得那些已經刪除的資料?? -- --select * from deleted -- --2.把這些已經刪除的資料備份到一個新表中 -- insert into TblPersonBakTable -- select uname,uage,uheight from deleted --end
--刪除觸發器 --drop trigger tri_delete_TblPerson
2.遊標 --遊標的效能很低,所以一般情況下不要用遊標
select * from NIS_ADDINS
--1.建立遊標 --fast_forward,是向前的只讀遊標,只能前進不能倒退,所以是遊標中最快的 --scroll,表示可以隨意移動的遊標,能前進也能後退 declare cs_addins cursor fast_forward for --查詢需要操作的資料 select ID,ZYMC FROM NIS_ADDINS
--定義兩個變數用來接收迴圈的資訊 declare @id varchar(64) ,@zymc varchar(64)
--2.開啟遊標 open cs_addins
--3.操作遊標 --向後移動一條,為變數賦值初始值 fetch next from cs_addins into @id,@zymc --判斷移動是否成功 while @@FETCH_STATUS=0 begin print @id+'/'[email protected] --操作下一條資料 fetch next from cs_addins into @id,@zymc end
--4.關閉遊標 close cs_addins
--5.釋放資源 deallocate cs_addins
3.動態sql --儲存過程動態拼接需要執行的sql語句 --比如想要分頁查詢,這裡可以傳入表名稱,實現一個儲存過程就能實現所有的表的分頁查詢 create proc usp_testpp @tbName varchar(50) as begin declare @sql nvarchar(500) set @sql='select * from '[email protected] exec(@sql) --exec sp_executesql() end --執行儲存過程 exec usp_testpp 'TblStudent'