项目13 创建图书借阅网站项目触发器
13.3 任务2——触发器操作
--- 13.3.1 创建触发器 ---
CONN SYS /BOOKBORROW AS SYSDBA; -- 以管理员身份连接 --
GRANT CREATE TRIGGER TO BOOKUSER; -- 给用户赋予创建视图的权限 --
CONN BOOKUSER /BOOKUSER; -- 再次使用户BOOKUSER连接成功 --
-- 1.创建触发器
CREATE OR REPLACE TRIGGER USERS_TRIGGER
AFTER INSERT
ON USERS
BEGIN
DBMS_OUTPUT.PUT_LINE('INSERT');
END;
/
-- 2.对表USERS执行插入操作
INSERT INTO USERS VALUES(8,'FEI','FEI');
--- 13.3.2 查看触发器 ---
-- 例13.2 --
SELECT TRIGGER_NAME,TABLE_NAME,STATUS FROM USER_TRIGGERS;
-- 可以通过视图USER_TRIGGERS来查看触发器的信息 --
--- 13.3.3 启用和禁用触发器 ---
-- 例13.3 --
ALTER TRIGGER USERS_TRIGGER DISABLE;
-- 禁用触发器 --
-- 例13.4 --
ALTER TRIGGER USERS_TRIGGER ENABLE;
-- 重新启用触发器 --
--- 13.3.4 删除触发器 ---
DROP TRIGGER USERS_TRIGGER;
13.4 任务3——DML触发器
--- 13.4.1 语句触发器 ---
--- 1.创建语句触发器 ---
-- 例13.6 --
CREATE TABLE USERS_LOG
(
WHO VARCHAR(20),
WHEN DATE
);
-- 创建日志记录表 --
CREATE TRIGGER BIUD_USERS
BEFORE INSERT OR UPDATE OR DELETE
ON USERS
BEGIN
INSERT INTO USERS_LOG VALUES(USER,SYSDATE);
END;
/
-- 创建触发器 --
INSERT INTO USERS VALUES(4,'LUCY','LUCY');
-- 对表USERS执行插入操作 --(触发器 'SYSTEM.BIUD_USERS' 无效且未通过重新验证!!!)
SELECT * FROM USERS_LOG;
-- 查看表USERS_LOG中的数据情况 --
--- 2.条件谓词 ---
-- 例13.7 --
DROP TABLE USERS_LOG;
CREATE TABLE USERS_LOG
(
WHO VARCHAR(20),
WHEN DATE,
WHAT VARCHAR(20)
);
-- 删除日志记录表并重新创建 --
DROP TRIGGER BIUD_USERS;
CREATE TRIGGER BIUD_USERS
BEFORE INSERT OR UPDATE OR DELETE
ON USERS
BEGIN
IF INSERTING THEN
INSERT INTO USERS_LOG VALUES(USER,SYSDATE,'INSERT');
ELSIF UPDATING THEN
INSERT INTO USERS_LOG VALUES(USER,SYSDATE,'UPDATE');
ELSIF DELETING THEN
INSERT INTO USERS_LOG VALUES(USER,SYSDATE,'DELETE');
END IF;
END;
/
-- 删除原触发器并重新创建 --
INSERT INTO USERS VALUES(10,'NANCY','NANCY');
-- 对表USERS执行插入操作 --
SELECT * FROM USERS_LOG;
-- 查看表USERS_LOG中的数据情况 --
--- 13.4.2 行级触发器 ---
-- 例13.8 --
CREATE OR REPLACE TRIGGER BIUFER_USERS
BEFORE INSERT OR UPDATE ON USERS
FOR EACH ROW
BEGIN
IF INSERTING THEN
DBMS_OUTPUT.PUT_LINE('插入的数据:' ||' ' ||:NEW.ID ||' ' ||:NEW.NAME);
ELSIF UPDATING THEN
DBMS_OUTPUT.PUT_LINE('修改后的数据:' ||' ' ||:NEW.ID ||' ' ||:NEW.NAME);
DBMS_OUTPUT.PUT_LINE('修改前的数据:' ||' ' ||:OLD.ID ||' ' ||:OLD.NAME);
ELSIF DELETING THEN
DBMS_OUTPUT.PUT_LINE('删除的数据:' ||' ' ||:OLD.ID ||' ' ||:OLD.NAME);
END IF;
END;
/
-- 创建行级触发器,实现当插入用户信息时,显示新插入的用户的ID和NAME;当修改用户信息时,显示修改后的用户的ID和NAME;当删除用户信息时,显示被删除的用户的ID和NAME --
UPDATE USERS SET NAME = 'John'WHERE ID = 8;
-- 执行修改操作 --
-- 例13.9 --
CREATE TABLE USERS_BAK
AS
SELECT * FROM USERS;
-- 创建表USERS的备份表USERS_BAK --
DELETE FROM USERS_BAK;
-- 删除表中所有数据,保持空表 --
CREATE TRIGGER BDFER_USERS
BEFORE DELETE ON USERS
FOR EACH ROW
BEGIN
INSERT INTO USERS_BAK(ID,NAME)
VALUES(:OLD.ID,:OLD.NAME);
END;
/
-- 创建触发器,实现删除备份 --
DELETE FROM USERS
WHERE ID=8;
-- 删除表USERS中的数据,同时备份到表USERS_BAK中 --
SELECT * FROM USERS_BAK;
-- 查看表USERS_BAK中的数据情况 --
13.5 任务4——INSTEAD OF触发器
-- 例13.10 --
SELECT VIEW_NAME,TEXT FROM USER_VIEWS
WHERE VIEW_NAME='V_BOOK';
-- 查看视图V_BOOK的定义及数据 --
INSERT INTO V_BOOK VALUES('9787730224486','MySQL数据库应用开发','数据库类');
-- 向视图V_BOOK中插入数据,无法通过联接视图修改多个基表 --
CREATE OR REPLACE TRIGGER INSTR_V_BOOK
INSTEAD OF INSERT
ON V_BOOK
DECLARE
Var_BOOKTYPEID NUMBER(6);
BEGIN
SELECT BOOKTYPEID INTO Var_BOOKTYPEID
FROM BOOKTYPE
WHERE BOOKTYPENAME=:NEW.BOOKTYPENAME;
INSERT INTO BOOK(ISBN,BOOKNAME,BOOKTYPEID)VALUES(:NEW.ISBN,:NEW.BOOKNAME,Var_BOOKTYPEID);
END;
/
-- 创建INSTEAD OF触发器,实现对视图的插入操作 --
INSERT INTO V_BOOK VALUES('9787730224486','MySQL数据库应用开发','数据库类');
-- 再次向视图中插入数据,成功完成 --
13.6 任务5——系统事件触发器
--- 13.6.1 数据库事件触发器 ---
-- 例13.11 --
CONN SYS /BOOKBORROW AS SYSDBA;
-- 以管理员SYS登录 --
CREATE TABLE OracleUSER.LOG_STARTUP(
WHO VARCHAR2(30),
WHEN DATE
);
-- 创建记录历程启动信息的日志表 --
CREATE OR REPLACE TRIGGERTR_STARTUP
AFTER STARTUP ON DATABASE
BEGIN
INSERT INTO LOG_STARTUP VALUES (ORA_SYSEVENT,SYSDATE);
END;
/
-- 创建例程启动触发器 --
--- 13.6.2 DDL触发器 ---
CREATE TABLE LOG_DDL
(
USER_ID VARCHAR2(30),
OBJECT_TYPE VARCHAR2(20),
OBJECT_NAME VARCHAR2(30)
);
-- 创建记录DDL事件的日志表 --
CREATE TRIGGER TR_DDL
AFTER CREATE ON DATABASE
BEGIN
INSERT INTO LOG_DDL
VALUES(ORA_LOGIN_USER,ORA_DICT_OBJ_TYPE,ORA_DICT_OBJ_NAME);
END;
/
-- 创建DDL触发器 --
13.7 任务6——用户事件触发器
-- 例13.13 --
CREATE TABLE DROPPED_LOG
(
OBJECT_NAME VARCHAR2(30),
OBJECT_TYPE VARCHAR2(30),
DROPPED_ON DATE
);
-- 创建删除日志记录表 --
CREATE OR REPLACE TRIGGER LOG_DROP_TRIGGER
BEFORE DROP
ON BOOKUSER.SCHEMA
BEGIN
INSERT INTO DROPPED_LOG
VALUES(ORA_DICT_OBJ_NAME,ORA_DICT_OBJ_TYPE,SYSDATE);
END;
/
-- 创建用户触发器 --
DROP VIEW BOOKUSER.V_BOOK;
-- 删除数据库对象 --