『壹』 表頭((PORequest)的欄位更新後,表體(PORequestEntry)欄位也做相應的更新,如何寫sql觸發器
假定表名稱為mytable,行標識欄位為id。
CREATETRIGGER[TR_Sample]ON[dbo].[mytable]
FORINSERT,UPDATE
AS
declare@fstatusint
declare@idnumeric
DECLAREm_cursorCURSORFOR
SELECTid,DstatusFROMinserted
OPENm_cursor
FETCHNEXTFROMm_cursor
INTO@id,@fstatus
WHILE@@FETCH_STATUS=0
BEGIN
IF@fstatus=1
UPDATEmytableSETFqty=Fqty+FEntrySelfP0134WHEREid=@id
ELSE
UPDATEmytableSETFqty=Fqty-FEntrySelfP0134WHEREid=@id
FETCHNEXTFROMm_cursor
INTO@id,@fstatus
END
CLOSEm_cursor
DEALLOCATEm_cursor
『貳』 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觸發器insert觸發器如何使用
DML觸發器有三類:
1, insert觸發器;
2, update觸發器;
3, delete觸發器;
觸發器的組成部分:
觸發器的聲明,指定觸發器定時,事件,表名以類型
觸發器的執行,PL/SQL塊或對過程的調用
觸發器的限制條件,通過where子句實現
類型:
應用程序觸發器,前台開發工具提供的;
資料庫觸發器,定義在資料庫內部由某種條件引發;分為:
DML觸發器;
資料庫級觸發器;
替代觸發器;
DML觸發器組件:
1,觸發器定時
2,觸發器事件
3,表名
4, 觸發器類型
5, When子句
6, 觸發器主體
可創建觸發器的對象:資料庫表,資料庫視圖,用戶模式,資料庫實例
創建DML觸發器:
Create [or replace] trigger [模式.]觸發器名
Before| after insert|delete|(update of 列名)
On 表名
[for each row]
When 條件
PL/SQL塊
For each row的意義是:在一次操作表的語句中,每操作成功一行就會觸發一次;不寫的話,表示是表級觸發器,則無論操作多少行,都只觸發一次;
When條件的出現說明了,在DML操作的時候也許一定會觸發觸發器,但是觸發器不一定會做實際的工作,比如when 後的條件不為真的時候,觸發器只是簡單地跳過了PL/SQL塊;
Insert觸發器的創建:
create or replace trigger tg_insert
before insert on student
begin
dbms_output.put_line('insert trigger is chufa le .....');
end;
執行的效果:
SQL> insert into student
2 values(202,'dongqian','f');
insert trigger is chufa le .....
update表級觸發器的例子:
create or replace trigger tg_updatestudent
after update on student
begin
dbms_output.put_line('update trigger is chufale .....');
end;
運行效果:
SQL> update student set se='f';
update trigger is chufale .....
已更新8行;
可見,表級觸發器在更新了多行的情況下,只觸發了一次;
『肆』 SQL觸發器。當我一個資料庫中的一個表更新一個信息,另個表插入一個條信息怎麼寫
假設有兩張表,一張為操作記錄表tbA(MyID,MyX,MyY),一張為賬戶余額表tbB(MyID,MySum)
MyID:int類型
MyX:money類型
MyY:int類型(-1取錢,1存錢)
MySum:money類型
我想在我記錄存入多少錢的同時,在余額表裡的MySum里的數據也更著改變,而我們也不需要對余額有任何操作
示例代碼如下:
create trigger MyMoneyTrg
on tbA
for insert,update
as
declare @ID int,
@X money,
@Y int
begin
select @ID=MyID,@X=MyX,@Y=MyY from inserted
--這里從inserted表裡取到了更新的必要數據,inserted表是更新的數據暫時存放的表,觸發器執行結束這個表就消失了
update tbB set MySum=(@X*@Y+Mysum) where MyID=@ID
end
這個範例能在觸發器的作用\方法\語法等方面描述觸發器,希望這位同學能舉一反三
『伍』 SQL觸發器怎樣更新數據
--創建需觸發的表
create table cfq(
a int,
b int
)
--創建觸發器,監視該表
CREATE TRIGGER t_cfq ON dbo.cfq
for INSERT, UPDATE, DELETE
AS
begin
set nocount off
declare @a int
select @a=a from cfq
update cfq set b=@a where a=@a
end
--觸動觸發器
insert into cfq(a,b) select 2,null
insert into cfq(a,b) select 3,null
select * from cfq
所得結果
a b
2 2
3 3
『陸』 SQl中觸發器怎樣執行的
創建觸發器 是特殊的存儲過程,自動執行,一般不要有返回值。
1、後觸發器 (AFTER,FOR)先執行對應語句,後執行觸發器中的語句。
2、前觸發器 並沒有真正的執行觸發語句(insert,update,delete),而是執行觸發後的語句。
3、行級觸發器 (FOR EACH ROW) 在SQL server 中不存在。
(6)sql觸發器更新後如何表示擴展閱讀:
創建觸發的語法
CREATE TRIGGER trigger_name --觸發器名稱
ON table_name --觸發的表
[WITH ENCRYPTION]
FOR [DELETE, INSERT, UPDATE] --選擇觸發器類型
AS --觸發後要做的語句
T-SQL語句
GO --結束標記
『柒』 跪求sql觸發器代碼的注釋
create trigger rr --觸發器名稱rr
on stud_info --表stud_info上的觸發器
after insert,update,delete --這是一個插入,更新,刪除觸發器
as
if
(select count(*) from inserted)>0 and (select count(*) from deleted)=0 --執行插入操作時
begin
declare @stud_id char(10),@name char(4) --聲明變數
set @stud_id=(select stud_id from inserted) --插入的id號賦值給@stud_id
set @name=(select name from inseerted) --插入的name賦值給@name
insert into stud_grade(stud_id,name)values(@stud_id,@name) --插入的id和name存入表stud_grade
end
else
if
(select count(*) from inserted)>0 and (select count(*) from deleted)>0 --執行update時
begin
set @stud_id=(select stud_id from inserted)
set @name=(select name from inseerted)
update stud_grade
set stud_id=@stud_id,name=@name
where stud_id=(select stud_id from deleted) --將stud_grade表中對應的記錄更新
end
else --執行刪除記錄時
begin
delete
from stud_grade
where stud_grade.stud_id=(select stud_id from deleted) --將表stud_grade中對應記錄刪除
end
『捌』 sql查詢 更新語句怎麼寫
1、首先需要打開sql server 資料庫。