Veritabanı düzeyinde sürümü belirlenmiş bir tablodaki silmeleri önleyin
Oracle 18c / 10.7.1 coğrafi veritabanında bir tablom var. Tablo, düzenlemeleri tabana taşıma seçeneği ile versiyonlanmıştır.
Anlayabildiğim kadarıyla , eğer tablo sürümlü olarak kaydedilmişse, ArcGIS Desktop kullanıcılarının kayıtları silmelerini engellemek ve yine de ekleme ve güncellemelere izin vermek mümkün değil .
Soru:
Doğrudan DB'de bir şey uygulayarak, eklere ve güncellemelere izin verirken, sürümü belirlenmiş bir tablodaki silmeleri önlemenin bir yolu var mı?
Yanıtlar
Tetikleyiciyi özellik sınıfının D tablosuna koymayı deneyebilirsiniz, ancak bu mantıksal olarak güncellemeyi de engellemelidir.
DELETES tablosundaki bu tetikleyici çalışıyor gibi görünüyor.
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 ;
Düzenle:
Bonus puanlar için, yalnızca kayıt belirli bir tarihten önce oluşturulmuşsa (son Pazartesi saat 00: 00'da) silme işlemlerini engelledim.
Bunu yaptım çünkü verilerim hafta sonları harici bir sistemle senkronize ediliyor. Kullanıcıların harici sistemle zaten senkronize edilmiş kayıtları silmesini önlemek istiyorum.
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;