當前位置:首頁 » 編程語言 » sql觸發函數
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

sql觸發函數

發布時間: 2023-02-07 17:22:57

sql中,觸發器是什麼

1. 基本概念
觸發器是特殊的存儲過程,基於一個表創建,主要作用就是實現由主鍵和外鍵所不能保證的復雜的參照完整性和數據一致性。
當觸發器所保護的數據發生變化(update,insert,delete)後,自動運行以保證數據的完整性和正確性。通俗的說:通過一個動作(update,insert,delete)調用一個存儲過程(觸發器)。
2. 類型
(1)DML觸發器
資料庫中發生數據操作語言(DML)事件時將啟用。DML 事件包括在指定表或視圖中修改數據的 INSERT 語句、UPDATE 語句或 DELETE 語句。DML 觸發器可以查詢其他表,還可以包含復雜的 T-SQL 語句。系統將觸發器和觸發它的語句作為可在觸發器內回滾的單個事務對待,如果檢測到錯誤(例如,磁碟空間不足),則整個事務即自動回滾。
(2)DDL 觸發器
SQL Server 2005 的新增功能。當伺服器或資料庫中發生數據定義語言(DDL)事件時將調用這些觸發器。但與DML觸發器不同的是,它們不會為響應針對表或視圖的UPDATE、INSERT或DELETE語句而激發,相反,它們會為響應多種數據定義語言(DDL)語句而激發。這些語句主要是以CREATE、ALTER和DROP開頭的語句。DDL觸發器可用於管理任務,例如審核和控制資料庫操作。
創建DML觸發器
1. 使用存儲過程模板創建存儲過程
在【對象資源管理器】窗口中,展開「資料庫」節點,再展開所選擇的具體資料庫節點,再展開「表」節點,右擊要創建觸發器的「表」,選擇「新建觸發器」命令,如圖所示:
在右側查詢編輯器中出現觸發器設計模板,用戶可以在此基礎上編輯觸發器,單擊「執行」按鈕,即可創建該觸發器。

2. 使用T-SQL語句創建表
CREATE TRIGGER 觸發器
ON 表名
FOR[update,insert,delete ]
AS SQL語句
例9-6:創建基於表reader ,DELETE操作的觸發器。
USE Library
GO
IF EXISTS(SELECT name FROM sysobjects
WHERE name='reader_d' AND type='TR')
DROP TRIGGER reader_d --如果已經存在觸發器reader_d則刪除
GO
CREATE TRIGGER reader_d --創建觸發器
ON reader --基於表
FOR DELETE --刪除事件
AS
PRINT '數據被刪除!' --執行顯示輸出
GO
試試吧!
應用:
USE Library
GO
DELETE reader
where Rname='aaa'
執行結果:
數據被刪除!
(所影響的行數為 1 行)
例9-7:在表borrow中添加借閱信息記錄時,得到該書的應還日期。
說明:在表borrow中增加一個應還日期SReturnDate。
USE Library
IF EXISTS (SELECT name FROM sysobjects
WHERE name ='T_return_date' AND type='TR')
DROP TRIGGER T_return_date
GO
CREATE TRIGGER T_return_date --創建觸發器
ON Borrow --基於表borrow
After INSERT --插入操作
AS
--查詢插入記錄INSERTED中讀者的類型
DECLARE @type int,@dzbh char(10),@tsbh char(15)
SET @dzbh=(SELECT RID FROM inserted)
SET @tsbh=(SELECT BID FROM inserted)
SELECT @type= TypeID
FROM reader
WHERE RID=(SELECT RID FROM inserted)--副本
/*把Borrow表中的應還日期改為
當前日期加上各類讀者的借閱期限*/
UPDATE Borrow SET SReturnDate=getdate()+
CASE
WHEN @type=1 THEN 90
WHEN @type=2 THEN 60
WHEN @type=3 THEN 30
END
WHERE RID=@dzbh and BID=@tsbh
應用:
USE Library
INSERT INTO borrow(RID,BID) values('2000186010','TP85-08')
查看記錄:

例9-8:在資料庫Library中,當讀者還書時,實際上要修改表brorrowinf中相應記錄還期列的值,請計算出是否過期。
USE Library
IF EXISTS(SELECT name FROM sysobjects
WHERE name='T_fine_js' AND type='TR')
DROP TRIGGER T_fine_js
GO
CREATE TRIGGER T_fine_js
ON borrow
After UPDATE
AS
DECLARE @days int,@dzbh char(10),@tsbh char(15)
SET @dzbh=(select RID from inserted)
SET @tsbh=(select BID from inserted)
SELECT @days=DATEDIFF(day, ReturnDate, SReturnDate)
--DATEDIFF函數返回兩個日期之差,單位為DAY
FROM borrow
WHERE RID=@dzbh and BID=@tsbh
IF @days>0
PRINT '沒有過期!'
ELSE
PRINT '過期'+convert(char(6),@days)+'天'
GO
應用:
USE Library
UPDATE borrow SET ReturnDate='2007-12-12'
WHERE RID='2000186010' and BID='TP85-08'
GO
執行結果:
過期-157 天
(1 行受影響)
例9-9:對Library庫中Reader表的 DELETE操作定義觸發器。
USE Library
GO
IF EXISTS(SELECT name FROM sysobjects
WHERE name='reader_d' AND type='TR')
DROP TRIGGER reader_d
GO
CREATE TRIGGER reader_d
ON Reader
FOR DELETE
AS
DECLARE @data_yj int
SELECT @data_yj=Lendnum
FROM deleted
IF @data_yj>0
BEGIN
PRINT '該讀者不能刪除!還有'+convert(char(2),@data_yj)+'本書沒還。
ROLLBACK
END
ELSE
PRINT '該讀者已被刪除!'
GO
應用:
USE Library
GO
DELETE Reader WHERE RID='2005216119'
執行結果:
該讀者不能刪除!還有4 本書沒還。
修改觸發器
ALTER TRIGGER 觸發器
刪除觸發器
DROP TRIGGER 觸發器
查看觸發器
sp_helptext trigger_name
sp_helptrigger table_name

⑵ SQL中觸發器有什麼作用

觸發器(trigger)是SQL server 提供給程序員和數據分析員來保證數據完整性的一種方法,它是與表事件相關的特殊的存儲過程,它的執行不是由程序調用,也不是手工啟動,而是由事件來觸發,比如當對一個表進行操作( insert,delete, update)時就會激活它執行。觸發器經常用於加強數據的完整性約束和業務規則等。 觸發器可以從 DBA_TRIGGERS ,USER_TRIGGERS 數據字典中查到。SQL3的觸發器是一個能由系統自動執行對資料庫修改的語句。
觸發器與存儲過程的唯一區別是觸發器不能執行EXECUTE語句調用,而是在用戶執行Transact-SQL語句時自動觸發執行。
觸發器可以查詢其他表,而且可以包含復雜的SQL語句。它們主要用於強制服從復雜的業務規則或要求。例如:您可以根據客戶當前的帳戶狀態,控制是否允許插入新訂單。
觸發器也可用於強制引用完整性,以便在多個表中添加、更新或刪除行時,保留在這些表之間所定義的關系。然而,強制引用完整性的最好方法是在相關表中定義主鍵和外鍵約束。如果使用資料庫關系圖,則可以在表之間創建關系以自動創建外鍵約束。
SQL Server 包括三種常規類型的觸發器:DML 觸發器、DDL 觸發器和登錄觸發器。
語法為:
CREATE TRIGGER `<databaseName>`.`<triggerName>`
< [ BEFORE | AFTER ] > < [ INSERT | UPDATE | DELETE ] >
ON [dbo]<tableName> //dbo代表該表的所有者
FOR EACH ROW
BEGIN
--do something
END
觸發器可通過資料庫中的相關表實現級聯更改,不過,通過級聯引用完整性約束可以更有效地執行這些更改。觸發器可以強制比用CHECK約束定義的約束更為復雜的約束。與 CHECK 約束不同,觸發器可以引用其它表中的列。例如,觸發器可以使用另一個表中的 SELECT 比較插入或更新的數據,以及執行其它操作,如修改數據或顯示用戶定義錯誤信息。觸發器也可以評估數據修改前後的表狀態,並根據其差異採取對策。一個表中的多個同類觸發器(INSERT、UPDATE 或 DELETE)允許採取多個不同的對策以響應同一個修改語句。
約束和觸發器在特殊情況下各有優勢。觸發器的主要好處在於它們可以包含使用 Transact-SQL 代碼的復雜處理邏輯。因此,觸發器可以支持約束的所有功能;但它在所給出的功能上並不總是最好的方法。實體完整性總應在最低級別上通過索引進行強制,這些索引或是 PRIMARY KEY 和 UNIQUE 約束的一部分,或是在約束之外獨立創建的。假設功能可以滿足應用程序的功能需求,域完整性應通過 CHECK 約束進行強制,而引用完整性(RI) 則應通過 FOREIGN KEY 約束進行強制。在約束所支持的功能無法滿足應用程序的功能要求時,觸發器就極為有用。
CHECK 約束只能根據邏輯表達式或同一表中的另一列來驗證列值。如果應用程序要求根據另一個表中的列驗證列值,則必須使用觸發器。約束只能通過標準的系統錯誤信息傳遞錯誤信息。如果應用程序要求使用(或能從中獲益)自定義信息和較為復雜的錯誤處理,則必須使用觸發器。
觸發器可通過資料庫中的相關表實現級聯更改;不過,通過級聯引用完整性約束可以更有效地執行這些更改。觸發器可以禁止或回滾違反引用完整性的更改,從而取消所嘗試的數據修改。當更改外鍵且新值與主鍵不匹配時,此類觸發器就可能發生作用。例如,可以在 titleauthor.title_id 上創建一個插入觸發器,使它在新值與 titles.title_id 中的某個值不匹配時回滾一個插入。不過,通常使用 FOREIGN KEY 來達到這個目的。
如果觸發器表上存在約束,則在 INSTEAD OF 觸發器執行後但在 AFTER 觸發器執行前檢查這些約束。如果約束破壞,則回滾 INSTEAD OF 觸發器操作並且不執行 AFTER 觸發器。
實例1:insert觸發器
create trigger tri_insert
on student
for insert
as
declare @student_id char(10)
select @student_id=s.student_id from
student s inner join inserted i
on s.student_id=i.student_id
if @student_id='0000000001'
begin
raiserror('不能插入1的學號!',16,8)
rollback tran
end
go
實例2:update觸發器
create trigger tri_update
on student
for update
as
if update(student_id)
begin
raiserror('學號不能修改!',16,8)
rollback tran
end
go
實例3:delete觸發器示
create trigger tri_delete
on student
for delete
as
declare @student_id varchar(10)
select @student_id=student_id from deleted
if @student_id='admin'
begin
raiserror('錯誤',16,8)
rollback tran
end

⑶ 常用的sql函數

--數據操作
2
3 SELECT --從資料庫表中檢索數據行和列
4 INSERT --向資料庫表添加新數據行
5 DELETE --從資料庫表中刪除數據行
6 UPDATE --更新資料庫表中的數據
7
8 --數據定義
9
10 CREATE TABLE --創建一個資料庫表
11 DROP TABLE --從資料庫中刪除表
12 ALTER TABLE --修改資料庫表結構
13 CREATE VIEW --創建一個視圖
14 DROP VIEW --從資料庫中刪除視圖
15 CREATE INDEX --為資料庫表創建一個索引
16 DROP INDEX --從資料庫中刪除索引
17 CREATE PROCEDURE --創建一個存儲過程
18 DROP PROCEDURE --從資料庫中刪除存儲過程
19 CREATE TRIGGER --創建一個觸發器
20 DROP TRIGGER --從資料庫中刪除觸發器
21 CREATE SCHEMA --向資料庫添加一個新模式
22 DROP SCHEMA --從資料庫中刪除一個模式
23 CREATE DOMAIN --創建一個數據值域
24 ALTER DOMAIN --改變域定義
25 DROP DOMAIN --從資料庫中刪除一個域
26
27 --數據控制
28
29 GRANT --授予用戶訪問許可權
30 DENY --拒絕用戶訪問
31 REVOKE --解除用戶訪問許可權
32
33 --事務控制
34
35 COMMIT --結束當前事務
36 ROLLBACK --中止當前事務
37 SET TRANSACTION --定義當前事務數據訪問特徵
38
39 --程序化SQL
40
41 DECLARE --為查詢設定游標
42 EXPLAN --為查詢描述數據訪問計劃
43 OPEN --檢索查詢結果打開一個游標
44 FETCH --檢索一行查詢結果
45 CLOSE --關閉游標
46 PREPARE --為動態執行准備SQL 語句
47 EXECUTE --動態地執行SQL 語句
48 DESCRIBE --描述准備好的查詢
49
50 ---局部變數
51 declare @id varchar(10)
52 --set @id = 'sp'
53 select @id = 'sp'
54
55 ---全局變數
56 ---必須以@@開頭
57 --IF ELSE
58 declare @x int @y int @z int
59 select @x = 1 @y = 2 @z=3
60 if @x > @y
61 print 'x > y' --列印字元串'x > y'
62 else if @y > @z
63 print 'y > z'
64 else print 'z > y'
65 --CASE
66 use pubs
67 update employee
68 set e_wage =
69 case
70 when job_level = 』1』 then e_wage*1.08
71 when job_level = 』2』 then e_wage*1.07
72 when job_level = 』3』 then e_wage*1.06
73 else e_wage*1.05
74 end
75 --WHILE CONTINUE BREAK
76 declare @x int @y int @c int
77 select @x = 1 @y=1
78 while @x < 3
79 begin
80 print @x --列印變數x 的值
81 while @y < 3
82 begin
83 select @c = 100*@x + @y
84 print @c --列印變數c 的值
85 select @y = @y + 1
86 end
87 select @x = @x + 1
88 select @y = 1
89 end
90 --WAITFOR
91
92 --例 等待1 小時2 分零3 秒後才執行SELECT 語句
93
94 waitfor delay 』01:02:03』
95 select * from employee
96
97 --例 等到晚上11 點零8 分後才執行SELECT 語句
98
99 waitfor time 』23:08:00』
100
101
102SELECT
103
104 select *(列名) from table_name(表名) where column_name operator value ex宿主)
105 select * from stock_information where stockid = str(nid)
106 stockname = 'str_name'
107 stockname like '% find that %'
108 stockname like '[a-zA-Z]%' --------- ([]指定值的范圍)
109 stockname like '[^F-M]%' --------- (^排除指定范圍)
110 --------- 只能在使用like關鍵字的where子句中使用通配符)
111 or stockpath = 'path'
112 or stocknumber < 1000
113 and stockindex = 24
114 not stocksex = 'man'
115 stocknumber between 20 and 100
116 stocknumber in(10,20,30)
117 order by stockid desc(asc) --------- 排序,desc-降序,asc-升序
118 order by 1,2 --------- by列號
119 stockname = (select stockname from stock_information where stockid = 4)
120 --------- 子查詢
121 --------- 除非能確保內層select只返回一個行的值
122 --------- 否則應在外層where子句中用一個in限定符
123 select distinct column_name form table_name
124 --------- distinct指定檢索獨有的列值,不重復
125 select stocknumber ,"stocknumber + 10" = stocknumber + 10 from table_name
126 select stockname , "stocknumber" = count(*) from table_name group by stockname
127 --------- group by 將表按行分組,指定列中有相同的值
128 having count(*) = 2 --------- having選定指定的組
129
130 select *
131 from table1, table2
132where table1.id *= table2.id -------- 左外部連接,table1中有的而table2中沒有得以null表示
133 table1.id =* table2.id -------- 右外部連接
134 select stockname from table1
135 union [all] -------- union合並查詢結果集,all-保留重復行
136 select stockname from table2
137
138 insert
139
140 insert into table_name (Stock_name,Stock_number) value ("xxx","xxxx"
141 value (select Stockname , Stocknumber from Stock_table2)
142 -------value為select語句
143
144 update
145
146 update table_name set Stockname = "xxx" [where Stockid = 3]
147 Stockname = default
148 Stockname = null
149 Stocknumber = Stockname + 4
150
151 delete
152
153 delete from table_name where Stockid = 3
154 truncate table 表名 --------- 刪除表中所有行,仍保持表的完整性
155 drop table table_name --------- 完全刪除表
156
157 alter table -------- 修改資料庫表結構
158
159 alter table database.owner.table_name add column_name char(2) null ..
160 sp_help 表名 -------- 顯示表已有特徵
161 create table table_name (name char(20), age smallint, lname varchar(30))
162 insert into table_name select -------- 實現刪除列的方法(創建新表)
163 alter table table_name drop constraint Stockname_default
164 --------- 刪除Stockname的default約束
165
166
167常用函數(function)
168轉換函數
169convert(數據類型,值,格式)
170
171 統計函數
172
173 AVG --求平均值
174 COUNT --統計數目
175 MAX --求最大值
176 MIN --求最小值
177 SUM --求和
178 STDEV()
179
180 --STDEV()函數返回表達式中所有數據的標准差
181 --STDEVP()
182 --STDEVP()函數返回總體標准差
183
184 VAR()
185
186 --VAR()函數返回表達式中所有值的統計變異數
187
188 VARP()
189
190 --VARP()函數返回總體變異數
191
192 算術函數
193
194 三角函數
195
196 SIN(float_expression) --返回以弧度表示的角的正弦
197 COS(float_expression) --返回以弧度表示的角的餘弦
198 TAN(float_expression) --返回以弧度表示的角的正切
199 COT(float_expression) --返回以弧度表示的角的餘切
200
201 反三角函數
202
203 ASIN(float_expression) --返回正弦是FLOAT 值的以弧度表示的角
204 ACOS(float_expression) --返回餘弦是FLOAT 值的以弧度表示的角
205 ATAN(float_expression) --返回正切是FLOAT 值的以弧度表示的角
206 ATAN2(float_expression1,float_expression2)
207 ------返回正切是float_expression1 /float_expres-sion2的以弧度表示的角
208 DEGREES(numeric_expression)
209 ------把弧度轉換為角度返回與表達式相同的數據類型可為
210 ------INTEGER/MONEY/REAL/FLOAT 類型
211 RADIANS(numeric_expression)
212------把角度轉換為弧度返回與表達式相同的數據類型可為
213
214 ------INTEGER/MONEY/REAL/FLOAT 類型
215 EXP(float_expression) --返回表達式的指數值
216 LOG(float_expression) --返回表達式的自然對數值
217 LOG10(float_expression)--返回表達式的以10 為底的對數值
218 SQRT(float_expression) --返回表達式的平方根
219
220 取近似值函數
221
222 CEILING(numeric_expression)
223-------返回>=表達式的最大整數返回的數據類型與表達式相同可為
224 -------INTEGER/MONEY/REAL/FLOAT 類型
225 FLOOR(numeric_expression)
226-------返回<=表達式的最小整數返回的數據類型與表達式相同可為
227 -------INTEGER/MONEY/REAL/FLOAT 類型
228 ROUND(numeric_expression)
229-------返回以integer_expression 為精度的四捨五入值返回的數據
230 -------類型與表達式相同可為INTEGER/MONEY/REAL/FLOAT 類型
231 ABS(numeric_expression)
232-------返回表達式的絕對值返回的數據類型與表達式相同可為
233 -------INTEGER/MONEY/REAL/FLOAT 類型
234 SIGN(numeric_expression)
235-------測試參數的正負號返回0 零值1 正數或-1 負數返回的數據類型
236 -------與表達式相同可為INTEGER/MONEY/REAL/FLOAT 類型
237 PI() -------返回值為π 即3.1415926535897936
238 RAND([integer_expression])
239-------用任選的[integer_expression]做種子值得出0-1 間的隨機浮點數
240字元串函數
241
242 ASCII() ------函數返回字元表達式最左端字元的ASCII 碼值
243 CHAR() ------函數用於將ASCII 碼轉換為字元
244 ------如果沒有輸入0 ~ 255 之間的ASCII 碼值CHAR 函數會返回一個NULL 值
245 LOWER() ------函數把字元串全部轉換為小寫
246 UPPER() ------函數把字元串全部轉換為大寫
247 STR() ------函數把數值型數據轉換為字元型數據
248 LTRIM() ------函數把字元串頭部的空格去掉
249 RTRIM() ------函數把字元串尾部的空格去掉
250 LEFT(),RIGHT(),SUBSTRING() --函數返回部分字元串
251 CHARINDEX(),PATINDEX() --函數返回字元串中某個指定的子串出現的開始位置
252 SOUNDEX() ------函數返回一個四位字元碼
253 ------SOUNDEX函數可用來查找聲音相似的字元串但SOUNDEX函數對數字和漢字均只返回0 值
254 DIFFERENCE() ------函數返回由SOUNDEX 函數返回的兩個字元表達式的值的差異
255 ------0 兩個SOUNDEX 函數返回值的第一個字元不同
256 ------1 兩個SOUNDEX 函數返回值的第一個字元相同
257 ------2 兩個SOUNDEX 函數返回值的第一二個字元相同
258 ------3 兩個SOUNDEX 函數返回值的第一二三個字元相同
259 ------4 兩個SOUNDEX 函數返回值完全相同同
260 QUOTENAME() ------函數返回被特定字元括起來的字元串
261
262 /**//**//**//*select quotename('abc', '{') quotename('abc')
263 運行結果如下
264
265 {
266 {abc} [abc]*/
267 REPLICATE() ------函數返回一個重復character_expression 指定次數的字元串
268 /**//**//**//*select replicate('abc', 3) replicate( 'abc', -2)
269
270 運行結果如下
271
272 abcabcabc NULL*/
273 REVERSE() ------函數將指定的字元串的字元排列順序顛倒
274 REPLACE() ------函數返回被替換了指定子串的字元串
275 /**//**//**//*select replace('abc123g', '123', 'def')
276
277 運行結果如下
278
279 abcdefg*/
280
281 SPACE() ------函數返回一個有指定長度的空白字元串
282 STUFF() ------函數用另一子串替換字元串指定位置長度的子串
283
284 數據類型轉換函數
285
286 CAST() 函數語法如下
287 CAST() ( AS [ length ])
288 CONVERT() 函數語法如下
289 CONVERT() ([ length ], [, style])
290 select cast(100+99 as char) convert(varchar(12), getdate())
291
292 運行結果如下
293 199 Jan 15 2000
294
295 日期函數
296
297 DAY() ------函數返回date_expression 中的日期值
298 MONTH() ------函數返回date_expression 中的月份值
299 YEAR() ------函數返回date_expression 中的年份值
300 DATEADD( , ,)
301 -----函數返回指定日期date 加上指定的額外日期間隔number 產生的新日期
302 DATEDIFF( , ,)
303 -----函數返回兩個指定日期在datepart 方面的不同之處
304
305 DATENAME( , ------函數以字元串的形式返回日期的指定部分
306 DATEPART( , ------函數以整數值的形式返回日期的指定部分
307 GETDATE() ------函數以DATETIME 的預設格式返回系統當前的日期和時間
308
309 系統函數
310
311 APP_NAME() ------函數返回當前執行的應用程序的名稱
312 COALESCE() -----函數返回眾多表達式中第一個非NULL 表達式的值
313 COL_LENGTH(<'table_name'>, <'column_name'> ----函數返回表中指定欄位的長度值
314 COL_NAME(, ----函數返回表中指定欄位的名稱即列名
315 DATALENGTH() -----函數返回數據表達式的數據的實際長度
316 DB_ID(['database_name']) ------函數返回資料庫的編號
317 DB_NAME(database_id) ------函數返回資料庫的名稱
318 HOST_ID() -----函數返回伺服器端計算機的名稱
319 HOST_NAME() -----函數返回伺服器端計算機的名稱
320 IDENTITY([, seed increment]) [AS column_name])
321 --IDENTITY() 函數只在SELECT INTO 語句中使用用於插入一個identity column列到新表中
322 /**//**//**//*select identity(int, 1, 1) as column_name
323 into newtable
324 from oldtable*/
325
326 ISDATE() ----函數判斷所給定的表達式是否為合理日期
327 ISNULL(, --函數將表達式中的NULL 值用指定值替換
328 ISNUMERIC() ----函數判斷所給定的表達式是否為合理的數值
329 NEWID() ----函數返回一個UNIQUEIDENTIFIER 類型的數值
330 NULLIF(,
331 ----NULLIF 函數在expression1 與expression2 相等時返回NULL 值若不相等時則返回xpression1 的值

⑷ SQL滿足條件後自動更新一個置(SQL觸發器)

一、創建一個簡單的觸發器
觸發器是一種特殊的存儲過程,類似於事件函數,SQL Server™ 允許為 INSERT、UPDATE、DELETE 創建觸發器,即當在表中插入、更新、刪除記錄時,觸發一個或一系列 T-SQL語句。

觸發器可以在查詢分析器里創建,也可以在表名上點右鍵->「所有任務」->「管理觸發器」來創建,不過都是要寫 T-SQL 語句的,只是在查詢分析器里要先確定當前操作的資料庫。

創建觸發器用 CREATE TRIGGER

CREATE TRIGGER 觸發器名稱
ON 表名
FOR INSERT、UPDATE 或 DELETE
AS
T-SQL 語句
注意:觸發器名稱是不加引號的。

如下是聯機叢書上的一個示例,當在 titles 表上更改記錄時,發送郵件通知 MaryM。
CREATE TRIGGER reminder
ON titles
FOR INSERT, UPDATE, DELETE
AS
EXEC master..xp_sendmail 'MaryM',
'Don''t forget to print a report for the distributors.'

二、刪除觸發器
用查詢分析器刪除
在查詢分析器中使用 drop trigger 觸發器名稱 來刪除觸發器。
也可以同時刪除多個觸發器:drop trigger 觸發器名稱,觸發器名稱...
注意:觸發器名稱是不加引號的。在刪除觸發器之前可以先看一下觸發器是否存在:
if Exists(select name from sysobjects where name=觸發器名稱 and xtype='TR')

用企業管理器刪除
在企業管理器中,在表上點右鍵->「所有任務」->「管理觸發器」,選中所要刪除的觸發器,然後點擊「刪除」。

三、重命名觸發器
用查詢分析器重命名
exec sp_rename 原名稱, 新名稱
sp_rename 是 SQL Server™ 自帶的一個存儲過程,用於更改當前資料庫中用戶創建的對象的名稱,如表名、列表、索引名等。

用企業管理器重命名
在表上點右鍵->「所有任務」->「管理觸發器」,選中所要重命名的觸發器,修改觸發器語句中的觸發器名稱,點擊「確定」。

四、more....
INSTEAD OF
執行觸發器語句,但不執行觸發觸發器的 SQL 語句,比如試圖刪除一條記錄時,將執行觸發器指定的語句,此時不再執行 delete 語句。例:
create trigger f
on tbl
instead of delete
as
insert into Logs...

IF UPDATE(列名)
檢查是否更新了某一列,用於 insert 或 update,不能用於 delete。例:
create trigger f
on tbl
for update
as
if update(status) or update(title)
sql_statement --更新了 status 或 title 列

inserted、deleted
這是兩個虛擬表,inserted 保存的是 insert 或 update 之後所影響的記錄形成的表,deleted 保存的是 delete 或 update 之前所影響的記錄形成的表。例:
create trigger tbl_delete
on tbl
for delete
as
declare @title varchar(200)
select @title=title from deleted
insert into Logs(logContent) values('刪除了 title 為:' + title + '的記錄')
說明:如果向 inserted 或 deleted 虛擬表中取欄位類型為 text、image 的欄位值時,所取得的值將會是 null。

五、查看資料庫中所有的觸發器
在查詢分析器中運行:

use 資料庫名
go
select * from sysobjects where xtype='TR'
sysobjects 保存著資料庫的對象,其中 xtype 為 TR 的記錄即為觸發器對象。在 name 一列,我們可以看到觸發器名稱。

六、sp_helptext 查看觸發器內容
用查詢分析器查看

use 資料庫名
go
exec sp_helptext '觸發器名稱'
將會以表的樣式顯示觸發器內容。
除了觸發器外,sp_helptext 還可以顯示 規則、默認值、未加密的存儲過程、用戶定義函數、視圖的文本

用企業管理器查看

在表上點右鍵->「所有任務」->「管理觸發器」,選擇所要查看的觸發器存儲過程

七、sp_helptrigger 用於查看觸發器的屬性
sp_helptrigger 有兩個參數:第一個參數為表名;第二個為觸發器類型,為 char(6) 類型,可以是 INSERT、UPDATE、DELETE,如果省略則顯示指定表中所有類型觸發器的屬性。

例:

use 資料庫名
go
exec sp_helptrigger tbl

八、遞歸、嵌套觸發器
遞歸分兩種,間接遞歸和直接遞歸。我們舉例解釋如下,假如有表1、表2名稱分別為 T1、T2,在 T1、T2 上分別有觸發器 G1、G2。

間接遞歸:對 T1 操作從而觸發 G1,G1 對 T2 操作從而觸發 G2,G2 對 T1 操作從而再次觸發 G1...
直接遞歸:對 T1 操作從而觸發 G1,G1 對 T1 操作從而再次觸發 G1...
嵌套觸發器

類似於間接遞歸,間接遞歸必然要形成一個環,而嵌套觸發器不一定要形成一個環,它可以 T1->T2->T3...這樣一直觸發下去,最多允許嵌套 32 層。

設置直接遞歸

默認情況下是禁止直接遞歸的,要設置為允許有兩種方法:

T-SQL:exec sp_dboption 'dbName', 'recursive triggers', true
EM:資料庫上點右鍵->屬性->選項。
設置間接遞歸、嵌套

默認情況下是允許間接遞歸、嵌套的,要設置為禁止有兩種方法:

T-SQL:exec sp_configure 'nested triggers', 0 --第二個參數為 1 則為允許
EM:注冊上點右鍵->屬性->伺服器設置。

九、觸發器回滾
我們看到許多注冊系統在注冊後都不能更改用戶名,但這多半是由應用程序決定的, 如果直接打開資料庫表進行更改,同樣可以更改其用戶名,在觸發器中利用回滾就可以巧妙地實現無法更改用戶名。

use 資料庫名
go
create trigger tr
on 表名
for update
as
if update(userName)
rollback tran

關鍵在最後兩句,其解釋為:如果更新了 userName 列,就回滾事務。

十、禁用、啟用觸發器
禁用:alter table 表名 disable trigger 觸發器名稱
啟用:alter table 表名 enable trigger 觸發器名稱

如果有多個觸發器,則各個觸發器名稱之間用英文逗號隔開。

如果把「觸發器名稱」換成「ALL」,則表示禁用或啟用該表的全部觸發器。

⑸ 求一段SQL觸發器語法

ALTERTRIGGER[dbo].[dingdan]ON[dbo].[ordBillSub]
FORUPDATE,Insert
AS
BEGIN
--要是你的ordbillsub這個表有行號,直接拼成一個字元串,然後判斷拋出異常
SETNOCOUNTON;
Declare@MSGNVarchar(1000)=''
select@MSG=@MSG+',第'+a.行號+'行'
.prodid=b.prodidwherea.flag=2anda.price<>b.suggestprice
if@msg<>''
Begin
Set@MSG=stuff(@MSG,1,1,'')+'存在產品單價不等於建議售價,不可復核'
RAISERROR(@MSG,11,1)
End
END
Go


ALTERTRIGGER[dbo].[dingdan]ON[dbo].[ordBillSub]
FORUPDATE,Insert
AS
BEGIN
--要是你的ordbillsub這個表沒有行號,就構造一個行號,在拼成一個字元串,然後判斷拋出異常
SETNOCOUNTON;
Declare@MSGNVarchar(1000)=''
Select@MSG=@MSG+',第'+行號+'行'From(
SelectRow_Number()Over(OrderByGetdate())As行號
.prodid=b.prodidwherea.flag=2anda.price<>b.suggestprice
)S
if@msg<>''
Begin
Set@MSG=stuff(@MSG,1,1,'')+'存在產品單價不等於建議售價,不可復核'
RAISERROR(@MSG,11,1)
End
END
Go

⑹ 如何使用Navicat for PostgreSQL觸發函數

Navicat for PostgreSQL 觸發器常規屬性:
限制:勾選此項,創建一個限制觸發器。
觸發器類型:可供選擇的觸發器類型有 Table 或 View。需要注意的是,適用於PostgreSQL 9.0 或以上版本。
表名或視圖名:選擇表或視圖。
BEFORE:當嘗試在行操作前,可以指定觸發觸發器。
AFTER:當嘗試在行操作後,可以指定觸發觸發器。
INSTEAD OF:指定觸發觸發器來代替嘗試在行操作。
INSERT/UPDATE/DELETE:選擇激活觸發器的事件。
插入:每當一個新行插入表,觸發器會被激活。
更新:每當修改一個行,觸發器會被激活。
刪除:每當從表刪除一個行,觸發器會被激活。
TRUNCATE:觸發器定義為觸發 TRUNCATE。
更新欄位:指定一個列列表。如果至少一個列在 UPDATE 命令提及為目標,觸發器將會觸發。
STATEMENT:指定觸發器過程在每個 SQL 語句觸發一次。
ROW:指定觸發器過程在觸發器事件影響一行時觸發一次。
當:指定一個布林值 WHEN 條件,測試觸發器是否應該被觸發,該功能支持 PostgreSQL 9.0 或以上版本。
觸發函數模式和觸發函數:用戶提供的函數,被聲明為沒有引數及返回類型觸發器,當觸發器觸發時運行。
函數引數:一個當觸發器運行時,指供給函數的可選逗號分隔引數列表,引數是文本字元串常數。簡單的名和數字常數可以寫在這里,但它們都將被轉換為字元串。請檢查觸發函數的實施語言描述,關於如何可訪問觸發器引數,它可能和正常函數引數不同。
Navicat for PostgreSQL 觸發器限制:
可擱置:可擱置限制。
最初立即:在每個語句後檢查限制。
最初擱置:只在事務結束時檢查限制。
參考表模式和參考表名:限制參考表的模式和名。

⑺ SQl中觸發器怎樣執行的

創建觸發器 是特殊的存儲過程,自動執行,一般不要有返回值。

1、後觸發器 (AFTER,FOR)先執行對應語句,後執行觸發器中的語句。

2、前觸發器 並沒有真正的執行觸發語句(insert,update,delete),而是執行觸發後的語句。

3、行級觸發器 (FOR EACH ROW) 在SQL server 中不存在。

(7)sql觸發函數擴展閱讀:

創建觸發的語法

CREATE TRIGGER trigger_name --觸發器名稱

ON table_name --觸發的表

[WITH ENCRYPTION]

FOR [DELETE, INSERT, UPDATE] --選擇觸發器類型

AS --觸發後要做的語句

T-SQL語句

GO --結束標記