Предотвращение удалений в версионной таблице на уровне базы данных
У меня есть таблица в базе геоданных Oracle 18c / 10.7.1. Таблица версируется с возможностью переноса изменений в базу.
Насколько я могу сказать, что это не возможно , чтобы запретить пользователям ArcGIS Desktop удалять записи, в то же время позволяя вставки и обновления, если таблица зарегистрирована в качестве версированными.
Вопрос:
Есть ли способ предотвратить удаление в версионной таблице, при этом разрешая вставки и обновления, реализуя что-то непосредственно в БД?
Ответы
Вы можете попытаться поместить триггер в таблицу D класса пространственных объектов, однако по логике это также должно предотвратить обновление.
Этот триггер в таблице DELETES вроде работает.
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 ;
Редактировать:
Что касается бонусных баллов, я предотвращал удаление только в том случае, если запись была создана до определенной даты (последний понедельник в 12:00).
Я сделал это, потому что мои данные синхронизируются с внешней системой по выходным. Я хочу запретить пользователям удалять записи, которые уже были синхронизированы с внешней системой.
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;