當前位置:首頁 » 編程語言 » sql觸發器after

sql觸發器after

發布時間: 2022-12-20 06:13:29

sql 觸發器 instead of 和 after

create
trigger
mytrg
on
表名
instead
of
insert
as
declare
@myii
begin
select
@myii=count
from
inserted
if(@myii>0)
insert
into
表名
select
*
from
inserted
else
begin
--這里執行你說的"滿足條件是觸發"的事情
--範例中是count<=0執行的操作,這里我是不執行插入,所以什麼都不需要寫
end
end
--以上範例是當count
列的值是>0的值就執行插入新數據,否則不執行插入的範例
用update是一樣的,假設表結構是
表(id[主鍵],count,c1,c2,c3,c4)
數據類型都是int
代碼如下:
create
trigger
mytrg
on
表名
instead
of
update
as
declare
@myii
int,@id
int,@c1
int,@c2
int,@c3
int,@c4
int
begin
select
@myii=count,@id=id,@c1=c1,@c2=c2,@c3=c3,@c4=c4
from
inserted
if(@myii>0)
update
表名
set
count=@myii,c1=@c1,c2=@c2,c3=@c3,c4=@c4
where
id=@id
--如果你再要更新其他欄位,必須在這一個觸發器實現,所以這個範例是你更新任意欄位(除id)
else
begin
--這里執行你說的"滿足條件是觸發"的事情
--範例中是count<=0執行的操作,這里我是不執行更新,所以什麼都不需要寫
end
end
--樓主說的死循環是不是你錯誤的理解了instead
of
--首先,instead
of觸發器是執行前觸發器,當執行操作觸發時,所執行的任務是不執行的,只有在你的觸發器里執行相應的插入或者更新操作,而觸發器本身的任務執行是不存在觸發本身的,所以不存在死循環

㈡ SQL觸發器的種類

樓主,你好!
觸發器的種類
有:
SQL
Server
2000
支持兩種類型的觸發器:AFTER
觸發器和INSTEAD
OF
觸發器。其中AFTER
觸發器即為SQL
Server
2000
版本以前所介紹的觸發器。該類型觸發器要求只有執行某一操作(INSERT
UPDATE
DELETE)
之後,觸發器才被觸發,且只能在表上定義。可以為針對表的同一操作定義多個觸發器。對於AFTER
觸發器,可以定義哪一個觸發器被最先觸發,哪一個被最後觸發,通常使用系統過程sp_settriggerorder
來完成此任務。
INSTEAD
OF
觸發器表示並不執行其所定義的操作(INSERT、
UPDATE、
DELETE),而僅是執行觸發器本身。既可在表上定義INSTEAD
OF
觸發器,也可以在視圖上定義INSTEAD
OF
觸發器,但對同一操作只能定義一個INSTEAD
OF
觸發器
希望能幫助到你!

㈢ 請問在sqlserver中什麼是前觸發型觸發器,什麼是後觸發型觸發器,怎麼區分呢

前觸發器:指在執行INSERT,UPDATE,DELETE之前去觸發【觸發器】要執行的語句
後觸發器:指在執行INSERT,UPDATE,DELETE之後再去觸發【觸發器】要執行的語句。
比如一個update觸發器,要執行刪除操作。
那麼有兩種情況,第一先update在delete(後觸發器)
第二先delete在update(前觸發器)

㈣ 我想問下SQL 2005中的觸發器的for,instead of,after3種觸發器的區別~

FOR | AFTER
AFTER 指定觸發器僅在觸發 SQL 語句中指定的所有操作都已成功執行時才被觸發。所有的引用級聯操作和約束檢查也必須在激發此觸發器之前成功完成。
如果僅指定 FOR 關鍵字,則 AFTER 為默認值。
不能對視圖定義 AFTER 觸發器。

INSTEAD OF
指定執行 DML 觸發器而不是觸發 SQL 語句,因此,其優先順序高於觸發語句的操作。

如果僅指定 FOR 關鍵字,則 AFTER 為默認值。
也就是說, FOR = AFTER。

下面是一個觸發器的例子:

-- 創建測試主表.
CREATE TABLE test_main (
id INT,
value VARCHAR(10),
PRIMARY KEY(id)
);

-- 創建測試子表.
CREATE TABLE test_sub (
id INT,
main_id INT,
value VARCHAR(10),
PRIMARY KEY(id)
);

-- 創建外鍵.
ALTER TABLE test_sub
ADD CONSTRAINT main_id_cons
FOREIGN KEY (main_id) REFERENCES test_main;

-- 創建 FOR 觸發器.
CREATE TRIGGER InsertTest
ON test_sub
FOR INSERT
AS
BEGIN
PRINT('INSERT test_sub!');
END;
Go

INSERT INTO test_sub VALUES( 100,100,'100');
消息 547,級別 16,狀態 0,第 1 行
INSERT 語句與 FOREIGN KEY 約束"main_id_cons"沖突。該沖突發生於資料庫"TestDev",表"dbo.test_main", column 'id'。
語句已終止。

從上面的結果可以看到,由於外鍵沖突,插入失敗,導致觸發器也沒有被執行。

-- 修改為 AFTER 觸發器.
ALTER TRIGGER InsertTest
ON test_sub
AFTER INSERT
......

INSERT INTO test_sub VALUES( 100,100,'100');
消息 547,級別 16,狀態 0,第 1 行
INSERT 語句與 FOREIGN KEY 約束"main_id_cons"沖突。該沖突發生於資料庫"TestDev",表"dbo.test_main", column 'id'。
語句已終止。

可以看到,AFTER 運行結果與 FOR 一樣。

-- 修改為 INSTEAD OF 觸發器.
ALTER TRIGGER InsertTest
ON test_sub
INSTEAD OF INSERT
......

INSERT INTO test_sub VALUES( 100,100,'100');
INSERT test_sub!
(1 行受影響)

從上面的結果看到,觸發器被執行了。
但是 test_sub 中並沒有 100,100,'100' 的數據。
原因在於:
INSTEAD OF 指定執行 DML 觸發器而不是觸發 SQL 語句

也就是說 當你的觸發器是 INSTEAD OF INSERT 的時候
你的 INSERT 語句,將直接執行這個觸發器
而不是等你 INSERT 語句執行完了,數據寫到表裡面了以後,才觸發。

㈤ SQL觸發器中怎麼給變數賦值

declare @Cnumber int;----銷售商品的數量\x0d\x0a declare @Cid varchar(50);----庫存裡面商品的ID\x0d\x0a--給需要減少的商品的數量賦一個初始值,確保在重新賦值時不會出錯\x0d\x0a\x0d\x0aSET @Cnumber = 0\x0d\x0a--給商品的編號賦賦一個初始值\x0d\x0aSET @Cid = '1'\x0d\x0a--如果不賦個初始值,在從inserted中獲取並賦值時會出現值為NULL的情況\x0d\x0a\x0d\x0a--獲取需要減少的商品的數量和商品的編號\x0d\x0a\x0d\x0aSELECT @Cnumber = Cnumber,@Cid = Cid FROM inserted\x0d\x0a--接下來的更新操作就是按照你原來的去更新就行了\x0d\x0a\x0d\x0a update Commodity---商品庫存 set Cnumber=Cnumber-@Cnumber where Cid=@Cid\x0d\x0a\x0d\x0a--也可以這樣更新\x0d\x0aUPDATE Commodity SET Cnumber = Cnumber - Cnumber\x0d\x0aFROM\x0d\x0a Commodity AS T\x0d\x0aINNER JOIN\x0d\x0a inserted AS T1\x0d\x0aON\x0d\x0a T.Cid = T1.Cid\x0d\x0a--這樣可以批量更新,那麼針對一條數據進行更新是沒問題的,同事也省去了聲明變數一級變數賦值的步驟

㈥ SQl中觸發器怎樣執行的

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

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

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

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

(6)sql觸發器after擴展閱讀:

創建觸發的語法

CREATE TRIGGER trigger_name --觸發器名稱

ON table_name --觸發的表

[WITH ENCRYPTION]

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

AS --觸發後要做的語句

T-SQL語句

GO --結束標記

㈦ 關於sql觸發器調試問題

在sql中,觸發器是一種特殊類型的存儲過程,它不同於sql的存儲過程。觸發器主要是通過事件進行觸發而被執行的,而存儲過程可以通過存儲過程名字而被直接調用。當對某一表進行諸如update、
insert、
delete
這些操作時,sql
server
就會自動執行觸發器所定義的sql
語句,從而確保對數據的處理必須符合由這些sql
語句所定義的規則。
觸發器的主要作用就是其能夠實現由主鍵和外鍵所不能保證的復雜的參照完整性和數據的一致性。除此之外,觸發器還有其它許多不同的功能:
(1)強化約束(enforce
restriction)
觸發器能夠實現比check
語句更為復雜的約束。
(2)跟蹤變化(auditing
changes)
觸發器可以偵測資料庫內的操作,從而不允許資料庫中未經許可的指定更新和變化。
(3)級聯運行(cascaded
operation)。
觸發器可以偵測資料庫內的操作,並自動地級聯影響整個資料庫的各項內容。例如,某個表上的觸發器中包含有對另外一個表的數據操作(如刪除,更新,插入)而該操作又導致該表上觸發器被觸發。
(4)存儲過程的調用(stored
procere
invocation)。
為了響應資料庫更新觸,發器可以調用一個或多個存儲過程,甚至可以通過外部過程的調用而在dbms(
資料庫管理系統)本身之外進行操作。
由此可見,觸發器可以解決高級形式的業務規則或復雜行為限制以及實現定製記錄等一些方面的問題。例如,觸發器能夠找出某一表在數據修改前後狀態發生的差異,並根據這種差異執行一定的處理。此外一個表的同一類型(insert、
update、
delete)的多個觸發器能夠對同一種數據操作採取多種不同的處理。
總體而言,觸發器性能通常比較低。當運行觸發器時,系統處理的大部分時間花費在參照其它表的這一處理上,因為這些表既不在內存中也不在資料庫設備上,而刪除表和插入表總是位於內存中。可見觸發器所參照的其它表的位置決定了操作要花費的時間長短。
觸發器的種類
sql
server
2000
支持兩種類型的觸發器:after
觸發器和instead
of
觸發器。其中after
觸發器即為sql
server
2000
版本以前所介紹的觸發器。該類型觸發器要求只有執行某一操作(insert
update
delete)
之後,觸發器才被觸發,且只能在表上定義。可以為針對表的同一操作定義多個觸發器。對於after
觸發器,可以定義哪一個觸發器被最先觸發,哪一個被最後觸發,通常使用系統過程sp_settriggerorder
來完成此任務。
instead
of
觸發器表示並不執行其所定義的操作(insert、
update、
delete),而僅是執行觸發器本身。既可在表上定義instead
of
觸發器,也可以在視圖上定義instead
of
觸發器,但對同一操作只能定義一個instead
of觸發器。

㈧ SQL中觸發器有什麼作用

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

㈨ sql2000支持before 和 after嗎

不支持before,可以用instead of 來替代,不過用法有很大的區別。

SQL Server 2000 支持兩種類型的觸發器:

AFTER 觸發器和INSTEAD OF 觸發器。
FOR觸發器不是before,SQL Server只有INSTEAD OF和AFTER 兩種觸發器。默認識AFTER 的,所以說 FOR觸發器就是AFTER 觸發器。

<1>AFTER 觸發器
AFTER 觸發器即為SQL Server 2000 版本以前所介紹的觸發器。該類型觸發器要求只有執行某一操作(INSERT UPDATE DELETE) 之後,觸發器才被觸發,且只能在表上定義。可以為針對表的同一操作定義多個觸發器。對於AFTER 觸發器,可以定義哪一個觸發器被最先觸發,哪一個被最後觸發,通常使用系統過程sp_settriggerorder 來完成此任務。

<2>INSTEAD OF觸發器
INSTEAD OF 觸發器表示並不執行其所定義的操作(INSERT、 UPDATE、 DELETE),而僅是執行觸發器本身。既可在表上定義INSTEAD OF 觸發器,也可以在視圖上定義INSTEAD OF 觸發器,但對同一操作只能定義一個INSTEAD OF 觸發器。

<3>異同點
<3.1>After觸發器只能用於數據表中,Instead Of觸發器可以用於數據表和視圖上,但兩種觸發器都不可以建立在臨時表上。
<3.2>一個數據表可以有多個觸發器,但是一個觸發器只能對應一個表。
<3.3>在同一個數據表中,對每個操作(如Insert、Update、Delete)而言可以建立許多個After觸發器,但Instead Of觸發器針對每個操作只有建立一個。
<3.4>如果針對某個操作即設置了After觸發器又設置了Instead Of觸發器,那麼Instead of觸發器一定會激活,而After觸發器就不一定會激活了。

㈩ SQL觸發器怎麼用

在SQL中,觸發器是一種特殊類型的存儲過程,它不同於SQL的存儲過程。觸發器主要是通過事件進行觸發而被執行的,而存儲過程可以通過存儲過程名字而被直接調用。當對某一表進行諸如UPDATE、 INSERT、 DELETE 這些操作時,SQL Server 就會自動執行觸發器所定義的SQL 語句,從而確保對數據的處理必須符合由這些SQL 語句所定義的規則。

觸發器的主要作用就是其能夠實現由主鍵和外鍵所不能保證的復雜的參照完整性和數據的一致性。除此之外,觸發器還有其它許多不同的功能:

(1)強化約束(Enforce restriction)

觸發器能夠實現比CHECK 語句更為復雜的約束。

(2)跟蹤變化(Auditing changes)

觸發器可以偵測資料庫內的操作,從而不允許資料庫中未經許可的指定更新和變化。

(3)級聯運行(Cascaded operation)。

觸發器可以偵測資料庫內的操作,並自動地級聯影響整個資料庫的各項內容。例如,某個表上的觸發器中包含有對另外一個表的數據操作(如刪除,更新,插入)而該操作又導致該表上觸發器被觸發。

(4)存儲過程的調用(Stored procere invocation)。

為了響應資料庫更新觸,發器可以調用一個或多個存儲過程,甚至可以通過外部過程的調用而在DBMS( 資料庫管理系統)本身之外進行操作。
由此可見,觸發器可以解決高級形式的業務規則或復雜行為限制以及實現定製記錄等一些方面的問題。例如,觸發器能夠找出某一表在數據修改前後狀態發生的差異,並根據這種差異執行一定的處理。此外一個表的同一類型(INSERT、 UPDATE、 DELETE)的多個觸發器能夠對同一種數據操作採取多種不同的處理。

總體而言,觸發器性能通常比較低。當運行觸發器時,系統處理的大部分時間花費在參照其它表的這一處理上,因為這些表既不在內存中也不在資料庫設備上,而刪除表和插入表總是位於內存中。可見觸發器所參照的其它表的位置決定了操作要花費的時間長短。

觸發器的種類

SQL Server 2000 支持兩種類型的觸發器:AFTER 觸發器和INSTEAD OF 觸發器。其中AFTER 觸發器即為SQL Server 2000 版本以前所介紹的觸發器。該類型觸發器要求只有執行某一操作(INSERT UPDATE DELETE) 之後,觸發器才被觸發,且只能在表上定義。可以為針對表的同一操作定義多個觸發器。對於AFTER 觸發器,可以定義哪一個觸發器被最先觸發,哪一個被最後觸發,通常使用系統過程sp_settriggerorder 來完成此任務。

INSTEAD OF 觸發器表示並不執行其所定義的操作(INSERT、 UPDATE、 DELETE),而僅是執行觸發器本身。既可在表上定義INSTEAD OF 觸發器,也可以在視圖上定義INSTEAD OF 觸發器,但對同一操作只能定義一個INSTEAD OF觸發器。

熱點內容
隨機啟動腳本 發布:2025-07-05 16:10:30 瀏覽:525
微博資料庫設計 發布:2025-07-05 15:30:55 瀏覽:24
linux485 發布:2025-07-05 14:38:28 瀏覽:304
php用的軟體 發布:2025-07-05 14:06:22 瀏覽:754
沒有許可權訪問計算機 發布:2025-07-05 13:29:11 瀏覽:431
javaweb開發教程視頻教程 發布:2025-07-05 13:24:41 瀏覽:698
康師傅控流腳本破解 發布:2025-07-05 13:17:27 瀏覽:240
java的開發流程 發布:2025-07-05 12:45:11 瀏覽:685
怎麼看內存卡配置 發布:2025-07-05 12:29:19 瀏覽:282
訪問學者英文個人簡歷 發布:2025-07-05 12:29:17 瀏覽:834