Empêcher les suppressions dans une table versionnée au niveau de la base de données

Aug 17 2020

J'ai une table dans une géodatabase Oracle 18c / 10.7.1. La table est versionnée avec la possibilité de déplacer les modifications vers la base.

Pour autant que je sache, il n'est pas possible d'empêcher les utilisateurs d'ArcGIS Desktop de supprimer des enregistrements, tout en autorisant les insertions et les mises à jour, si la table est enregistrée comme versionnée.

Question:

Existe-t-il un moyen d'empêcher les suppressions dans une table versionnée, tout en autorisant les insertions et les mises à jour, en implémentant quelque chose directement dans la base de données?

Réponses

1 S_K Aug 26 2020 at 22:31

Vous pouvez essayer de placer le déclencheur sur la table D de la classe d'entités, mais cela devrait logiquement empêcher également la mise à jour.

1 User1973 Aug 30 2020 at 00:24

Ce déclencheur sur la table DELETES semble fonctionner.

CREATE OR REPLACE TRIGGER D202574_custom
BEFORE INSERT ON D202574
FOR EACH ROW
DECLARE 
    v_upd_row NUMBER;
BEGIN
    SELECT COUNT(1) INTO v_upd_row 
    FROM A202574
    WHERE objectid = :new.sde_deletes_row_id
    AND sde_state_id = :new.deleted_at;

    IF v_upd_row = 0 THEN
         raise_application_error(-20001, 'Deleting has been disabled via a custom trigger.');
    END IF;
END ;

Éditer:

Pour les points bonus, j'ai empêché les suppressions uniquement si l'enregistrement a été créé avant une certaine date (lundi dernier à 12h00).

J'ai fait cela parce que mes données sont synchronisées avec un système externe le week-end. Je souhaite empêcher les utilisateurs de supprimer des enregistrements qui ont déjà été synchronisés avec le système externe.

create or replace trigger v202577_delete_custom
    before insert
    on d202577
    for each row
declare
    v_upd_row       number;
    v_cre_date_row   number;
begin
    select
        count (1)
        into v_upd_row
        from a202577
     where
        objectid = :new.sde_deletes_row_id
        and sde_state_id = :new.deleted_at;
 
    select
        count (1)
        into v_cre_date_row
    from
        a_test_fc a
     where
        a.objectid = :new.sde_deletes_row_id
        and a.created_date < trunc(next_day (sysdate - 6, 'monday'));
 
    if v_upd_row = 0 and v_cre_date_row > 0
    then
        raise_application_error ( -20001, 'Deleting has been disabled via a custom trigger.');
    end if;
end;