1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102
| SQL> select * from emp
2 /
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7369 SMITH CLERK 7902 17-DEC-80 800 20
7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30
7521 WARD SALESMAN 7698 22-FEB-81 1250 500 30
7566 JONES MANAGER 7839 02-APR-81 2975 20
7654 MARTIN SALESMAN 7698 28-SEP-81 1250 1400 30
7698 BLAKE MANAGER 7839 01-MAY-81 2850 30
7782 CLARK MANAGER 7839 09-JUN-81 2450 10
7788 SCOTT ANALYST 7566 19-APR-87 3000 20
7839 KING PRESIDENT 17-NOV-81 5000 10
7844 TURNER SALESMAN 7698 08-SEP-81 1500 0 30
7876 ADAMS CLERK 7788 23-MAY-87 1100 20
7900 JAMES CLERK 7698 03-DEC-81 950 30
7902 FORD ANALYST 7566 03-DEC-81 3000 20
7934 MILLER CLERK 7782 23-JAN-82 1300 10
14 rows selected.
SQL> create or replace view v as
2 select empno, ename, job, sal
3 from emp
4 /
View created.
SQL> create or replace trigger trig
2 instead of UPDATE on v
3 for each row
4 begin
5 if (updating('EMPNO') or updating('ENAME')) then
6 raise_application_error(-20001,'seules les colonnes job et sal sont updatables');
7 else
8 update emp
9 set job = nvl(:new.job,job),
10 sal = nvl(:new.sal,sal)
11 where empno = :old.empno;
12 end if;
13 end;
14 /
Trigger created.
SQL> update v set ename = 'TOTO' where empno = 7369
2 /
update v set ename = 'TOTO' where empno = 7369
*
ERROR at line 1:
ORA-20001: seules les colonnes job et sal sont updatables
ORA-06512: at "OPS$SKUATAMAD.TRIG", line 3
ORA-04088: error during execution of trigger 'OPS$SKUATAMAD.TRIG'
SQL> update v
2 set empno = 1,
3 job = 'new'
4 where empno = 7369
5 /
update v
*
ERROR at line 1:
ORA-20001: seules les colonnes job et sal sont updatables
ORA-06512: at "OPS$SKUATAMAD.TRIG", line 3
ORA-04088: error during execution of trigger 'OPS$SKUATAMAD.TRIG'
SQL> update v set sal = 0 where empno = 7369
2 /
1 row updated.
SQL> select * from emp
2 /
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7369 SMITH CLERK 7902 17-DEC-80 0 20
7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30
7521 WARD SALESMAN 7698 22-FEB-81 1250 500 30
7566 JONES MANAGER 7839 02-APR-81 2975 20
7654 MARTIN SALESMAN 7698 28-SEP-81 1250 1400 30
7698 BLAKE MANAGER 7839 01-MAY-81 2850 30
7782 CLARK MANAGER 7839 09-JUN-81 2450 10
7788 SCOTT ANALYST 7566 19-APR-87 3000 20
7839 KING PRESIDENT 17-NOV-81 5000 10
7844 TURNER SALESMAN 7698 08-SEP-81 1500 0 30
7876 ADAMS CLERK 7788 23-MAY-87 1100 20
7900 JAMES CLERK 7698 03-DEC-81 950 30
7902 FORD ANALYST 7566 03-DEC-81 3000 20
7934 MILLER CLERK 7782 23-JAN-82 1300 10
14 rows selected.
SQL> rollback
2 /
Rollback complete.
SQL> |
Partager