--1 创建触发器,当test表执行DML语句时,将相关信息记录到日志表
-- 当前用户: user
SELECT USER FROM DUAL;
--创建测试表
CREATE TABLE test
(
t_id NUMBER(4), --编号
t_name VARCHAR2(20), --姓名
t_age NUMBER(2), --年龄
t_sex CHAR --性别
);
--创建记录测试表
CREATE TABLE test_log
(
l_user VARCHAR2(15), --用户
l_type VARCHAR2(15), --操作类型
l_date VARCHAR2(30) --操作日期
);
--测试数据
INSERT INTO test VALUES(101,'zhao',22,'M');
UPDATE test SET t_age = 30 WHERE t_id = 101;
DELETE test WHERE t_id = 101;
create or replace trigger tri_test
after delete or insert or update on test
declare
v_tag varchar2(10);
begin
if inserting then v_tag := '插入';
elsif updating then v_tag := '修改';
elsif deleting then v_tag := '删除';
end if;
insert into test_log values((SELECT USER FROM DUAL),v_tag,sysdate);
end;
--2 创建触发器,它记录表的删除数据 ,将删除的数据存储到old_employee 表中
--创建表
CREATE TABLE employee
(
id VARCHAR2(4) NOT NULL, --编号
name VARCHAR2(15) NOT NULL, --姓名
age NUMBER(2) NOT NULL, --年龄
sex CHAR NOT NULL --性别
);
--插入数据
INSERT INTO employee VALUES('e101','zhao',23,'M');
INSERT INTO employee VALUES('e102','jian',21,'F');
create or replace trigger save_deletedata_oldemp
before delete on employee
for EACH ROW
begin
insert into old_employee values(:old.id,:old.name,:old.age,:old.sex);
end;
--3.不允许删除20部门的人
delete EMP where empno=7369;
create or replace trigger tri_emp
after delete on emp
for each row
begin
if :old.deptno=20
then
SYS.DBMS_OUTPUT.PUT_LINE('您不能删除20部门的员工');
insert into EMP values(:old.empno,:old.ename,:old.job,:old.mgr,:old.hiredate,:old.sal,:old.comm,:old.deptno);
end if;
end;
--4.当员工姓名是丁院院时,执行触发器
create or replace trigger tri_nameis
before delete or insert or update on emp
for each row
begin
if inserting then
if :new.ename='丁院院' then
DBMS_OUTPUT.PUT_LINE('您插入数据了');
end if;
elsif updating then
if :new.ename='SMITH' or :old.ename='SMITH'then
DBMS_OUTPUT.PUT_LINE('您更新了数据');
end if;
elsif deleting then
if :old.ename='SMITH' then
DBMS_OUTPUT.PUT_LINE('您删除了数据');
end if;
end if;
end;
--测试数据
update emp set sal=1000 where ename='丁院院';
网友评论