डेटाबेस स्तर पर एक संस्करण तालिका में हटाएं रोकें
मेरे पास Oracle 18c / 10.7.1 geodatabase में एक तालिका है। तालिका को संस्करण से स्थानांतरित करने के विकल्प के साथ संस्करणित किया गया है।
जहां तक मैं बता सकता हूं, आर्कगिस डेस्कटॉप उपयोगकर्ताओं को रिकॉर्ड हटाने से रोकना संभव नहीं है, जबकि अभी भी आवेषण और अपडेट की अनुमति देता है, अगर तालिका को संस्करण के रूप में पंजीकृत किया गया है।
सवाल:
वहाँ एक संस्करण तालिका में हटाने को रोकने के लिए एक तरीका है, जबकि अभी भी आवेषण और अद्यतन की अनुमति है, सीधे DB में कुछ को लागू करने से?
जवाब
आप ट्रिगर को फीचर क्लास के डी टेबल पर रखने की कोशिश कर सकते हैं, हालांकि यह तार्किक रूप से अद्यतन को भी रोकना चाहिए।
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;