Trigger
ik heb een view die uit meerdere joins bestaat, te weten; multilan_menuitem.
Als ik een huis tuin en keuken update query afvuur op die view reageert de databank met;
" Error Code : 1393
Can not modify more than one base table through a join view 'engine.multilan_menuitem'
Execution Time : 00:00:00:000
Transfer Time : 00:00:00:000
Total Time : 00:00:00:000 "
nu heb ik met wat onderzoek ontdekt dat men met een trigger een update kwerie wel kan afvuren op de (multi-join) view.
Vermoedelijk is het een kwestie van de relaties aankondigen oid. Anderzijds beschikt de view al over de juiste relaties tot de "echte" tabellen.
Ik heb deze trigger gemaakt, (beetje gestript) maar ik heb even een duwtje in de goede richting nodig.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
delimiter //
create or replace trigger multilan_menuitem_trigger //
instead of update on multilan_menuitem
referencing new as new old as old
begin
update
multilan_menuitem
set
label = :new.label
where
id = :old.mi_id;
end;
//
create or replace trigger multilan_menuitem_trigger //
instead of update on multilan_menuitem
referencing new as new old as old
begin
update
multilan_menuitem
set
label = :new.label
where
id = :old.mi_id;
end;
//
( p.s. kan zijn dat ie een beetje verkracht is door testing purposes )
Je trigger vervangt de UPDATE query. Of met andere woorden, je mag in je trigger zelf de juiste UPDATE query schrijven die de werkelijke tabellen op basis waarvan de view is opgebouwd bijwerken.
Ten eerste zie ik graag opgemerkt dat ik nieuw ben met triggers (obvious)
Ik heb nu een stored procedure gemaakt die de orginele tabellen bijwerkt, is dat wat je bedoeld met je post, -en zoja, kun je een demo geven van een trigger met een soortgelijke functionaliteit ?
Code (php)
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
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
[sql]
CREATE OR DROP PROCEDURE updateMenuitem(
$mi_id INT(11),
$menu_id INT(5),
$parent_id INT(11),
$volgorde_nr INT(11),
$autoOpen INT(11),
$contentId INT(11),
$hyperlink CHAR(255),
$target CHAR(100),
$taal_id INT(5),
$label TEXT,
$titel TEXT,
$content TEXT
)
BEGIN
SET @q = concat("
UPDATE
content
SET
label = '",$label,"',
titel = '",$titel,"',
content = '",$content,"'
WHERE
taal_id = ",$taalid," AND
tabel = 'menuitem' AND
primaire_waarde = ",$mi_id,";
");
PREPARE kwerie FROM @q;
EXECUTE kwerie;
DEALLOCATE PREPARE kwerie;
SET @q = concat("
UPDATE
menuitem
SET
menu_id = ",$menu_id,",
parent_id = ",$parent_id,",
volgorde_nr = ",$volgorde_nr,",
autoOpen = ",$autoOpen,",
contentId = ",$contentId,",
hyperlink = '",$hyperlink,"',
target = '",$target,"'
WHERE
mi_id = ",$mi_id,"
");
PREPARE kwerie FROM @q;
EXECUTE kwerie;
DEALLOCATE PREPARE kwerie;
END
[/sql]
CREATE OR DROP PROCEDURE updateMenuitem(
$mi_id INT(11),
$menu_id INT(5),
$parent_id INT(11),
$volgorde_nr INT(11),
$autoOpen INT(11),
$contentId INT(11),
$hyperlink CHAR(255),
$target CHAR(100),
$taal_id INT(5),
$label TEXT,
$titel TEXT,
$content TEXT
)
BEGIN
SET @q = concat("
UPDATE
content
SET
label = '",$label,"',
titel = '",$titel,"',
content = '",$content,"'
WHERE
taal_id = ",$taalid," AND
tabel = 'menuitem' AND
primaire_waarde = ",$mi_id,";
");
PREPARE kwerie FROM @q;
EXECUTE kwerie;
DEALLOCATE PREPARE kwerie;
SET @q = concat("
UPDATE
menuitem
SET
menu_id = ",$menu_id,",
parent_id = ",$parent_id,",
volgorde_nr = ",$volgorde_nr,",
autoOpen = ",$autoOpen,",
contentId = ",$contentId,",
hyperlink = '",$hyperlink,"',
target = '",$target,"'
WHERE
mi_id = ",$mi_id,"
");
PREPARE kwerie FROM @q;
EXECUTE kwerie;
DEALLOCATE PREPARE kwerie;
END
[/sql]
I failed :)
die backticks zijn niets voor mij :P