① sql中觸發器怎樣執行的
創建觸發器 是特殊的存儲過程,自動執行,一般不要有返回值。
1、後觸發器 (AFTER,FOR)先執行對應語句,後執行觸發器中的語句。
2、前觸發器 並沒有真正的執行觸發語句(insert,update,delete),而是執行觸發後的語句。
3、行級觸發器 (FOR EACH ROW) 在SQL server 中不存在。
(1)觸發器怎麼停止資料庫擴展閱讀:
創建觸發的語法
CREATE TRIGGER trigger_name --觸發器名稱
ON table_name --觸發的表
[WITH ENCRYPTION]
FOR [DELETE, INSERT, UPDATE] --選擇觸發器類型
AS --觸發後要做的語句
T-SQL語句
GO --結束標記
② SQL。。如何停用,刪除一個資料庫中所有的觸發器
use 庫名
go
alter *
from sysobjects
where type='TR'
go
--以上是顯示當前庫中所有的觸發器--
use 庫名
drop trigger test1
--根據表觸發器名一個一個的刪就行了,順便說一下沒有一下子全部刪除的命令,祝你好運--
③ ORACLE觸發器中如何終止SQL語句的執行
拋出異常,比如:
if new.col1 is null then
RAISE_APPLICATION_ERROR(-20001, 'col1 is null.');
end if;
④ 資料庫中觸發器的作用是什麼
觸發器是資料庫提供給程序員和數據分析員來保證數據完整性的一種機制,它是一種與數據表事件相關的特殊的存儲過程。觸發器的執行不是由程序調用,也不需要手工開啟,而是由數據表上的事件來觸發,當用戶對一個數據表進行增、刪、改操作時就會激活它執行。
觸發器可以查詢其他表,而且可以包含復雜的SQL語句。它們主要用於強制服從復雜的業務規則或要求。觸發器也可用於強制引用完整性,以便在多個表中添加、更新或刪除行時,保留在這些表之間所定義的關系。
觸發器功能強大,可以輕松可靠地實現許多復雜的功能,但也不能過於依賴觸發器,濫用觸發器會造成關系資料庫及應用程序維護困難,性能、效率低下等問題的產生,在實際問題中,要根據實際需要選擇合適的解決方案。觸發器是一種特殊的存儲過程,在插入、刪除、修改特定表中的數據時觸發執行,擁有比資料庫本身更強大的數據控制能力,其作用有以下四大方面。
1.數據安全數據安全主要是指對信息系統中的業務數據提供一種數據變更的審核機制,當其通過安全策略的審核後,允許用戶變更相關數據,否則直接拒絕數據變更的請求。
安全原理:基於資料庫的值使用戶具有操作資料庫的某種權利。
((1)可以基於時間限制用戶的操作。例如,不允許下班後和節假日修改資料庫數據。
(2)可以基於資料庫中的數據限制用戶的操作。例如,不允許股票價格的升幅一次超過10%。
2.數據審計數據審計主要是指對數據伺服器上的記錄進行變更時的一種用戶許可權的即時審查與用戶行為的全方位記錄,以便事後對數據變更過程的追溯,保證數據變更的合法性。
審計原理:跟蹤用戶對資料庫的操作。
((1)審計用戶操作資料庫的語句。
(2)把用戶對資料庫的更新寫入審計表。
3.數據約束數據約束是指對用戶的操作行為將導致業務數據與實際情況相悖的行為進行檢查約束,而不讓其發生,從而保證數據的完整性與一致性。
約束原理:對用戶操作與實際邏輯的約束檢查。
((1)實現數據完整性檢查和約束。例如,回退任何企圖買進超過自己資金的貨物。
(2)提供可變的預設值。
4.數據連環更新數據連環更新是指當對數據進行更新操作時,將所有與此數據相關聯的數據作聯合的更新操作,以保證數據的完整性與一致性。
連環更新原理:對關聯數據作聯合更新操作。
((1)修改或刪除時級聯修改或刪除其他表中與之匹配的行。
(2)修改或刪除時把其他表中與之匹配的行設成NULL值。
(3)修改或刪除時把其他表中與之匹配的行級聯設成預設值。
⑤ 在資料庫里怎麼使用觸發器
觸發器是一類特殊的存儲過程,開發人員也可以定義、編寫符合業務需求的觸發器來維護數據的完整性。觸發器的控制流程及控制語句與存儲過程相同,但觸發器與存儲過程還是有相當大的差別,觸發器的定義格式及開啟方式與存儲過程不同,作為數據管理員或編程人員,熟練掌握觸發器的用法對維護、操作資料庫非常重要。基本語法1.創建觸發器語法格式創建語法:CREATETRIGGER+觸發器名稱+觸發時間點+觸發事件+ON+表名+FOREACHROWBEGIN…END其中,觸發時間點:BEFORE或AFTER,指明是在觸發事件之前還是之後執行。
觸發事件:INSERT、UPDATE、DELETE事件。例如,以下語句創建一個名字叫upd_check的觸發器,其在對account表作更新(UPDATE)操作之前(BEFORE)自動觸發。
CREATETRIGGERupd_…END2.刪除觸發器語法格式DROPTRIGGER+觸發器名稱3.觸發器案例用tab.sql腳本創建表環境,然後用下面語句創建觸發器。當往tab1表添加記錄後將觸發此觸發器,將此新記錄同時插入tab2表中。
DELIMITER//DROPTRIGGERIFEXISTSt_afterinsert_on_tab1;CREATETRIGGERt_afterinsert_on_(tab2_id)values(new.tab1_id);END;//DELIMITER;當用下面語句往tab1表插入記錄時,tab2表中同時也添加了同樣的記錄,如圖tab1數據表
tab1數據表
tab2數據表
INSERTINTOtab1(tab1_id)values(')
tab.sql
⑥ oracle 觸發器中如何中止當前的SQL語句
在代碼中加入 pause; 就可以中止當前的SQl,另外你還可以將當前需要的資料顯示出來。 便於查詢錯誤。
⑦ 如何使資料庫中所有觸發器失效或者全部關閉
use 庫名 go alter * from sysobjects where type='TR' go --以上是顯示當前庫中所有的觸發器-- use 庫名 drop trigger test1 --根據表觸發器名一個一個的刪就行了,順便說一下沒有一下子全部刪除的命令
⑧ 資料庫問題之觸發器
instead of 執行前觸發器,一般叫替代觸發器
在用戶執行數據操作數據之前,觸發器觸發,執行觸發器代碼,不執行用戶的操作
根據這個特性,
1>instead of 觸發器可以為視圖添加數據操作的功能
如:
表:
表1(ID,NAME) 表2(ID,DATE)
視圖 :
DATA(表1.ID,表1.NAME,表2.DATE)
為DATA視圖添加insert操作:代碼如下
create triger trgName
on DATA
instead of insert
as
begin
insert into 表1 select ID,NAME from inserted
insert into 表2 select ID,DATE from inserted
end
2>可以根據情況進行數據操縱(insert的作用)
如:我們需要只有5月份才可以操縱數據,其他月份都禁止操縱
使用instead of觸發器可以避免,插入了數據又刪除的,無效勞動,浪費不必要的系統資源
3>可以根據條件判斷數據的合法性,在執行或否決執行(update的作用),沒有必要執行之後再進行回滾
4>可以防止表中數據,或一定條件的數據被刪除(delete的作用),沒有必要刪除了在重新寫入表
總的來說,我用一張簡單的圖來說明下,如:
(A用戶的DML操縱,B為實際的DML操縱,C為觸發器及其代碼)
圖1:for after 觸發器
A↓
B↓
C↓
結束
圖2:instead of觸發器
A↓
C↓
結束
所以instead of觸發器必須要進行實質的DML操縱
⑨ 資料庫的觸發器怎麼進行高級操作
1.new與old在資料庫的觸發器中經常會用到更新前的值和更新後的值,所以掌握new和old的語法很重要。
old:表示操作執行前的數據行。
new:表示操作執行後的數據行。
一User數據表如圖User數據表所示,若執行以下更新操作語句:updateUsersetscore=80whereuser_id=1
User數據表
則在此操作中,old表示未執行update語句前user_id=1這行記錄;而new表示執行update語句後user_id=1這行記錄。
從上面的表述中可知,new與old均表示某一行記錄,old所表示的是寫操作發生前的這一行舊數據,new則表示寫操作發生後的這一行新的數據。正因如此,可以把new與old看作面向對象編程裡面的一個對象或實例,與面向對象的方式類似,可用new.欄位名或old.欄位名的方式進行存取值。
old.欄位名:表示未執行操作前的該行對應的某欄位值。
new.欄位名:表示執行操作後的該行對應的某欄位值。
在上面User表的update操作中:old.score=60,表示update操作前score欄位的舊值是60。
new.score=80,表示update操作後score欄位的新值是80。
如果要使用new語句進行賦值,只能在before類型的觸發器中使用,不能在after類型的觸發器中使用。
更新操作前使用before先賦值,再插入資料庫中。如以下語句是正確的:.金額=0;END更新操作後,不能在after中用new賦值,因為操作已經結束,只能讀取內容。如以下語句是錯誤的:.金額=0;ENDnew與old的區別:前者可在before觸發器中賦值、取值,也可在after觸發器中取值;
後者只能用於取值,因為賦值沒有意義。
注意:INSERT語句,只有new合法;
DELETE語句,只有old才合法;
UPDATE語句,可以同時使用new和old。
2.before與afterbefore與after表示觸發器觸發的時間點是在寫操作開始之前,還是在寫操作完成後,正因為它們有時間點先後的問題,因此它們的功能與使用場合有非常大的差別。
(1)before((1)先完成觸發操作,再執行業務數據的增刪改。
(2)觸發的語句先於監視的業務語句。
(3)有機會影響即將發生的操作。
2)after((1)先完成業務數據的增刪改,再觸發。
(2)觸發的語句晚於監視的業務語句。
(3)無法影響前面的增刪改動作。
3.異常處理MySQL現有版本中不支持自定義異常,當某處需要拋出異常時,可拋出一個系統異常(類似運行異常)。如故意往不存在的表中插入數據等方式來觸發系統異常的拋出,當異常拋出時,本次正在執行的所有操作會終止執行,並回滾所有數據到操作發生前的狀態。
在觸發器中,需要拋出異常的場景有很多,以下兩個方面較為普遍:((1)新進來的數據不符合業務邏輯。
例如,①倉庫最大商品庫存數為10,訂單要求一次性購買數量20。
②銀行賬戶上只有50元,想要支付100元的賬單。
(2)許可權不足,不允許操作。
例如,①普通用戶通過非法途徑操作核心資源表。
②在非工作日修改業務數據。4.觸發器案例用mytab.sql腳本創建表環境,然後用下面語句創建觸發器。當往mytab表添加記錄時,觸發器中將拋出異常,導致所有操作終止,並回滾所有操作的數據。
DELIMITER//DROPTRIGGERIFEXISTSt_exception_trigger;CREATETRIGGERt_exception_--tab3表不存在
⑩ sql server 2008怎麼停止觸發器
-- 查看資料庫已有觸發器 use yourdatabase go select * from sysobjects where xtype='TR' -- 查看單個觸發器 exec sp_helptext '觸發器名' --刪除觸發器: 基本語句如下: drop trigger trigger_name