【SQL SERVER】觸發器(一)


  下面是個人對觸發器知識的整理,觸發器其實很簡單,但想要編寫發雜的觸發器操作還是需要一定的SQL語句編寫,觸發器主要用於SQL SERVER約束、默認值和規則的完整性檢查,還可以實現由主鍵和外鍵不能保證的參照完整性和數據的一致性。總之,觸發器也是很重要的知識點。

一、觸發器的概念

  觸發器是一種特殊類型的存儲過程,它不同於一般存儲過程。一般存儲過程通過存儲過程名直接被調用,而觸發器則通過事件進行觸發而執行。

二、觸發器的優點

  1、觸發器是自動的執行的;

  2、觸發器可以通過數據庫的相關表進行層疊更改;

  3、觸發器的可以執行比CHECK約束更為復雜的操作。可以書寫比較復雜的SQL語句,比如引用多個表,使用流程結構;

  4、跟蹤變化。觸發器可以偵測數據庫內的操作,比如表的數據更新,修改數據后的變化,如果不允許可以回滾修改操作;

  5、拒絕或回滾違反引用完整性的操作,檢查對表的操作是否違反引用完整性,從而決定提交還是回滾操作。

三、觸發器的類型

  1、Alter觸發器:就是在某一語句(INSERT UPDATE DELETE)執行之后激活觸發器。且只能在表上定義,可以為針對表的同一操作定義多個觸發器。可以定義哪一個觸發器先執行。

  2、Instead Of觸發器:就是在某一語句(INSERT UPDATE DELETE)執行之前激活觸發器,但並不執行其定義的操作(INSERT UPDATE DELETE),而僅是執行觸發器本身,同一操作只能定義一個Instead of觸發器。

四、創建觸發器

  • Create Trigger必須是批處理的第一個語句;
  • 創建觸發器的權限默認分配給表的所有者,且不能將該權限轉給其他用戶;
  • 觸發器為數據庫對象,其名稱必須遵循標示符的命名規則;
  • 雖然觸發器可以引用當前數據庫之外的對象,但只能在當前數據庫中創建觸發器;
  • 雖然不能在臨時表上貨系統表上創建觸發器,但是觸發器可以引用臨時表;
  • 在含有Delete或update操作定義之外的外鍵表中個,不能定義Instead Of和Instead Of Update觸發器;
  • 雖然Truncate Table語句類似於沒有Where字句的Delete語句,但她不會引發delete觸發器,因為Truncate Table語句沒有記錄;
  • Writetext語句不會引發Insert或update觸發器;
  • 當創建一個觸發器時必須指定觸發器名稱,在哪一個表上定義觸發器,觸發器在何時激活,激活觸發器的數據修改語句。

1、每一個觸發器都包含3個操作;觸發器的名稱,激活觸發器的操作,觸發器的執行操作。

   這里我們首先創建數據庫和表;

CREATE DATABASE pubs Use pubs EXEC dbo.sp_addtype @typename=N'tid', @phystype='varchar(6)', @nulltype='NOT NULL', @owner=N'dbo'
EXEC dbo.sp_addtype @typename=N'id', @phystype='varchar(11)', @nulltype='NOT NULL', @owner=N'dbo'
GO
EXEC dbo.sp_addtype @typename=N'empid', @phystype='char(9)', @nulltype='NOT NULL', @owner=N'dbo'
GO

CREATE TABLE [authors]( [au_id] [id]  NOT NULL, [au_lname] [varchar](40) NOT NULL, [au_fname] [varchar](20) NOT NULL, [phone] [char](12) NOT NULL, [address] [varchar](40) NULL, [city] [varchar](20) NULL, [state] [char](2) NULL, [zip] [char](5) NULL, [contract] [bit] NOT NULL ) ON [PRIMARY]

CREATE TABLE [employee]( [emp_id] [empid] NOT NULL, [fname] [varchar](20) NOT NULL, [minit] [char](1) NULL, [lname] [varchar](30) NOT NULL, [job_id] [smallint] NOT NULL, [job_lvl] [tinyint] NULL, [pub_id] [char](4) NOT NULL, [hire_date] [datetime] NOT NULL ) ON [PRIMARY]


例1、在數據庫pubs的authors表上創建3個觸發器 

Create Trigger Insert_trigger On authors Alter Insert
AS
Print'有新的人員被加入!'
GO

Create Trigger update_trigger On authors After update
AS
Print'有的人員被更新!'
GO

Create Trigger Insert_trigger On authors After delete
AS
Print'有的人員被刪除!'
GO

如果有一些觸發執行操作后,激活了觸發器,但是並不希望觸發操作都成功,我們可以在觸發器的處理語句上進行回滾事務。

Create Trigger Insert_trigger On authors After Delete
AS
if ‘Green’ in (Select au_lname from deleted)/*這里deleted是個邏輯表,我們下面會說到*/
Begin 
Print '該信息不允許刪除'
RollBack Transaction
End
GO

上面都是一些基本的觸發器知識,希望對你有幫助!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM