PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 15/02/2021 10:44:20

Retour ROWCOUNT sur un trigger INSTEAD OF DELETE

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

#2 15/02/2021 11:15:36

gleu
Administrateur

Re : Retour ROWCOUNT sur un trigger INSTEAD OF DELETE

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

#3 15/02/2021 11:36:32

Re : Retour ROWCOUNT sur un trigger INSTEAD OF DELETE

C'est pas faux ^^

Hors ligne

Pied de page des forums