『壹』 Oracle資料庫中有關觸發器問題
觸發器是一種特殊類型的存儲過程 它不同於存儲過程 觸發器主要是通過事件進行觸發而被執行的 觸發器的觸發事件分可為 類 分別是DML事件 DDL事件和資料庫事件 而存儲過程可以通過存儲過程名字而被直接調用 當對某一表進行諸如UPDATE INSERT DELETE 這些操作時 sql Server 就會自動執行觸發器所定義的SQL 語句 從而確保對數據的處理必須符合由這些SQL 語句所定義的規則
觸發器是特定事件出現的時候 自動執行的代碼塊 類似於存儲過程 但是用戶不能直接調用他們
觸發器功能
允許/限制對表的修改
自動生成派生列 比如自增欄位
強制數據一致性
提供審計和日誌記錄
防止無效的事務處理
啟用復雜的業務邏輯
觸發器種類
觸發器的種類可劃分為 種 數據操縱語言(DML)觸發器 替代(INSTEAD OF)觸發器 數據定義語言(DDL)觸發器 資料庫事件觸發器
數據操縱語言(DML)觸發器 簡稱DML觸發器 是定義在表上的觸發器 創建在表上 由DML事件引發的觸發器 編寫DML觸發器時的兩點要素是 確定觸發的表 即在其上定義觸發器的表 確定觸發的事件 DML觸發器的觸發事件有INSERT UPDATE和DELETE三種;替代觸發器 簡稱INSTEADOF觸發器 創建在視圖上 用來替換對視圖進行的刪除 插入和修改操作; 數據定義語言(DDL)觸發器 簡稱DDL觸發器 定義在模式上 觸發事件是數據對象的創建和修改;資料庫事件觸發器 定義在整個資料庫或模式上 觸發事件是資料庫事件
ORACLE產生資料庫觸發器的語法為
CREATE [OR REPLACE] TRIGGER 觸發器名
{BEFORE|AFTER|INSTEAD OF} 觸發事件 [OR 觸發事件 ]
ON 表名
WHEN 觸發條件
[FOR EACH ROW]
DECLARE
聲明部分
BEGIN
主體部分
END;
其中
觸發器名 觸發器對象的名稱 由於觸發器是資料庫自動執行的 因此該名稱只是一個名稱 沒有實質的用途 一個觸發器可由多個不同的數據操縱語言操作觸發 在觸發器中 可用INSERTING DELETING UPDATING謂詞來區別不同的數據操縱語言操作 這些謂詞可以在IF分支條件語句中作為判斷條件來使用
觸發時間 指明觸發器何時執行 該值可取 觸發的時間有BEFORE和AFTER兩種 分別表示觸發動作發生在DML語句執行之前和語句執行之後 確定觸發級別 有語句級觸發器和行級觸發器兩種 語句級觸發器表示SQL語句只觸發一次觸發器 行級觸發器表示SQL語句影響的每一行都要觸發一次
Before 表示在資料庫動作之前觸發器執行;在SQL語句的執行過程中 如果存在行級BEFORE觸發器 則SQL語句在對每一行操作之前 都要先執行一次行級BEFORE觸發器 然後才對行進行操作 如果存在行級AFTER觸發器 則SQL語句在對每一行操作之後 都要再執行一次行級AFTER觸發器
after 表示在資料庫動作之後出發器執行 如果存在語句級AFTER觸發器 則在SQL語句執行完畢後 要最後執行一次語句級AFTER觸發器
觸發事件 指明哪些資料庫動作會觸發此觸發器 指INSERT DELETE或UPDATE事件 事件可以並行出現 中間用OR連接;
insert 資料庫插入會觸發此觸發器;
update 資料庫修改會觸發此觸發器;
delete 資料庫刪除會觸發此觸發器
表 名 資料庫觸發器所在的表
for each row 表示觸發器為行級觸發器 省略則為語句級觸發器 對表的每一行觸發器執行一次
觸發器的創建者或具有DROP ANY TIRGGER系統許可權的人才能刪除觸發器 刪除觸發器的語法如下
DROP TIRGGER 觸發器名
可以通過命令設置觸發器的可用狀態 使其暫時關閉或重新打開 即當觸發器暫時不用時 可以將其置成無效狀態 在使用時重新打開 該命令語法如下
ALTER TRIGGER 觸發器名 {DISABLE|ENABLE}
其中 DISABLE表示使觸發器失效 ENABLE表示使觸發器生效
同存儲過程類似 觸發器可以用SHOW ERRORS 檢查編譯錯誤
如果有多個觸發器被定義成為相同時間 相同事件觸發 且最後定義的觸發器是有效的 則最後定義的觸發器被觸發 其他觸發器不執行 觸發器體內禁止使用MIT ROLLBACK SAVEPOINT語句 也禁止直接或間接地調用含有上述語句的存儲過程 定義一個觸發器時要考慮上述多種情況 並根據具體的需要來決定觸發器的種類
觸發器的作用
觸發器的主要作用就是其能夠實現由主鍵和外鍵所不能保證的復雜的參照完整性和數據的一致性 除此之外 觸發器還有其它許多不同的功能
( ) 強化約束(Enforce restriction)
觸發器能夠實現比CHECK 語句更為復雜的約束
( ) 跟蹤變化Auditing changes
觸發器可以偵測資料庫內的操作 從而不允許資料庫中未經許可的指定更新和變化
( ) 級聯運行(Cascaded operation)
觸發器可以偵測資料庫內的操作 並自動地級聯影響整個資料庫的各項內容 例如 某個表上的觸發器中包含有對另外一個表的數據操作(如刪除 更新 插入)而該操作又導致該表上觸發器被觸發
( ) 存儲過程的調用(Stored procere invocation)
為了響應資料庫更新觸 發器可以調用一個或多個存儲過程 甚至可以通過外部過程的調用而在DBMS( 資料庫管理系統)本身之外進行操作
由此可見 觸發器可以解決高級形式的業務規則或復雜行為限制以及實現定製記錄等一些方面的問題 例如 觸發器能夠找出某一表在數據修改前後狀態發生的差異 並根據這種差異執行一定的處理 此外一個表的同一類型(INSERT UPDATE DELETE)的多個觸發器能夠對同一種數據操作採取多種不同的處理
總體而言 觸發器性能通常比較低
lishixin/Article/program/Oracle/201311/18340
『貳』 sqlserver隨機分配數據給不同客服
伺服器端:
1.使用資料庫觸發器和存儲過程:在數據表上設置一個觸發器,當虧蘆該表有新增數據時,觸發器會調用一個存儲過程,該存儲過程會隨機分配數據給不同客服。
2.使用資料庫函數:可以在資料庫中創建一個函數,其中包含一個隨機數,每次調仿空野用函數時,根據該隨機數來分配數據給不同的客服備喊。
『叄』 資料庫觸發器修改操作
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
這樣你測試看看。
『肆』 sql server資料庫如何設置跨伺服器的觸發器
採用鏈接伺服器注冊遠程資料庫伺服器到本機,這樣就可以用鏈接伺服器名.數悶配鋒據庫名賣茄來實現訪螞晌問,你不妨試試看。
『伍』 關於Sql Server裡面設置觸發器
可以使用ddl觸發器,下面的網址介紹的很詳細了,請參照:
http://bbs.ctocio.com.cn/thread-7825116-1-1.html
*************************
補充:
CREATE
TRIGGER
TEST_DDL_TRIGGER
ON
DATABASE
FOR
ALTER_TABLE
AS
BEGIN
RAISERROR
('這個資料庫不允許alter
table操作!',
16,
1)
ROLLBACK
END
*************************
---
以上,希配扮望對你有所喚賣褲幫助。和簡
『陸』 資料庫觸發器設置當數據更新(增加)時,另一張表也同時更新,但不知道為什麼提示語法錯誤
digoal=# create table a (aid int primary key, aname text, time timestamp);
NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "a_pkey" for table "a"
CREATE TABLE
digoal=# create table b (id int primary key, name text, time timestamp);
NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "b_pkey" for table "b"
CREATE TABLE
digoal=# create or replace function tg_a () returns trigger as $$
declare
begin
case TG_OP
when 'INSERT' then
insert into b(id,name,time) values (NEW.aid, NEW.aname, NEW.time);
when 'UPDATE' then
update b set id=NEW.aid, name=NEW.aname, time=NEW.time where id=OLD.aid;
when 'DELETE' then
delete from b where id=OLD.aid;
when 'TRUNCATE' then
truncate b;
else
return NULL;
end case;
return NULL;
end;
$$ language plpgsql;
digoal=# create trigger tg_a after INSERT OR DELETE OR UPDATE ON a for each row execute procere tg_a();
CREATE TRIGGER
digoal=# create trigger tg_a_truncate after truncate ON a for each statement execute procere tg_a();
CREATE TRIGGER
digoal=# insert into a select generate_series(1,10),'digoal',clock_timestamp();
INSERT 0 10
digoal=# select * from a;
aid | aname | time
-----+--------+----------------------------
1 | digoal | 2013-02-03 18:59:37.592479
2 | digoal | 2013-02-03 18:59:37.592667
3 | digoal | 2013-02-03 18:59:37.592674
4 | digoal | 2013-02-03 18:59:37.592677
5 | digoal | 2013-02-03 18:59:37.59268
6 | digoal | 2013-02-03 18:59:37.592683
7 | digoal | 2013-02-03 18:59:37.592686
8 | digoal | 2013-02-03 18:59:37.59269
9 | digoal | 2013-02-03 18:59:37.592693
10 | digoal | 2013-02-03 18:59:37.592696
(10 rows)
digoal=# select * from b;
id | name | time
----+--------+----------------------------
1 | digoal | 2013-02-03 18:59:37.592479
2 | digoal | 2013-02-03 18:59:37.592667
3 | digoal | 2013-02-03 18:59:37.592674
4 | digoal | 2013-02-03 18:59:37.592677
5 | digoal | 2013-02-03 18:59:37.59268
6 | digoal | 2013-02-03 18:59:37.592683
7 | digoal | 2013-02-03 18:59:37.592686
8 | digoal | 2013-02-03 18:59:37.59269
9 | digoal | 2013-02-03 18:59:37.592693
10 | digoal | 2013-02-03 18:59:37.592696
(10 rows)
digoal=# delete from a where aid=1;
DELETE 1
digoal=# select * from b;
id | name | time
----+--------+----------------------------
2 | digoal | 2013-02-03 18:59:37.592667
3 | digoal | 2013-02-03 18:59:37.592674
4 | digoal | 2013-02-03 18:59:37.592677
5 | digoal | 2013-02-03 18:59:37.59268
6 | digoal | 2013-02-03 18:59:37.592683
7 | digoal | 2013-02-03 18:59:37.592686
8 | digoal | 2013-02-03 18:59:37.59269
9 | digoal | 2013-02-03 18:59:37.592693
10 | digoal | 2013-02-03 18:59:37.592696
(9 rows)
digoal=# select * from a;
aid | aname | time
-----+--------+----------------------------
2 | digoal | 2013-02-03 18:59:37.592667
3 | digoal | 2013-02-03 18:59:37.592674
4 | digoal | 2013-02-03 18:59:37.592677
5 | digoal | 2013-02-03 18:59:37.59268
6 | digoal | 2013-02-03 18:59:37.592683
7 | digoal | 2013-02-03 18:59:37.592686
8 | digoal | 2013-02-03 18:59:37.59269
9 | digoal | 2013-02-03 18:59:37.592693
10 | digoal | 2013-02-03 18:59:37.592696
(9 rows)
digoal=# update a set aname='new' where aid=2;
UPDATE 1
digoal=# select * from a where aid=2;
aid | aname | time
-----+-------+----------------------------
2 | new | 2013-02-03 18:59:37.592667
(1 row)
digoal=# select * from b where id=2;
id | name | time
----+------+----------------------------
2 | new | 2013-02-03 18:59:37.592667
(1 row)
digoal=# truncate a;
TRUNCATE TABLE
digoal=# select * from a;
aid | aname | time
-----+-------+------
(0 rows)
digoal=# select * from b;
id | name | time
----+------+------
(0 rows)
『柒』 sql資料庫觸發器求指導
這個完全沒有必要去創建觸發器啊。
直接外鍵設置成 DELETE CASCADE 方式 的就可以了, 一行觸發器的代碼也不用寫。
下面是具體的對比例子:
--創建測試主表.ID是主鍵.
CREATETABLEtest_main(
idINTNOTNULL,
valueVARCHAR(10),
PRIMARYKEY(id)
);
--創建測試子表.
CREATETABLEtest_sub(
idINTNOTNULL,
main_idINT,
valueVARCHAR(10),
PRIMARYKEY(id)
);
--插入測試主表數據.
INSERTINTOtest_main(id,value)VALUES(1,'ONE');
INSERTINTOtest_main(id,value)VALUES(2,'TWO');
--插入測試子表數據.
INSERTINTOtest_sub(id,main_id,value)VALUES(1,1,'ONEONE');
INSERTINTOtest_sub(id,main_id,value)VALUES(2,2,'TWOTWO');
上面是 測試表+測試數據
下面是 默認外鍵約束方式的例子
1>ALTERTABLEtest_subADDCONSTRAINTmain_id_consFOREIGNKEY(main_id)REFERENCEStest_main;
2>go
1>DELETE
2>test_main
3>WHERE
4>ID=1;
5>go
消息547,級別16,狀態1,伺服器HOME-BED592453CSQLEXPRESS,第1行
DELETE語句與REFERENCE約束"main_id_cons"沖突。該沖突發生於資料庫"Stock",表"db
o.test_sub",column'main_id'。
語句已終止。
看看, 提示的錯誤信息, 和你的錯誤信息, 格式上是一樣的。
下面是使用DELETE CASCADE 方式 的外鍵約束的例子
(需要刪除掉前面創建的那個外鍵約束)
1>--創建外鍵(使用ONDELETECASCADE選項,刪除主表的時候,同時刪除子表)
2>ALTERTABLEtest_sub
3>ADDCONSTRAINTmain_id_cons
4>FOREIGNKEY(main_id)REFERENCEStest_mainONDELETECASCADE;
5>
6>--測試刪除主表數據.將成功地執行.
7>DELETE
8>TEST_MAIN
9>WHERE
10>ID=1;
11>
12>--測試檢索子表,應該只有一條main_id=2的數據.
13>SELECT
14>*
15>FROM
16>test_sub;
17>
18>go
(1行受影響)
idmain_idvalue
--------------------------------
22TWOTWO
(1行受影響)
『捌』 Sql 2000資料庫怎麼創建觸發器,有誰會,截個圖顯示出來看一下
1.使用T-SQL語句創建觸發器
創建觸發器使用CREATE TRIGGER語句。 語法格式如下:
CREATE TRIGGER 觸發器名ON 表名 [WITH ENCRYPTION]
FOR {[DELETE][,][INSERT][,][UPDATE] } [NOT FOR REPLICATION] AS
SQL語句
[RETURE 整數表達式]
觸發器作為一種資料庫對象,在syscomment 表中存儲有完整的文本定義信息。可以使用WITH ENCRYPTION 對訪問syscomment表的入口進行加密。
NOT FOR REPLICATION: 定義在復制過程中,不執行觸發器操作。 【例1】創建一個針對LWQK 表的觸發器,列印共修改了多少行數據。
use lwzz
if exists (select name from sysobjects where name='tr_lwqk_update' and type='tr') drop trigger tr_lwqk_update go
use lwzz go
create trigger tr_lwqk_update on lwqk for update as
declare @msg varchar(100)
select @msg=str(@@rowcount)+'lwzz updated by this statement' print @msg return
go
在CREATE TRIGGER語句中不能使用SELECT語句返回對表格查詢的數據,因為觸發器不接受用戶應用程序傳遞的參數,從而也無法向用戶應用程序返回查詢表格數據所得到的結果。 在創建觸發器的語句中,禁止使用下列T-SQL語句: ALTER DATABASE ALTER PROCEDURE ALTER TABLE ALTER TRIGGER ALTER VIEW CREATE DATABASE CREATE DEFAULT CREATE INDEX CREATE PROCEDURE CREATE RULE CREATE TABLE CREATE TRIGGER DROP DATABASE DROP DEFAULT DROP INDEX DROP PROCEDURE DROP RULE DROP TABLE DROP TRIGGER DROP VIEW
GRANT RESTORE DATABASE RESTORE LOG REVOKE
TRUNCATE TABLE
由於系統表所存儲數據的特殊性和重要性,所以建議用戶不要自己在系統表上建立觸發器。 在創建觸發器時,不允許RETURN返回體現運行狀態的數據。
【例2】創建一個當LWQK表執行INSERT、UPDATE操作時觸發的觸發器。
create trigger tr_procts_insupd
on lwqk
for insert,update as
……
由於SQL Sever 支持在同一個表的同一種操作類型上建立多個觸發器,所以當建了tr_procts_insupd觸發器後,在LWQK表執行INSERT操作時將觸發tr_procts_insupd觸發器,在執行UPDATE操作時將觸發tr_proct_update和tr_procts_insupd觸發器,他們都是有效的觸發器。
『玖』 在資料庫里怎麼使用觸發器
觸發器是一類特殊的存儲過程,開發人員也可以定義、編寫符合業務需求的觸發器來維護數據的完整性。觸發器的控制流程及控制語句與存儲過程相同,但觸發器與存儲過程還是有相當大的差別,觸發器的定義格式及開啟方式與存儲過程不同,作為數據管理員或編程人員,熟練掌握觸發器的用法對維護、操作資料庫非常重要。基本語法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