======================================= DML STATEMENT TRIGGER ======================================
SQL> create or replace Trigger secure_emp
2 before insert on employees
3 begin
4 if (TO_CHAR(SYSDATE,'DY') IN ('SAT','SUN')) OR (TO_CHAR(SYSDATE,'HH24:MI')
5 NOT BETWEEN '08:00' AND '18:00') THEN
6 RAISE_APPLICATION_ERROR (-20500,'You may insert EMPLOYEES table only during business hours.');
7 END IF;
8 END;
9 /
Trigger created.
SQL>
SQL> insert into employees (employee_id, last_name, first_name,email,hire_date,job_id,salary,department_id)
2 values (300,'smith','rob','RSMITH',SYSDATE,'IT_PROG',4500,60);
insert into employees (employee_id, last_name, first_name,email,hire_date,job_id,salary,department_id)
*
ERROR at line 1:
ORA-20500: You may insert EMPLOYEES table only during business hours.
ORA-06512: at "HR.SECURE_EMP", line 4
ORA-04088: error during execution of trigger 'HR.SECURE_EMP'
SQL>
====================================== USING CONDITION PRIDECATE ==================================
SQL> create or replace Trigger secure_emp
2 before insert OR update OR delete on employees
3 begin
4 if (TO_CHAR(SYSDATE,'DY') IN ('SAT','SUN')) OR (TO_CHAR(SYSDATE,'HH24:MI')
5 NOT BETWEEN '08:00' AND '18:00') THEN
6 if DELETING THEN
7 RAISE_APPLICATION_ERROR (-20502,'You may delete FROM EMPLOYEES table only during business hours.');
8 Elsif INSERTING THEN
9 RAISE_APPLICATION_ERROR (-20500,'You may insert EMPLOYEES table only during business hours.');
10 Elsif UPDATING THEN
11 RAISE_APPLICATION_ERROR (-20503,'You may update salary only during business hours.');
12 Else
13 RAISE_APPLICATION_ERROR (-20504,'You may update EMPLOYEES table only during business hours.');
14 end if;
15 end IF;
16 END;
17 /
Trigger created.
SQL>
============================================ DML ROW TRIGGER =========================================================
SQL> create or replace trigger restrict_salary
2 before insert or update of salary on employees
3 for each row
4 begin
5 IF NOT (:NEW.JOB_ID IN ('AD_PRES','AD_VP')) AND :NEW.SALARY > 15000 THEN
6 RAISE_APPLICATION_ERROR (-20202, 'EMPLOYEE CANNOT EARN THIS AMOUNT');
7 END IF;
8 END;
9 /
Trigger created.
SQL> select salary,job_id from employees where job_id in ('AD_PRES','AD_VP');
SALARY JOB_ID
---------- ----------
24000 AD_PRES
17000 AD_VP
17000 AD_VP
SQL> UPDATE EMPLOYEES SET SALARY=25000 WHERE job_id ='AD_PRES';
1 row updated.
SQL> UPDATE EMPLOYEES SET SALARY=16000 WHERE LAST_NAME ='Kochhar';
1 row updated.
SQL> select salary,job_id,LAST_NAME from employees where job_id in ('AD_PRES','AD_VP');
SALARY JOB_ID LAST_NAME
---------- ---------- -------------------------
25000 AD_PRES King
16000 AD_VP Kochhar
17000 AD_VP De Haan
SQL> select salary,job_id from employees where job_id ='AD_ASST';
SALARY JOB_ID
---------- ----------
4400 AD_ASST
SQL> UPDATE EMPLOYEES SET SALARY=16000 WHERE job_id ='AD_ASST';
UPDATE EMPLOYEES SET SALARY=16000 WHERE job_id ='AD_ASST'
*
ERROR at line 1:
ORA-20202: EMPLOYEE CANNOT EARN THIS AMOUNT
ORA-06512: at "HR.RESTRICT_SALARY", line 3
ORA-04088: error during execution of trigger 'HR.RESTRICT_SALARY'
SQL> UPDATE EMPLOYEES SET SALARY=6000 WHERE job_id ='AD_ASST';
1 row updated.
SQL> select salary,job_id from employees where job_id ='AD_ASST';
SALARY JOB_ID
---------- ----------
6000 AD_ASST
S=================================================================================================================
SQL> CREATE TABLE AUDIT_EMP_TABLE (user_name varchar2(15),timestamp date, id number(5),old_last_name varchar2(20),
2 new_last_name varchar2(20),old_title varchar2(20),new_title varchar2(20),old_salary number(6),new_salary number(6));
Table created.
SQL> select * from tab;
TNAME TABTYPE CLUSTERID
------------------------------ ------- ----------
REGIONS TABLE
COUNTRIES TABLE
LOCATIONS TABLE
DEPARTMENTS TABLE
JOBS TABLE
EMPLOYEES TABLE
JOB_HISTORY TABLE
EMP_DETAILS_VIEW VIEW
BIN$acl1i5wGQUaiEKnRLWwbrw==$0 TABLE
AUDIT_EMP_TABLE TABLE
10 rows selected.
SQL> select * from audit_emp_table;
no rows selected
SQL> desc audit_emp_table;
Name Null? Type
----------------------------------------- -------- ----------------------------
USER_NAME VARCHAR2(15)
TIMESTAMP DATE
ID NUMBER(5)
OLD_LAST_NAME VARCHAR2(20)
NEW_LAST_NAME VARCHAR2(20)
OLD_TITLE VARCHAR2(20)
NEW_TITLE VARCHAR2(20)
OLD_SALARY NUMBER(6)
NEW_SALARY NUMBER(6)
SQL> create or replace trigger audit_emp_values
2 after insert or update or delete on employees
3 for each row
4 begin
5 insert into audit_emp_table (user_name,timestamp,id,old_last_name,new_last_name,old_title,new_title,old_salary,
6 new_salary)
7 values (user,sysdate,:old.employee_id,:old.last_name,:new.last_name,:old.job_id,:new.job_id,:old.salary,:new.salary);
8 end;
9 /
Trigger created.
SQL>
====================================== ===== INSTEAD OF TRIGGER =================================************************
SQL> create table new_emp as select employee_id,last_name,salary,department_id,email,job_id,hire_date from employees;
Table created.
SQL> create table new_dept as select d.department_id,d.department_name,d.location_id,sum(e.salary) tot_dept_sal from
2 employees e,departments d where e.department_id=d.department_id group by d.department_id,d.department_name,d.location_id;
Table created.
SQL> create view emp_detail as select e.employee_id,e.last_name,e.salary,e.department_id,e.email,e.job_id,d.department_name,
2 d.location_id from employees e,departments d where e.department_id=d.department_id;
View created.
SQL> select * from tab;
TNAME TABTYPE CLUSTERID
------------------------------ ------- ----------
REGIONS TABLE
COUNTRIES TABLE
LOCATIONS TABLE
DEPARTMENTS TABLE
JOBS TABLE
EMPLOYEES TABLE
JOB_HISTORY TABLE
EMP_DETAILS_VIEW VIEW
BIN$acl1i5wGQUaiEKnRLWwbrw==$0 TABLE
AUDIT_EMP_TABLE TABLE
NEW_EMP TABLE
TNAME TABTYPE CLUSTERID
------------------------------ ------- ----------
NEW_DEPT TABLE
EMP_DETAIL VIEW
13 rows selected.
SQL>
SQL>
SQL>
SQL> create or replace trigger new_emp_dept
2 instead of insert or update or delete on emp_detail
3 for each row
4 begin
5 IF INSERTING THEN
6 insert into new_emp
7 values (:new.employee_id,:new.last_name,:new.salary,:new.department_id,:new.email,:new.job_id,sysdate);
8 update new_dept set tot_dept_sal = tot_dept_sal + :new.salary where department_id = :new.department_id;
9 ELSIF DELETING THEN
10 delete from new_emp where employee_id = :old.employee_id;
11 update new_dept set tot_dept_sal = tot_dept_sal - :old.salary where department_id = :old.department_id;
12 ELSIF UPDATING ('salary') THEN
13 update new_emp set salary = :new.salary where employee_id = :old.employee_id;
14 update new_dept set tot_dept_sal = tot_dept_sal + (:new.salary - :old.salary) where department_id = :old.department_id;
15 ELSIF UPDATING ('department_id') THEN
16 update new_emp set department_id = :new.department_id where employee_id = :old.employee_id;
17 update new_dept set tot_dept_sal = tot_dept_sal - :old.salary where department_id = :old.department_id;
18 update new_dept set tot_dept_sal = tot_dept_sal + :new.salary where department_id = :new.department_id;
19 end if;
20 end;
21 /
Trigger created.
SQL>
SQL> SET PAGESIZE 150;
SQL> SET LINESIZE 150;
SQL> COLUMN DEPARTMENT_NAME FORMAT A17;
SQL> COLUMN LAST_NAME FORMAT A12;
SQL> SELECT * FROM EMP_DETAIL;
EMPLOYEE_ID LAST_NAME SALARY DEPARTMENT_ID EMAIL JOB_ID DEPARTMENT_NAME LOCATION_ID
----------- ------------ ---------- ------------- ------------------------- ---------- ----------------- -----------
198 OConnell 2600 50 DOCONNEL SH_CLERK Shipping 1500
199 Grant 2600 50 DGRANT SH_CLERK Shipping 1500
200 Whalen 6000 10 JWHALEN AD_ASST Administration 1700
201 Hartstein 13000 20 MHARTSTE MK_MAN Marketing 1800
202 Fay 6000 20 PFAY MK_REP Marketing 1800
203 Mavris 6500 40 SMAVRIS HR_REP Human Resources 2400
204 Baer 10000 70 HBAER PR_REP Public Relations 2700
205 Higgins 12000 110 SHIGGINS AC_MGR Accounting 1700
206 Gietz 8300 110 WGIETZ AC_ACCOUNT Accounting 1700
100 King 25000 90 SKING AD_PRES Executive 1700
101 Kochhar 16000 90 NKOCHHAR AD_VP Executive 1700
102 De Haan 17000 90 LDEHAAN AD_VP Executive 1700
103 Hunold 9000 60 AHUNOLD IT_PROG IT 1400
104 Ernst 6000 60 BERNST IT_PROG IT 1400
105 Austin 4800 60 DAUSTIN IT_PROG IT 1400
106 Pataballa 4800 60 VPATABAL IT_PROG IT 1400
107 Lorentz 4200 60 DLORENTZ IT_PROG IT 1400
108 Greenberg 12000 100 NGREENBE FI_MGR Finance 1700
109 Faviet 9000 100 DFAVIET FI_ACCOUNT Finance 1700
110 Chen 8200 100 JCHEN FI_ACCOUNT Finance 1700
111 Sciarra 7700 100 ISCIARRA FI_ACCOUNT Finance 1700
112 Urman 7800 100 JMURMAN FI_ACCOUNT Finance 1700
113 Popp 6900 100 LPOPP FI_ACCOUNT Finance 1700
114 Raphaely 11000 30 DRAPHEAL PU_MAN Purchasing 1700
115 Khoo 3100 30 AKHOO PU_CLERK Purchasing 1700
116 Baida 2900 30 SBAIDA PU_CLERK Purchasing 1700
117 Tobias 2800 30 STOBIAS PU_CLERK Purchasing 1700
118 Himuro 2600 30 GHIMURO PU_CLERK Purchasing 1700
119 Colmenares 2500 30 KCOLMENA PU_CLERK Purchasing 1700
120 Weiss 8000 50 MWEISS ST_MAN Shipping 1500
121 Fripp 8200 50 AFRIPP ST_MAN Shipping 1500
122 Kaufling 7900 50 PKAUFLIN ST_MAN Shipping 1500
123 Vollman 6500 50 SVOLLMAN ST_MAN Shipping 1500
124 Mourgos 5800 50 KMOURGOS ST_MAN Shipping 1500
125 Nayer 3200 50 JNAYER ST_CLERK Shipping 1500
126 Mikkilineni 2700 50 IMIKKILI ST_CLERK Shipping 1500
127 Landry 2400 50 JLANDRY ST_CLERK Shipping 1500
128 Markle 2200 50 SMARKLE ST_CLERK Shipping 1500
129 Bissot 3300 50 LBISSOT ST_CLERK Shipping 1500
130 Atkinson 2800 50 MATKINSO ST_CLERK Shipping 1500
131 Marlow 2500 50 JAMRLOW ST_CLERK Shipping 1500
132 Olson 2100 50 TJOLSON ST_CLERK Shipping 1500
133 Mallin 3300 50 JMALLIN ST_CLERK Shipping 1500
134 Rogers 2900 50 MROGERS ST_CLERK Shipping 1500
135 Gee 2400 50 KGEE ST_CLERK Shipping 1500
136 Philtanker 2200 50 HPHILTAN ST_CLERK Shipping 1500
137 Ladwig 3600 50 RLADWIG ST_CLERK Shipping 1500
138 Stiles 3200 50 SSTILES ST_CLERK Shipping 1500
139 Seo 2700 50 JSEO ST_CLERK Shipping 1500
140 Patel 2500 50 JPATEL ST_CLERK Shipping 1500
141 Rajs 3500 50 TRAJS ST_CLERK Shipping 1500
142 Davies 3100 50 CDAVIES ST_CLERK Shipping 1500
143 Matos 2600 50 RMATOS ST_CLERK Shipping 1500
144 Vargas 2500 50 PVARGAS ST_CLERK Shipping 1500
145 Russell 14000 80 JRUSSEL SA_MAN Sales 2500
146 Partners 13500 80 KPARTNER SA_MAN Sales 2500
147 Errazuriz 12000 80 AERRAZUR SA_MAN Sales 2500
148 Cambrault 11000 80 GCAMBRAU SA_MAN Sales 2500
149 Zlotkey 10500 80 EZLOTKEY SA_MAN Sales 2500
150 Tucker 10000 80 PTUCKER SA_REP Sales 2500
151 Bernstein 9500 80 DBERNSTE SA_REP Sales 2500
152 Hall 9000 80 PHALL SA_REP Sales 2500
153 Olsen 8000 80 COLSEN SA_REP Sales 2500
154 Cambrault 7500 80 NCAMBRAU SA_REP Sales 2500
155 Tuvault 7000 80 OTUVAULT SA_REP Sales 2500
156 King 10000 80 JKING SA_REP Sales 2500
157 Sully 9500 80 PSULLY SA_REP Sales 2500
158 McEwen 9000 80 AMCEWEN SA_REP Sales 2500
159 Smith 8000 80 LSMITH SA_REP Sales 2500
160 Doran 7500 80 LDORAN SA_REP Sales 2500
161 Sewall 7000 80 SSEWALL SA_REP Sales 2500
162 Vishney 10500 80 CVISHNEY SA_REP Sales 2500
163 Greene 9500 80 DGREENE SA_REP Sales 2500
164 Marvins 7200 80 MMARVINS SA_REP Sales 2500
165 Lee 6800 80 DLEE SA_REP Sales 2500
166 Ande 6400 80 SANDE SA_REP Sales 2500
167 Banda 6200 80 ABANDA SA_REP Sales 2500
168 Ozer 11500 80 LOZER SA_REP Sales 2500
169 Bloom 10000 80 HBLOOM SA_REP Sales 2500
170 Fox 9600 80 TFOX SA_REP Sales 2500
171 Smith 7400 80 WSMITH SA_REP Sales 2500
172 Bates 7300 80 EBATES SA_REP Sales 2500
173 Kumar 6100 80 SKUMAR SA_REP Sales 2500
174 Abel 11000 80 EABEL SA_REP Sales 2500
175 Hutton 8800 80 AHUTTON SA_REP Sales 2500
176 Taylor 8600 80 JTAYLOR SA_REP Sales 2500
177 Livingston 8400 80 JLIVINGS SA_REP Sales 2500
179 Johnson 6200 80 CJOHNSON SA_REP Sales 2500
180 Taylor 3200 50 WTAYLOR SH_CLERK Shipping 1500
181 Fleaur 3100 50 JFLEAUR SH_CLERK Shipping 1500
182 Sullivan 2500 50 MSULLIVA SH_CLERK Shipping 1500
183 Geoni 2800 50 GGEONI SH_CLERK Shipping 1500
184 Sarchand 4200 50 NSARCHAN SH_CLERK Shipping 1500
185 Bull 4100 50 ABULL SH_CLERK Shipping 1500
186 Dellinger 3400 50 JDELLING SH_CLERK Shipping 1500
187 Cabrio 3000 50 ACABRIO SH_CLERK Shipping 1500
188 Chung 3800 50 KCHUNG SH_CLERK Shipping 1500
189 Dilly 3600 50 JDILLY SH_CLERK Shipping 1500
190 Gates 2900 50 TGATES SH_CLERK Shipping 1500
191 Perkins 2500 50 RPERKINS SH_CLERK Shipping 1500
192 Bell 4000 50 SBELL SH_CLERK Shipping 1500
193 Everett 3900 50 BEVERETT SH_CLERK Shipping 1500
194 McCain 3200 50 SMCCAIN SH_CLERK Shipping 1500
195 Jones 2800 50 VJONES SH_CLERK Shipping 1500
196 Walsh 3100 50 AWALSH SH_CLERK Shipping 1500
197 Feeney 3000 50 KFEENEY SH_CLERK Shipping 1500
106 rows selected.
SQL>
SQL> SELECT * FROM NEW_DEPT;
DEPARTMENT_ID DEPARTMENT_NAME LOCATION_ID TOT_DEPT_SAL
------------- ----------------- ----------- ------------
110 Accounting 1700 20300
80 Sales 2500 304500
10 Administration 1700 6000 --\\OLD SALARY
60 IT 1400 28800
20 Marketing 1800 19000
90 Executive 1700 58000
50 Shipping 1500 156400
40 Human Resources 2400 6500
30 Purchasing 1700 24900
100 Finance 1700 51600
70 Public Relations 2700 10000
11 rows selected.
SQL>
SQL> SELECT * FROM NEW_EMP;
EMPLOYEE_ID LAST_NAME SALARY DEPARTMENT_ID EMAIL JOB_ID HIRE_DATE
----------- ------------ ---------- ------------- ------------------------- ---------- ---------
198 OConnell 2600 50 DOCONNEL SH_CLERK 21-JUN-99
150 Tucker 10000 80 PTUCKER SA_REP 30-JAN-97
151 Bernstein 9500 80 DBERNSTE SA_REP 24-MAR-97
152 Hall 9000 80 PHALL SA_REP 20-AUG-97
153 Olsen 8000 80 COLSEN SA_REP 30-MAR-98
154 Cambrault 7500 80 NCAMBRAU SA_REP 09-DEC-98
155 Tuvault 7000 80 OTUVAULT SA_REP 23-NOV-99
177 Livingston 8400 80 JLIVINGS SA_REP 23-APR-98
178 Grant 7000 KGRANT SA_REP 24-MAY-99
179 Johnson 6200 80 CJOHNSON SA_REP 04-JAN-00
180 Taylor 3200 50 WTAYLOR SH_CLERK 24-JAN-98
181 Fleaur 3100 50 JFLEAUR SH_CLERK 23-FEB-98
182 Sullivan 2500 50 MSULLIVA SH_CLERK 21-JUN-99
183 Geoni 2800 50 GGEONI SH_CLERK 03-FEB-00
184 Sarchand 4200 50 NSARCHAN SH_CLERK 27-JAN-96
185 Bull 4100 50 ABULL SH_CLERK 20-FEB-97
186 Dellinger 3400 50 JDELLING SH_CLERK 24-JUN-98
187 Cabrio 3000 50 ACABRIO SH_CLERK 07-FEB-99
188 Chung 3800 50 KCHUNG SH_CLERK 14-JUN-97
189 Dilly 3600 50 JDILLY SH_CLERK 13-AUG-97
190 Gates 2900 50 TGATES SH_CLERK 11-JUL-98
191 Perkins 2500 50 RPERKINS SH_CLERK 19-DEC-99
192 Bell 4000 50 SBELL SH_CLERK 04-FEB-96
193 Everett 3900 50 BEVERETT SH_CLERK 03-MAR-97
194 McCain 3200 50 SMCCAIN SH_CLERK 01-JUL-98
195 Jones 2800 50 VJONES SH_CLERK 17-MAR-99
196 Walsh 3100 50 AWALSH SH_CLERK 24-APR-98
197 Feeney 3000 50 KFEENEY SH_CLERK 23-MAY-98
107 rows selected.
SQL>
SQL>
SQL> INSERT INTO EMP_DETAIL (EMPLOYEE_ID,LAST_NAME,SALARY,DEPARTMENT_ID,EMAIL,JOB_ID)
2 VALUES (9001,'Tinku',8000,10,'tinku.com','HR_MAN');
1 row created.
SQL> SELECT * FROM NEW_EMP;
EMPLOYEE_ID LAST_NAME SALARY DEPARTMENT_ID EMAIL JOB_ID HIRE_DATE
----------- ------------ ---------- ------------- ------------------------- ---------- ---------
198 OConnell 2600 50 DOCONNEL SH_CLERK 21-JUN-99
199 Grant 2600 50 DGRANT SH_CLERK 13-JAN-00
137 Ladwig 3600 50 RLADWIG ST_CLERK 14-JUL-95
186 Dellinger 3400 50 JDELLING SH_CLERK 24-JUN-98
187 Cabrio 3000 50 ACABRIO SH_CLERK 07-FEB-99
188 Chung 3800 50 KCHUNG SH_CLERK 14-JUN-97
189 Dilly 3600 50 JDILLY SH_CLERK 13-AUG-97
190 Gates 2900 50 TGATES SH_CLERK 11-JUL-98
191 Perkins 2500 50 RPERKINS SH_CLERK 19-DEC-99
192 Bell 4000 50 SBELL SH_CLERK 04-FEB-96
193 Everett 3900 50 BEVERETT SH_CLERK 03-MAR-97
194 McCain 3200 50 SMCCAIN SH_CLERK 01-JUL-98
195 Jones 2800 50 VJONES SH_CLERK 17-MAR-99
196 Walsh 3100 50 AWALSH SH_CLERK 24-APR-98
197 Feeney 3000 50 KFEENEY SH_CLERK 23-MAY-98
9001 Tinku 8000 10 tinku.com HR_MAN 04-AUG-10 -- \\ NEW ROW INSERT
108 rows selected.
SQL> SELECT * FROM NEW_DEPT;
DEPARTMENT_ID DEPARTMENT_NAME LOCATION_ID TOT_DEPT_SAL
------------- ----------------- ----------- ------------
110 Accounting 1700 20300
80 Sales 2500 304500
10 Administration 1700 14000---(8000 increase salary of department_id 10)---old salary 6000
60 IT 1400 28800
20 Marketing 1800 19000
90 Executive 1700 58000
50 Shipping 1500 156400
40 Human Resources 2400 6500
30 Purchasing 1700 24900
100 Finance 1700 51600
70 Public Relations 2700 10000
11 rows selected.
SQL>