CREATE OR REPLACE FUNCTION outils.idx(anyarray, anyelement) RETURNS integer AS $BODY$ SELECT i FROM ( SELECT generate_series(array_lower($1,1),array_upper($1,1)) ) g(i) WHERE $1[i] = $2 LIMIT 1; $BODY$ LANGUAGE sql IMMUTABLE COST 100; ALTER FUNCTION outils.idx(anyarray, anyelement) OWNER TO dba; CREATE OR REPLACE FUNCTION md.liste_nom_auteur(text) RETURNS text AS $BODY$ DECLARE myrec RECORD; var_liste_code_observateur ALIAS for $1; var_liste_nom_observateur character varying DEFAULT ''; BEGIN FOR myrec IN SELECT nom||' '||prenom AS nom_prenom FROM md.personne WHERE code_personne = ANY(string_to_array(var_liste_code_observateur, '&')) ORDER BY outils.idx(string_to_array(var_liste_code_observateur, '&'), code_personne::text) ASC LOOP var_liste_nom_observateur:=var_liste_nom_observateur||', '||myrec.nom_prenom; END LOOP; RETURN substring(var_liste_nom_observateur from 3 FOR (length(var_liste_nom_observateur))::integer); --RETURN var_liste_nom_observateur||'-'||(length(var_liste_nom_observateur)-3)::text; END; $BODY$ LANGUAGE plpgsql VOLATILE COST 100; ALTER FUNCTION md.liste_nom_auteur(text) OWNER TO dba; GRANT EXECUTE ON FUNCTION md.liste_nom_auteur(text) TO public; GRANT EXECUTE ON FUNCTION md.liste_nom_auteur(text) TO dba; GRANT EXECUTE ON FUNCTION md.liste_nom_auteur(text) TO rss; CREATE OR REPLACE FUNCTION md.creation_modification_observateur() RETURNS trigger AS $BODY$ DECLARE var_ancien_code_observateur character varying; var_ancien_login character varying; var_password character varying; var_ancien_role md.enum_role; var_nouveau_role md.enum_role; myrec RECORD; BEGIN IF (TG_OP = 'DELETE') THEN -- mise à jour d'un utilisateur (mot de passe et mail non nuls et role différent de observ EXECUTE $req$ DROP VIEW IF EXISTS saisie.$req$||lower(OLD.code_personne)||$req$_saisie_observation; $req$; END IF; IF (TG_OP = 'INSERT' OR TG_OP = 'UPDATE') THEN IF (NEW.role<>'observ') THEN EXECUTE $req$ DROP VIEW IF EXISTS saisie.$req$||lower(NEW.code_personne)||$req$_saisie_observation; CREATE OR REPLACE VIEW saisie.$req$||lower(NEW.code_personne)||$req$_saisie_observation AS SELECT * FROM saisie.saisie_observation WHERE lower(saisie_observation.numerisateur)::text = lower('$req$||NEW.code_personne||$req$')::text; GRANT SELECT, INSERT, DELETE, UPDATE ON TABLE saisie.$req$||lower(NEW.code_personne)||$req$_saisie_observation TO sicen_gr_amateur; GRANT UPDATE (date_obs, date_debut_obs, date_fin_obs, date_textuelle, regne, nom_vern, nom_complet, cd_nom, referentiel_taxonomique, effectif_min, effectif_max, type_effectif, phenologie, id_waypoint, longitude, latitude, elevation, systeme_coordonnees, unite, localisation, observateur, numerisateur, structure, remarque_obs, id_element_paysage, date_ventilation, geometrie, code_insee, id_lieu_dit, id_etude, id_protocole, effectif_textuel, diffusable, "precision", effectif, url_photo, commentaire_photo) ON TABLE saisie.$req$||lower(NEW.code_personne)||$req$_saisie_observation TO sicen_gr_amateur; $req$; RAISE INFO 'vue créée pour %', NEW.code_personne; RAISE INFO 'Création des règles d''accès à ces vues pour =%', NEW.email; EXECUTE $req$ -- règle lors de l'ajout de données à la vue : INSERT CREATE OR REPLACE RULE insert_$req$||lower(NEW.code_personne)||$req$_saisie_observation AS ON INSERT TO saisie.$req$||lower(NEW.code_personne)||$req$_saisie_observation DO INSTEAD INSERT INTO saisie.saisie_observation(date_obs, date_debut_obs, date_fin_obs, date_textuelle, regne, nom_vern, nom_complet, cd_nom, referentiel_taxonomique, effectif_min, effectif_max, type_effectif, phenologie, id_waypoint, longitude, latitude, elevation, systeme_coordonnees, unite, localisation, observateur, numerisateur, validateur, structure, remarque_obs, id_element_paysage, date_ventilation, geometrie, code_insee, id_lieu_dit, statut_validation, id_etude, id_protocole, effectif_textuel, diffusable, "precision", effectif, url_photo, commentaire_photo) VALUES (NEW.date_obs, NEW.date_debut_obs, NEW.date_fin_obs, NEW.date_textuelle, NEW.regne, NEW.nom_vern, NEW.nom_complet, NEW.cd_nom, NEW.referentiel_taxonomique, NEW.effectif_min, NEW.effectif_max, NEW.type_effectif, NEW.phenologie, NEW.id_waypoint, NEW.longitude, NEW.latitude, NEW.elevation, NEW.systeme_coordonnees, NEW.unite, NEW.localisation, NEW.observateur, NEW.numerisateur, NEW.validateur, NEW.structure, NEW.remarque_obs, NEW.id_element_paysage, NEW.date_ventilation, NEW.geometrie, NEW.code_insee, NEW.id_lieu_dit, NEW.statut_validation, NEW.id_etude, NEW.id_protocole, NEW.effectif_textuel, NEW.diffusable, NEW."precision", NEW.effectif, NEW.url_photo, NEW.commentaire_photo); -- règle lors de la mise à jour de données de la vue : UPDATE CREATE OR REPLACE RULE update_$req$||lower(NEW.code_personne)||$req$_saisie_observation AS ON UPDATE TO saisie.$req$||lower(NEW.code_personne)||$req$_saisie_observation DO INSTEAD UPDATE saisie.saisie_observation SET date_obs = NEW.date_obs, date_debut_obs = NEW.date_debut_obs, date_fin_obs = NEW.date_fin_obs, date_textuelle = NEW.date_textuelle, regne = NEW.regne, nom_vern = NEW.nom_vern, nom_complet = NEW.nom_complet, cd_nom = NEW.cd_nom, referentiel_taxonomique = NEW.referentiel_taxonomique, effectif_min = NEW.effectif_min, effectif_max = NEW.effectif_max, type_effectif = NEW.type_effectif, phenologie = NEW.phenologie, id_waypoint = NEW.id_waypoint, longitude = NEW.longitude, latitude = NEW.latitude, elevation = NEW.elevation, systeme_coordonnees = NEW.systeme_coordonnees, unite = NEW.unite, localisation = NEW.localisation, observateur = NEW.observateur, numerisateur = NEW.numerisateur, validateur = NEW.validateur, structure = NEW.structure, remarque_obs = NEW.remarque_obs, id_element_paysage = NEW.id_element_paysage, date_ventilation = NEW.date_ventilation, geometrie = NEW.geometrie, code_insee = NEW.code_insee, id_lieu_dit = NEW.id_lieu_dit, statut_validation = NEW.statut_validation, id_etude = NEW.id_etude, id_protocole = NEW.id_protocole, effectif_textuel = NEW.effectif_textuel, diffusable = NEW.diffusable, "precision" = NEW."precision", effectif = NEW.effectif, url_photo = NEW.url_photo, commentaire_photo = NEW.commentaire_photo WHERE id_obs = OLD.id_obs; -- règle lors de la suppression d'une données de la vue : DELETE CREATE RULE delete_$req$||lower(NEW.code_personne)||$req$_saisie_observation AS ON DELETE TO saisie.$req$||lower(NEW.code_personne)||$req$_saisie_observation DO INSTEAD DELETE FROM saisie.saisie_observation WHERE id_obs = OLD.id_obs; $req$; END IF; END IF; RETURN null; END; $BODY$ LANGUAGE plpgsql VOLATILE SECURITY DEFINER COST 100; ALTER FUNCTION md.creation_modification_observateur() OWNER TO dba; GRANT EXECUTE ON FUNCTION md.creation_modification_observateur() TO public; GRANT EXECUTE ON FUNCTION md.creation_modification_observateur() TO dba; CREATE TRIGGER md_creation_observateur AFTER INSERT OR UPDATE OR DELETE ON md.personne FOR EACH ROW EXECUTE PROCEDURE md.creation_modification_observateur();