Evitar eliminaciones en una tabla versionada a nivel de base de datos
Tengo una tabla en una geodatabase de Oracle 18c / 10.7.1. La tabla está versionada con la opción de mover ediciones a la base.
Por lo que yo puedo decir, es que no es posible evitar que los usuarios de ArcGIS Desktop a partir de la eliminación de registros, al tiempo que permite inserciones y actualizaciones, si la tabla se ha registrado como versionado.
Pregunta:
¿Hay alguna manera de evitar eliminaciones en una tabla versionada, mientras se permiten inserciones y actualizaciones, implementando algo directamente en la base de datos?
Respuestas
Puede intentar poner el disparador en la tabla D de la clase de entidad, sin embargo, esto lógicamente también debería evitar la actualización.
Este disparador en la tabla DELETES parece funcionar.
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 ;
Editar:
Para los puntos de bonificación, solo evité las eliminaciones si el registro se creó antes de una fecha determinada (el último lunes a las 12:00 a.m.).
Hice esto porque mis datos se sincronizan con un sistema externo los fines de semana. Quiero evitar que los usuarios eliminen registros que ya se han sincronizado con el sistema externo.
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;