您的位置:首页 > 博客中心 > 数据库 >

ORACLE触发器具体解释

时间:2022-03-14 08:33

特性

INSERT

UPDATE

DELETE

OLD

NULL

实际值

实际值

NEW

实际值

实际值

NULL

事件

同意的时机

说明

STARTUP

AFTER

启动数据库实例之后触发

SHUTDOWN

BEFORE

关闭数据库实例之前触发(非正常关闭不触发)

SERVERERROR

AFTER

数据库server错误发生之后触发

LOGON

AFTER

成功登录连接到数据库后触发

LOGOFF

BEFORE

開始断开数据库连接之前触发

CREATE

BEFORE,AFTER

在运行CREATE语句创建数据库对象之前、之后触发

DROP

BEFORE,AFTER

在运行DROP语句删除数据库对象之前、之后触发

ALTER

BEFORE,AFTER

在运行ALTER语句更新数据库对象之前、之后触发

DDL

BEFORE,AFTER

在运行大多数DDL语句之前、之后触发

GRANT

BEFORE,AFTER

运行GRANT语句授予权限之前、之后触发

REVOKE

BEFORE,AFTER

运行REVOKE语句收权限之前、之后触犯发

RENAME

BEFORE,AFTER

运行RENAME语句更改数据库对象名称之前、之后触犯发

AUDIT / NOAUDIT

BEFORE,AFTER

运行AUDITNOAUDIT进行审计或停止审计之前、之后触发

事件属性\事件

Startup/Shutdown

Servererror

Logon/Logoff

DDL

DML

事件名称

ü*

ü*

ü*

ü*

数据库名称

ü*

 

 

 

 

数据库实例号

ü*

 

 

 

 

错误号

 

ü*

 

 

 

username

 

 

ü*

 

模式对象类型

 

 

 

ü*

模式对象名称

 

 

 

ü*

 

 

 

 

ü*

函数名称

数据类型

说    明

Ora_sysevent

VARCHAR2(20)

激活触发器的事件名称

Instance_num

NUMBER

数据库实例名

Ora_database_name

VARCHAR2(50)

数据库名称

Server_error(posi)

NUMBER

错误信息栈中posi指定位置中的错误号

 

 

Is_servererror(err_number)

 

 

BOOLEAN

检查err_number指定的错误号是否在错误信息栈中,假设在则返回TRUE,否则返回FALSE。在触发器内调用此函数能够推断是否发生指定的错误。

Login_user

VARCHAR2(30)

登陆或注销的username称

Dictionary_obj_type

VARCHAR2(20)

DDL语句所操作的数据库对象类型

Dictionary_obj_name

VARCHAR2(30)

DDL语句所操作的数据库对象名称

Dictionary_obj_owner

VARCHAR2(30)

DDL语句所操作的数据库对象全部者名称

Des_encrypted_password

VARCHAR2(2)

正在创建或改动的经过DES算法加密的用户口令

谓词

行为

INSERTING

假设触发语句是 INSERT 语句,则为TRUE,否则为FALSE

UPDATING

假设触发语句是 UPDATE语句,则为TRUE,否则为FALSE

DELETING

假设触发语句是 DELETE 语句,则为TRUE,否则为FALSE

CREATE TABLE company_holidays(day DATE);

INSERT INTO company_holidays 
    VALUES(sysdate);
INSERT INTO company_holidays 
VALUES(TO_DATE(‘21-10月-01‘, ‘DD-MON-YY‘));

CREATE OR REPLACE TRIGGER emp_permit_change
    BEFORE INSERT OR DELETE OR UPDATE ON emp
DECLARE
    Dummy NUMBER;
    Not_on_weekends EXCEPTION;
    Not_on_holidays EXCEPTION;
    Not_working_hours EXCEPTION;
BEGIN
    /* check for weekends */
IF TO_CHAR(SYSDATE, ‘DAY‘) IN (‘星期六‘, ‘星期日‘) THEN
    RAISE not_on_weekends;
END IF;
    /* check for company holidays */
SELECT COUNT(*) INTO dummy FROM company_holidays
    WHERE TRUNC(day)=TRUNC(SYSDATE);
IF dummy >0 THEN
    RAISE not_on_holidays;
END IF;
    /* check for work hours(8:00 AM to 18:00 PM */
IF (TO_CHAR(SYSDATE,‘HH24‘)<8 OR TO_CHAR(SYSDATE, ‘HH24‘)>18) THEN
  RAISE not_working_hours;
END IF;
EXCEPTION
  WHEN not_on_weekends THEN
    RAISE_APPLICATION_ERROR(-20324
‘May not change employee table during the weekends‘); 
  WHEN not_on_holidays THEN
    RAISE_APPLICATION_ERROR(-20325
‘May not change employee table during a holiday‘); 
  WHEN not_working_hours THEN
    RAISE_APPLICATION_ERROR(-20326
‘May not change employee table during no_working hours‘); 
END;

 


ORACLE触发器具体解释,布布扣,bubuko.com

热门排行

今日推荐

热门手游