下面是個人對觸發器知識的整理,觸發器其實很簡單,但想要編寫發雜的觸發器操作還是需要一定的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
上面都是一些基本的觸發器知識,希望對你有幫助!