Vous n'êtes pas identifié(e).
Pages : 1
Bonjour,
Je fais du trigger INSTEAD OF DELETE sur des vues multitables ; et je me demande comment faire pour que le DELETE renvoie un ROWCOUNT qui ne soit pas zéro.
Concrètement, j'aimerai bien que dans le cas suivant, suite à l'instruction DELETE, psql retourne "DELETE 2".
aegir=# CREATE TABLE T1(ID INTEGER, FK INTEGER);
CREATE TABLE
aegir=# CREATE TABLE T2 (ID INTEGER);
CREATE TABLE
aegir=# CREATE VIEW V1 AS SELECT T1.*, T2.ID as ID2 FROM T1,T2 WHERE T1.FK=T2.ID;
CREATE VIEW
aegir=# INSERT INTO T2 ( SELECT * FROM generate_series(100,110));
INSERT 0 11
aegir=# INSERT INTO T1( SELECT generate_series(0,10),generate_series(100,110));
INSERT 0 11
aegir=# CREATE FUNCTION tiod_test() RETURNS trigger AS $$
aegir$# BEGIN
aegir$# DELETE FROM T1 WHERE ID=OLD.ID;
aegir$# RETURN NEW;
aegir$# END
aegir$# $$ LANGUAGE 'plpgsql' SECURITY DEFINER;
CREATE FUNCTION
aegir=# CREATE TRIGGER trigger_tiod_test INSTEAD OF DELETE ON V1 FOR EACH ROW EXECUTE PROCEDURE tiod_test();
CREATE TRIGGER
aegir=# select * from V1;
id | fk | id2
----+-----+-----
0 | 100 | 100
1 | 101 | 101
2 | 102 | 102
3 | 103 | 103
4 | 104 | 104
5 | 105 | 105
6 | 106 | 106
7 | 107 | 107
8 | 108 | 108
9 | 109 | 109
10 | 110 | 110
(11 rows)
aegir=# delete from V1 where id in (2,3);
DELETE 0
aegir=# select * from V1;
id | fk | id2
----+-----+-----
0 | 100 | 100
1 | 101 | 101
4 | 104 | 104
5 | 105 | 105
6 | 106 | 106
7 | 107 | 107
8 | 108 | 108
9 | 109 | 109
10 | 110 | 110
(9 rows)
Il y aurait un moyen ?
Dernière modification par herve.lefebvre (15/02/2021 10:51:03)
Hors ligne
Il n'est pas possible de modifier le message "DELETE 0", qui est de toute façon exact (aucune ligne n'a été suprimée de la vue étant donné que la vue ne contient pas de ligne). La seule façon de connaître le nombre de lignes supprimées est d'ajouter un RAISE.
Guillaume.
Hors ligne
C'est pas faux ^^
Hors ligne
Pages : 1