① 資料庫的觸發器怎麼進行高級操作
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語句。它們主要用於強制服從復雜的業務規則或要求。觸發器也可用於強制引用完整性,以便在多個表中添加、更新或刪除行時,保留在這些表之間所定義的關系。
觸發器功能強大,可以輕松可靠地實現許多復雜的功能,但也不能過於依賴觸發器,濫用觸發器會造成關系資料庫及應用程序維護困難,性能、效率低下等問題的產生,在實際問題中,要根據實際需要選擇合適的解決方案。觸發器是一種特殊的存儲過程,在插入、刪除、修改特定表中的數據時觸發執行,擁有比資料庫本身更強大的數據控制能力,其作用有以下四大方面。
1.數據安全數據安全主要是指對信息系統中的業務數據提供一種數據變更的審核機制,當其通過安全策略的審核後,允許用戶變更相關數據,否則直接拒絕數據變更的請求。
安全原理:基於資料庫的值使用戶具有操作資料庫的某種權利。
((1)可以基於時間限制用戶的操作。例如,不允許下班後和節假日修改資料庫數據。
(2)可以基於資料庫中的數據限制用戶的操作。例如,不允許股票價格的升幅一次超過10%。
2.數據審計數據審計主要是指對數據伺服器上的記錄進行變更時的一種用戶許可權的即時審查與用戶行為的全方位記錄,以便事後對數據變更過程的追溯,保證數據變更的合法性。
審計原理:跟蹤用戶對資料庫的操作。
((1)審計用戶操作資料庫的語句。
(2)把用戶對資料庫的更新寫入審計表。
3.數據約束數據約束是指對用戶的操作行為將導致業務數據與實際情況相悖的行為進行檢查約束,而不讓其發生,從而保證數據的完整性與一致性。
約束原理:對用戶操作與實際邏輯的約束檢查。
((1)實現數據完整性檢查和約束。例如,回退任何企圖買進超過自己資金的貨物。
(2)提供可變的預設值。
4.數據連環更新數據連環更新是指當對數據進行更新操作時,將所有與此數據相關聯的數據作聯合的更新操作,以保證數據的完整性與一致性。
連環更新原理:對關聯數據作聯合更新操作。
((1)修改或刪除時級聯修改或刪除其他表中與之匹配的行。
(2)修改或刪除時把其他表中與之匹配的行設成NULL值。
(3)修改或刪除時把其他表中與之匹配的行級聯設成預設值。
④ 資料庫觸發器有什麼作用
觸發器的作用:
自動計算數據值,如果數據的值達到了一定的要求,則進行特定的處理。
同步實時地復製表中的數據。
實現復雜的非標準的資料庫相關完整性規則。
可在寫入數據表前,強制檢驗或轉換數據。
觸發器發生錯誤時,異動的結果會被撤銷。
部分資料庫管理系統可以針對數據定義語言(DDL)使用觸發器,稱為DDL觸發器。
可依照特定的情況,替換異動的指令 (INSTEAD OF)。
(4)觸發器修改資料庫擴展閱讀:
分類
SQL Server 包括三種常規類型的觸發器:DML 觸發器、DDL 觸發器和登錄觸發器。
DML觸發器
當資料庫中表中的數據發生變化時,包括insert,update,delete任意操作,如果我們對該表寫了對應的DML觸發器,那麼該觸發器自動執行。
DML觸發器的主要作用在於強制執行業 務規則,以及擴展Sql Server約束,默認值等。因為我們知道約束只能約束同一個表中的數據,而觸發器中則可以執行任意Sql命令。
DDL觸發器
它是Sql Server2005新增的觸發器,主要用於審核與規范對資料庫中表,觸發器,視圖等結構上的操作。比如在修改表,修改列,新增表,新增列等。
它在資料庫結構發生變化時執行,我們主要用它來記錄資料庫的修改過程,以及限製程序員對資料庫的修改,比如不允許刪除某些指定表等。
登錄觸發器
登錄觸發器將為響應 LOGIN 事件而激發存儲過程。與 SQL Server 實例建立用戶會話時將引發此事件。登錄觸發器將在登錄的身份驗證階段完成之後且用戶會話實際建立之前激發。
因此,來自觸發器內部且通常將到達用戶的所有消息(例如錯誤消息和來自 PRINT 語句的消息)會傳送到 SQL Server 錯誤日誌。如果身份驗證失敗,將不激發登錄觸發器。
參考資料來源:網路-觸發器
⑤ 觸發器在資料庫設計和編程中起到什麼重要作用
我的講解:
簡單來講哪就是事件觸發。
比如你對資料庫中的表進行了一個插刪等操作,你想在你即將做或者完成這個操作的時候程序能自動做一點別的工作,比如你想對插入數據檢查一下或者對刪除後的數據總數進行一下統計。
本來哪,你可以把這個工作寫在自己的程序里,就是把檢查寫在你插入動作之前或者把統計數目寫在刪除動作之後。這樣的問題是:你要做插刪的時候就都要寫這些代碼,而且很容易就遺漏了。
而觸發器哪,你定義在某個操作上,比如把那個檢查的工作過程定義成插入的前觸發器,把統計工作定義成後觸發器,那麼在你進行插入刪除的時候,資料庫那邊的程序就自動的給你做了這個工作了。
主要作用哪:我感覺
一是完整性(防止自己編程的遺漏),
二是簡單,
三是由資料庫程序(比如Oracle)進行這項工作,而不是由你自己的程序做,效率高。
下面是人家的一些教程,其實道理是很簡單的。你可以用它後面講的幾個資料庫的例子,自己寫一個,試試就知道了。
————————————————————————————————————————
一 觸發器介紹
觸發器是一種特殊的存儲過程,它在插入,刪除或修改特定表中
的數據時觸發執行,它比資料庫本身標準的功能有更精細和更復雜的
數據控制能力。資料庫觸發器有以下的作用:
* 安全性。可以基於資料庫的值使用戶具有操作資料庫的某種權
利。
# 可以基於時間限制用戶的操作,例如不允許下班後和節假日
修改資料庫數據。
# 可以基於資料庫中的數據限制用戶的操作,例如不允許股票
的價格的升幅一次超過10%。
* 審計。可以跟蹤用戶對資料庫的操作。
# 審計用戶操作資料庫的語句。
# 把用戶對資料庫的更新寫入審計表。
* 實現復雜的數據完整性規則。
# 實現非標準的數據完整性檢查和約束。觸發器可產生比規則
更為復雜的限制。與規則不同,觸發器可以引用列或資料庫對
象。例如,觸發器可回退任何企圖吃進超過自己保證金的期貨。
# 提供可變的預設值。
* 實現復雜的非標準的資料庫相關完整性規則。觸發器可以對數
據庫中相關的表進行連環更新。例如,在auths表author_code列上的
刪除觸發器可導致相應刪除在其它表中的與之匹配的行。
# 在修改或刪除時級聯修改或刪除其它表中的與之匹配的行。
# 在修改或刪除時把其它表中的與之匹配的行設成NULL值。
# 在修改或刪除時把其它表中的與之匹配的行級聯設成預設值。
# 觸發器能夠拒絕或回退那些破壞相關完整性的變化,取消試
圖進行數據更新的事務。當插入一個與其主健不匹配的外部鍵
時,這種觸發器會起作用。例如,可以在books.author_code
列上生成一個插入觸發器,如果新值與auths.author_code列
中的某值不匹配時,插入被回退。
* 同步實時地復製表中的數據。
* 自動計算數據值,如果數據的值達到了一定的要求,則進行特
定的處理。例如,如果公司的帳號上的資金低於5萬元則立即給財務人
員發送警告數據。
ORACLE與SYBASE資料庫的觸發器有一定的區別,下面將分別講述
這兩種資料庫觸發器的作用和寫法。
二 ORACLE 觸發器
ORACLE產生資料庫觸發器的語法為:
create [or replace] trigger 觸發器名 觸發時間 觸發事件
on 表名
[for each row]
pl/sql 語句
其中:
觸發器名:觸發器對象的名稱。由於觸發器是資料庫自動執行
的,因此該名稱只是一個名稱,沒有實質的用途。
觸發時間:指明觸發器何時執行,該值可取:
before---表示在資料庫動作之前觸發器執行;
after---表示在資料庫動作之後出發器執行。
觸發事件:指明哪些資料庫動作會觸發此觸發器:
insert:資料庫插入會觸發此觸發器;
update:資料庫修改會觸發此觸發器;
delete:資料庫刪除會觸發此觸發器。
表 名:資料庫觸發器所在的表。
for each row:對表的每一行觸發器執行一次。如果沒有這一
選項,則只對整個表執行一次。
舉例:下面的觸發器在更新表auths之前觸發,目的是不允許在
周末修改表:
create trigger auth_secure
before insert or update or delete //對整表更新前觸發
on auths
begin
if(to_char(sysdate,'DY')='SUN'
RAISE_APPLICATION_ERROR(-20600,'不能在周末修改表auths');
end if;
end
三 SYBASE資料庫觸發器
SYBASE資料庫觸發器的作用與ORACLE非常類似,僅有較小的差異。
SYBASE產生觸發器的語法為:
CREATE TRIGGER 觸發器名
ON 表名
FOR INSERT,UPDATE,DELETE
AS
SQL_statement |
FOR INSERT,UPDATE
AS
IF UPDATE(column_name) [AND|OR UPDATE(column_name)]...
SQL_statements
上面FOR子句用來指定在觸發器上的哪些數據更新命令可激活該
觸發器。IF UPDATE子句檢查對指定列的操作類型,在IF UPDATE子句
中可指定多個列。
與ORACLE不同,對於每條SQL語句,觸發器只執行一次。觸發器
在數據更新語句完成以後立即執行。觸發器和啟動它的語句被當作一
個事務處理,事務可以在觸發器中回退。
下面舉例說明SYBASE觸發器的寫法。
create trigger forinsert_books
on books
for insert
as
if(select count(*) from auths,inserted
where auths.author_code=insert.author_code)!=@@rowcount
begin
rollback transaction
print "books 表中 author_code 列的值在auths 表中不存在。"
end
⑥ 如何用觸發器實現記錄資料庫表更改的記錄
舉個例子吧:
如:
記錄表A的更新記錄,
首先建立一個表:表AUpDataTemp
表結構和表A相同,
然後後面要多加1列,列名就取:DataType
吧,類型為
bit
1為更新後的數據(新數據),0為更新前的數據(舊數據):
觸發器代碼如下:
create
trigger
表A_UPDATA_TR
on
表A
for
update
as
insert
into
表AUpDataTemp
select
*,1
from
inserted
insert
into
表AUpDataTemp
select
*,0
from
deleted
當然,插入和刪除數據更簡單,插入只有新數據,刪除只有舊數據
以上是MS-SQL,ORACLE只有觸發器頭格式不一樣,思路沒問題
⑦ 資料庫觸發器問題
--成績表的插入觸發器
Create Trigger tri_insert ON stu_grade
for insert
AS
set nocount on
Insert into Stu_info2
Select *
From Stu_info B
Where exists
(
Select 1 From stu_grade A,inserted I where A.學號=I.學號
And A.學號 = B.學號
And A.成績< 60 Group by A.學號 having count(A.學號) > 4)
)
set nocount off
請參考 sql server 觸發器,有問題進一步交流
⑧ 寫入mysql資料庫的觸發器是怎麼修改
drop TRIGGER [觸發器名]--刪除觸發器
go
CREATE TRIGGER [觸發器名] ON [表名] --創建觸發器
FOR insert
AS
--寫你要執行的代碼
⑨ 資料庫觸發器修改操作
altertriggertr_UpdateDeptNo
onDepartment
INSTEADOFupdate,insert,delete
as
ifUpdate(DepID)
begin
setnocounton;
declare@DepIDCHAR(2)
declare@DepNamechar(20)
--變數賦值
select@depid=depid,@depname=depnamefrominserted
--修改
updateProfessionsetDepID=@DepIDwhereDepID=(=@DepName)
updateClassInfosetDepID=@DepIDwhereDepID=(=@DepName)
end
這樣你測試看看。
⑩ 資料庫觸發器是什麼
觸發器是一類特殊的存儲過程,被定義為在對表或視圖發出 UPDATE、INSERT 或 DELETE 語句時自動執行。觸發器是功能強大的工具,使每個站點可以在有數據修改時自動強制執行其業務規則。觸發器可以擴展 SQL Server 約束、默認值和規則的完整性檢查邏輯,但只要約束和默認值提供了全部所需的功能,就應使用約束和默認值。
表可以有多個觸發器。CREATE TRIGGER 語句可以與 FOR UPDATE、FOR INSERT 或 FOR DELETE 子句一起使用,指定觸發器專門用於特定類型的數據修改操作。當指定 FOR UPDATE 時,可以使用 IF UPDATE (column_name) 子句,指定觸發器專門用於具體某列的更新。
代碼是寫在資料庫裡面的,觸發器包含 Transact-SQL 語句,這與存儲過程十分相似。
如果你有安裝SQL SEVER,那麼你可以在SQL SEVER的幫助文檔里找到很多詳細的解析,打開查詢分析器按F1也可以打開SQL SEVER的幫助文檔。
示例
下例首先創建一個觸發器,當用戶在表 roysched 中添加或更改數據時,該觸發器向客戶端列印一條用戶定義消息。然後,使用 ALTER TRIGGER 語句使該觸發器僅對 INSERT 活動有效。該觸發器有助於提醒向表中插入行或更新行的用戶及時通知書的作者和出版商。
USE pubs
GO
CREATE TRIGGER royalty_reminder
ON roysched
WITH ENCRYPTION
FOR INSERT, UPDATE
AS RAISERROR (50009, 16, 10)
-- Now, alter the trigger.
USE pubs
GO
ALTER TRIGGER royalty_reminder
ON roysched
FOR INSERT
AS RAISERROR (50009, 16, 10)