Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle SQL中的触发器,用于防止插入不存在的数据_Sql_Triggers_Oracle Sqldeveloper_Oracle19c - Fatal编程技术网

Oracle SQL中的触发器,用于防止插入不存在的数据

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&

数据库有两个表-employee和department。当用户尝试将记录插入到employee表中时,将触发一个触发器,检查用户输入的员工编号是否存在于department表中。如果未找到该记录,则不会将其插入employee表中


不得使用主键和外键。只允许使用触发器。

基于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的示例模式相同。