資料庫開發---常用物件-觸發器
---觸發器
觸發器在資料庫裡以獨立的物件儲存
觸發器是由一個事件來啟動執行
觸發器常用來完成由資料庫的完整性約束難以完成的複雜業務規則的約束,或用來監視對資料庫的各種操作,實現審計的功能。
---觸發器分類
1. DML觸發器
2.替代觸發器
3.系統觸發器
---另外一種分法:
語句級(STATEMENT)觸發器
行級(ROW)觸發器
---另外一種分法:
before
after
------行級觸發器專用
:NEW 修飾符訪問操作完成後列的值
:OLD 修飾符訪問操作完成前列的值
:old.deptno 刪除之前的資料
:new.deptno 刪除之後的資料
--1. 替代(INSTEAD OF)觸發器----只能應用在行級上面,無論有沒有 for each row
只能用在檢視上
CREATE OR REPLACE VIEW v_emp AS
SELECT deptno, count(*) total_emp, sum(sal) total_sal
FROM emp
GROUP BY deptno;---簡單檢視和原表中的資料是一對一的
select * from v_emp;
rollback
delete from v_emp where deptno=10;-----複雜檢視不能做變更,使用替代觸發器
CREATE OR REPLACE TRIGGER tr_vemp_del
INSTEAD OF DELETE ON v_emp
FOR EACH ROW
BEGIN
DELETE FROM emp WHERE deptno = :old.deptno;
END tr_vemp_del;
/
DELETE FROM v_emp WHERE deptno=10;
--2.DML觸發器
---語句級觸發器
CREATE OR REPLACE TRIGGER tr_dept_time
BEFORE INSERT OR DELETE OR UPDATE ON dept
BEGIN
IF (TO_CHAR(sysdate, 'DAY') IN ('星期六', '星期日')) OR
(TO_CHAR(sysdate, 'HH24:MI') NOT BETWEEN '08:00' AND '18:00') THEN
RAISE_APPLICATION_ERROR(-20001, '非上班時間,不能修改dept表');
END IF;
END;
/
delete from dept where deptno=10;
--------------------------------------------------------------
----行級觸發器
CREATE OR REPLACE TRIGGER tr_emp_sal_comm
BEFORE UPDATE OF sal, comm OR DELETE ON scott.emp
FOR EACH ROW
WHEN (old.deptno = 10)
BEGIN
CASE
WHEN UPDATING('sal') THEN
IF :NEW.sal < :old.sal THEN
RAISE_APPLICATION_ERROR(-20001, '部門10的人員的工資不能降');
END IF;
WHEN UPDATING('comm') THEN
IF :NEW.comm < :old.comm THEN
RAISE_APPLICATION_ERROR(-20002, '部門10的人員的獎金不能降');
END IF;
WHEN DELETING THEN
RAISE_APPLICATION_ERROR(-20003, '不能刪除部門10的人員記錄');
END CASE;
END;
select * from emp;
UPDATE emp SET sal = 2000 WHERE empno = 7839;
UPDATE emp SET sal = 2 WHERE empno = 7788;
---INSTEAD OF觸發器需要注意以下幾點:
1.只能被建立在檢視上,並且該檢視沒有指定WITH CHECK OPTION選項。
2.不能指定BEFORE 或 AFTER選項。
3.FOR EACH ROW子句是可選的,即INSTEAD OF觸發器只能在行級上觸發、或只能是行級觸發器,沒有必要指定。---為了可讀性更好,可以加上
-----3. 系統事件觸發器
CREATE TABLE ddl_event
(crt_date timestamp PRIMARY KEY,
event_name VARCHAR2(20),
user_name VARCHAR2(10),
obj_type VARCHAR2(20),
obj_name VARCHAR2(20));
CREATE OR REPLACE TRIGGER tr_ddl
AFTER DDL ON SCHEMA
BEGIN
INSERT INTO ddl_event
VALUES
(systimestamp,
ora_sysevent,
ora_login_user,
ora_dict_obj_type,
ora_dict_obj_name);
END tr_ddl;
/
create table tt(id number);
select * from ddl_event;
SELECT * FROM log_event;
CREATE TABLE log_event
(user_name VARCHAR2(10),
address VARCHAR2(20),
logon_date timestamp,
logoff_date timestamp);
CREATE OR REPLACE TRIGGER tr_logon
AFTER LOGON ON DATABASE
BEGIN
INSERT INTO log_event
(user_name, address, logon_date)
VALUES
(ora_login_user, ora_client_ip_address, systimestamp);
END tr_logon;
/
CREATE OR REPLACE TRIGGER tr_logon
AFTER LOGON ON DATABASE
BEGIN
INSERT INTO log_event
(user_name, address, logon_date)
VALUES
(ora_login_user, ora_client_ip_address, systimestamp);
END tr_logon;
CREATE OR REPLACE TRIGGER tr_nologon
BEFORE LOGOFF ON DATABASE
BEGIN
INSERT INTO log_event
(user_name, address, logon_date)
VALUES
(ora_login_user, ora_client_ip_address, systimestamp);
END tr_nologon;
重新編譯觸發器
ALTER TRIGGER [schema.] trigger_name COMPILE;
DROP TRIGGER trigger_name;
禁用或啟用觸發器:
ALTER TIGGER trigger_name [DISABLE | ENABLE ];
DISABLE 失效
ENABLE 生效
ALTER TABLE [schema.]table_name {ENABLE|DISABLE} ALL TRIGGERS;
ALTER TABLE emp DISABLE ALL TRIGGERS;
SELECT TRIGGER_NAME, TRIGGER_TYPE, TRIGGERING_EVENT,
TABLE_OWNER, BASE_OBJECT_TYPE, REFERENCING_NAMES,
STATUS, ACTION_TYPE
FROM user_triggers;
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/30018455/viewspace-1399309/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 資料庫開發---常用物件-遊標資料庫物件
- 資料庫開發---常用物件-函式資料庫物件函式
- 資料庫開發---常用物件-儲存過程資料庫物件儲存過程
- 資料庫觸發器,禁止DDL操作資料庫觸發器
- SQL資料庫觸發器例項SQL資料庫觸發器
- 資料庫的觸發器的使用資料庫觸發器
- 資料庫檢視,索引,觸發器資料庫索引觸發器
- Oracle資料庫DDL審計觸發器觸發的bug問題Oracle資料庫觸發器
- SQL Server資料庫級別觸發器SQLServer資料庫觸發器
- 審計資料庫登陸登出觸發器資料庫觸發器
- 資料庫開發(19)基於物件的資料庫資料庫物件
- 利用Sql server 2005的資料庫觸發器開發的資料庫稽核追蹤系統SQLServer資料庫觸發器
- 觸發器限制指定IP訪問oracle資料庫觸發器Oracle資料庫
- oracle巧用觸發器提高資料庫安全級別Oracle觸發器資料庫
- 審計資料庫登陸失敗觸發器資料庫觸發器
- oracle 觸發器實現禁止在資料庫中建立dblink ---透過觸發器實現Oracle觸發器資料庫
- 通過觸發器記錄資料庫連線資訊觸發器資料庫
- Oracle開發基礎-觸發器Oracle觸發器
- 頭歌資料庫實驗七:函式與觸發器資料庫函式觸發器
- iOS開發資料庫篇—SQLite常用的函式iOS資料庫SQLite函式
- MS-SQL資料庫開發常用匯總 (收藏)SQL資料庫
- 用觸發器記錄資料庫使用者登陸資訊觸發器資料庫
- sql觸發器刪除資料庫中的級聯記錄SQL觸發器資料庫
- BEFORE觸發器修正資料錯誤觸發器
- Oracle觸發器觸發級別Oracle觸發器
- oracle 觸發器 和 常用內建程式包Oracle觸發器
- Sql Server 資料庫學習-常用資料庫 物件SQLServer資料庫物件
- Oracle 19c 利用觸發器在資料庫啟動後自動開啟 PDBOracle觸發器資料庫
- 觸發器實現表資料自動更新觸發器
- 透過觸發器禁止模式物件的DDL操作觸發器模式物件
- Oracle觸發器6(建立系統事件觸發器)Oracle觸發器事件
- 根據業務寫觸發器(oracle觸發器片)觸發器Oracle
- 雲開發 CloudBase 已上線觸發器能力Cloud觸發器
- DB2開發系列之四——觸發器DB2觸發器
- mysql——觸發器MySql觸發器
- mysql 觸發器MySql觸發器
- SQL觸發器SQL觸發器
- Mysql觸發器:MySql觸發器