Mencegah penghapusan dalam tabel berversi di tingkat database

Aug 17 2020

Saya memiliki tabel di geodatabase Oracle 18c / 10.7.1. Tabel diversi dengan opsi untuk memindahkan hasil edit ke basis.

Sejauh yang saya tahu, tidak mungkin mencegah pengguna ArcGIS Desktop menghapus catatan, sambil tetap mengizinkan penyisipan dan pembaruan, jika tabel terdaftar sebagai berversi.

Pertanyaan:

Apakah ada cara untuk mencegah penghapusan dalam tabel berversi, sambil tetap mengizinkan penyisipan dan pembaruan, dengan mengimplementasikan sesuatu secara langsung di DB?

Jawaban

1 S_K Aug 26 2020 at 22:31

Anda dapat mencoba menempatkan pemicu pada tabel D kelas fitur, namun hal ini secara logis juga dapat mencegah pembaruan.

1 User1973 Aug 30 2020 at 00:24

Pemicu pada tabel DELETES ini tampaknya berfungsi.

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 ;

Edit:

Untuk poin bonus, saya hanya mencegah penghapusan jika rekaman dibuat sebelum tanggal tertentu (Senin lalu pukul 12:00).

Saya melakukan ini karena data saya disinkronkan ke sistem eksternal pada akhir pekan. Saya ingin mencegah pengguna menghapus rekaman yang telah disinkronkan ke sistem eksternal.

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;