I know the story of </code>
http://asktom.oracle.com/~tkyte/Mutate/index.html, <code>
however, what is wrong with the following technique
(don't use row-level-trigger at all):
sample.oracle901 > create table project
2 ( projno int primary key
3 , start_date date not null
4 , end_date date not null
5 );
Tabelle wurde angelegt.
Abgelaufen: 00:00:00.02
sample.oracle901 >
sample.oracle901 > create table emp_proj_assign
2 ( empno int not null
3 , projno int not null
4 , start_date date not null
5 , end_date date not null
6 , primary key (empno, start_date)
7 );
Tabelle wurde angelegt.
Abgelaufen: 00:00:00.01
sample.oracle901 > create trigger tr_no_overl_pa
2 after insert or update on emp_proj_assign
3 declare i integer;
4 begin
5 select count(*)
6 into i
7 from emp_proj_assign ep1, emp_proj_assign ep2
8 where ep1.empno = ep2.empno
9 and ep1.start_date < ep2.start_date
10 and ep1.end_date >= ep2.start_date;
11
12 if i > 0 then
13 raise_application_error(-20001, 'An employee cannot have overlapping project assignments.');
14 end if;
15 end;
16 /
Trigger wurde erstellt.
Abgelaufen: 00:00:00.01
sample.oracle901 >
sample.oracle901 > create trigger tr_empl_as_date_b_s_and_e1
2 after insert or update on emp_proj_assign
3 declare i integer;
4 begin
5 select count(*)
6 into i
7 from emp_proj_assign ep, project p
8 where ep.projno = p.projno
9 and ( ep.start_date < p.start_date
10 or ep.end_date > p.end_date);
11 if i > 0 then
12 raise_application_error(-20001, 'An employee''s project assignment dates must fall between the project start and end dates');
13 end if;
14 end;
15 /
Trigger wurde erstellt.
Abgelaufen: 00:00:00.02
sample.oracle901 >
sample.oracle901 > create trigger tr_empl_as_date_b_s_and_e2
2 after insert or update on project
3 declare i integer;
4 begin
5 select count(*)
6 into i
7 from emp_proj_assign ep, project p
8 where ep.projno = p.projno
9 and ( ep.start_date < p.start_date
10 or ep.end_date > p.end_date);
11 if i > 0 then
12 raise_application_error(-20001, 'An employee''s project assignment dates must fall between the project start and end dates');
13 end if;
14 end;
15 /
Trigger wurde erstellt.
Abgelaufen: 00:00:00.01
sample.oracle901 >
sample.oracle901 > insert into project(projno, start_date, end_date)
2 values(1, to_date('01.01.2003','dd.mm.yyyy'), to_date('31.01.2003','dd.mm.yyyy'));
1 Zeile wurde erstellt.
Abgelaufen: 00:00:00.00
sample.oracle901 > insert into project(projno, start_date, end_date)
2 values(2, to_date('02.01.2003','dd.mm.yyyy'), to_date('28.02.2003','dd.mm.yyyy'));
1 Zeile wurde erstellt.
Abgelaufen: 00:00:00.00
sample.oracle901 >
sample.oracle901 > insert into project(projno, start_date, end_date)
2 values(3, to_date('01.02.2003','dd.mm.yyyy'), to_date('31.03.2003','dd.mm.yyyy'));
1 Zeile wurde erstellt.
Abgelaufen: 00:00:00.00
sample.oracle901 >
sample.oracle901 > insert into emp_proj_assign(empno, PROJNO, start_date, end_date)
2 values(1, 1, to_date('15.01.2003','dd.mm.yyyy'), to_date('20.01.2003','dd.mm.yyyy'));
1 Zeile wurde erstellt.
Abgelaufen: 00:00:00.01
sample.oracle901 >
sample.oracle901 > insert into emp_proj_assign(empno, PROJNO, start_date, end_date)
2 values(1, 2, to_date('22.01.2003','dd.mm.yyyy'), to_date('25.01.2003','dd.mm.yyyy'));
1 Zeile wurde erstellt.
Abgelaufen: 00:00:00.00
sample.oracle901 >
sample.oracle901 > insert into emp_proj_assign(empno, PROJNO, start_date, end_date)
2 values(1, 2, to_date('20.01.2003','dd.mm.yyyy'), to_date('26.01.2003','dd.mm.yyyy'));
insert into emp_proj_assign(empno, PROJNO, start_date, end_date)
*
FEHLER in Zeile 1:
ORA-20001: An employee cannot have overlapping project assignments.
ORA-06512: in "DP.TR_NO_OVERL_PA", Zeile 11
ORA-04088: Fehler bei der Ausführung von Trigger 'DP.TR_NO_OVERL_PA'
Abgelaufen: 00:00:00.01
sample.oracle901 >
sample.oracle901 > insert into emp_proj_assign(empno, PROJNO, start_date, end_date)
2 values(1, 3, to_date('01.04.2003','dd.mm.yyyy'), to_date('02.04.2003','dd.mm.yyyy'));
insert into emp_proj_assign(empno, PROJNO, start_date, end_date)
*
FEHLER in Zeile 1:
ORA-20001: An employee's project assignment dates must fall between the project
start and end dates
ORA-06512: in "DP.TR_EMPL_AS_DATE_B_S_AND_E1", Zeile 10
ORA-04088: Fehler bei der Ausführung von Trigger
'DP.TR_EMPL_AS_DATE_B_S_AND_E1'
Abgelaufen: 00:00:00.02
sample.oracle901 > spool off