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
运行AUDIT或NOAUDIT进行审计或停止审计之前、之后触发
事件属性\事件
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