Oracle SQL中的触发器,用于防止插入不存在的数据
数据库有两个表-employee和department。当用户尝试将记录插入到employee表中时,将触发一个触发器,检查用户输入的员工编号是否存在于department表中。如果未找到该记录,则不会将其插入employee表中Oracle SQL中的触发器,用于防止插入不存在的数据,sql,triggers,oracle-sqldeveloper,oracle19c,Sql,Triggers,Oracle Sqldeveloper,Oracle19c,数据库有两个表-employee和department。当用户尝试将记录插入到employee表中时,将触发一个触发器,检查用户输入的员工编号是否存在于department表中。如果未找到该记录,则不会将其插入employee表中 不得使用主键和外键。只允许使用触发器。基于Scott的示例模式,我正在创建只包含数据的EMP\u T和DEPT\T表;没有限制 SQL> create table emp_t as select * From emp; Table created. SQL&
不得使用主键和外键。只允许使用触发器。基于Scott的示例模式,我正在创建只包含数据的EMP\u T和DEPT\T表;没有限制
SQL> create table emp_t as select * From emp;
Table created.
SQL> create table dept_t as select * From dept;
Table created.
触发:
SQL> create or replace trigger trg_biu_emp_d
2 before insert or update on emp_t
3 for each row
4 declare
5 l_deptno dept_t.deptno%type;
6 begin
7 select d.deptno
8 into l_deptno
9 from dept_t d
10 where d.deptno = :new.deptno;
11 exception
12 when no_data_found then
13 raise_application_error(-20000, 'That department does not exist');
14 end;
15 /
Trigger created.
SQL>
测试:故障优先:
SQL> update emp_t set deptno = 50;
update emp_t set deptno = 50
*
ERROR at line 1:
ORA-20000: That department does not exist
ORA-06512: at "SCOTT.TRG_BIU_EMP_D", line 10
ORA-04088: error during execution of trigger 'SCOTT.TRG_BIU_EMP_D'
SQL> insert into emp_t (empno, ename, deptno) values (999, 'Littlefoot', 50);
insert into emp_t (empno, ename, deptno) values (999, 'Littlefoot', 50)
*
ERROR at line 1:
ORA-20000: That department does not exist
ORA-06512: at "SCOTT.TRG_BIU_EMP_D", line 10
ORA-04088: error during execution of trigger 'SCOTT.TRG_BIU_EMP_D'
SQL>
测试#2:成功:
SQL> update emp_t set deptno = 10;
14 rows updated.
SQL> insert into emp_t (empno, ename, deptno) values (999, 'Littlefoot', 20);
1 row created.
SQL>
Hi@Deekeh,你能给我们一些更多的信息吗?比如:触发器代码、插入数据的示例以及表结构。谢谢嘿,考虑这两个表:雇员->(EMPUNO,DeTytNo,工资)部门->(DeptTyNo,DYNEX,LOC),假设部门1230号的部门工作人员被添加到雇员表中。但是部门号不在部门表中。在这种情况下,触发器应该阻止插入。@Deekesh。为什么部门表会有员工编号?您的数据模型有问题。@Gordon。。。这些表与Scott的示例模式相同。