Hallo,
Ik ben bezig met het schrijven van een beperking binnen Oracle. Dit gaat doormiddel van triggers en procedures.
Binnen een tabel met een eigen PK en FK hebben we 3 kolommen die uniek moeten zijn (een UK werkt hier niet ivm de PK) dit moet dus iets anders.
Gemaakt:
-een procedure met globale cursor die er voor zorgt dat de tabel in het geheugen komt omdat deze tijdens het wijzigen / invoeren niet gelezen mag worden.
- een statement trigger om de cursor te openen
- een rowtrigger voor het uitvoeren van de procedure die op de unieke waarden checked.
De triggers werken prima (althans ze worden goed aangemaakt) wel is het zo dat tijdens het uitvoeren van een update (update tabel set serie=1;) de hele database vast slaat. Weet iemand hoe ik deze combinatie anders zou moeten aanmaken?
Thx
Wzard
Ik ben bezig met het schrijven van een beperking binnen Oracle. Dit gaat doormiddel van triggers en procedures.
Binnen een tabel met een eigen PK en FK hebben we 3 kolommen die uniek moeten zijn (een UK werkt hier niet ivm de PK) dit moet dus iets anders.
Gemaakt:
-een procedure met globale cursor die er voor zorgt dat de tabel in het geheugen komt omdat deze tijdens het wijzigen / invoeren niet gelezen mag worden.
- een statement trigger om de cursor te openen
- een rowtrigger voor het uitvoeren van de procedure die op de unieke waarden checked.
De triggers werken prima (althans ze worden goed aangemaakt) wel is het zo dat tijdens het uitvoeren van een update (update tabel set serie=1;) de hele database vast slaat. Weet iemand hoe ik deze combinatie anders zou moeten aanmaken?
Thx
Wzard
code:
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
| create or replace package p_u55
as
procedure openen;
procedure checken
(p inschrijving.programma%type, s inschrijving.serie%type, b inschrijving.baan%type);
end p_u55;
/
create or replace package body p_u55
as
cursor c_u55 is
select programma,serie,baan from inschrijving;
g_p inschrijving.programma%type;
g_s inschrijving.serie%type;
g_b inschrijving.baan%type;
procedure openen is
begin
if c_u55%isopen then close c_u55;
end if;
open c_u55;
end openen;
procedure checken (p inschrijving.programma%type, s inschrijving.serie%type, b inschrijving.baan%type)
is
begin
fetch c_u55 into g_p,g_s,g_b;
while c_u55%found loop
if (p = g_p and s = g_s and b = g_b) then
raise_application_error(-20000,'Deze baan wordt in deze serie binnen dit programma al gebruikt.') ;
end if;
end loop;
end checken;
begin
dbms_output.put_line('test');
end p_u55;
/
/*************** Rowtrigger ***********************
create or replace trigger t_u55
before insert or update on inschrijving for each row
begin
p_u55.checken(:new.programma , :new.serie , :new.baan);
end t_u55;
/
/**************** Statement trigger ***************
create or replace trigger t_u55st
before insert or update on inschrijving
begin
p_u55.openen;
end t_u55st;
/ |