Oracle
 sql >> डेटाबेस >  >> RDS >> Oracle

ओरेकल:क्या ट्रिगर में भूमिका बनाना संभव है?

हम पीएल/एसक्यूएल के किसी भी रूप में डीडीएल को मूल रूप से निष्पादित नहीं कर सकते हैं। ट्रिगर्स सहित। ऐसा करने के लिए हमें गतिशील SQL का उपयोग करने की आवश्यकता है।

ट्रिगर में एक अतिरिक्त शिकन होती है:उन्हें लेन-देन के हिस्से के रूप में निकाल दिया जाता है, और उनकी एक सीमा होती है जो हमें उनके शरीर के अंदर एक प्रतिबद्धता जारी करने से रोकती है। ओरेकल में, कोई भी डीडीएल कमांड दो कमिट जारी करता है, एक डीडीएल स्टेटमेंट के निष्पादित होने से पहले और एक के बाद। इसलिए, डीडीएल को एक ट्रिगर में निष्पादित करने के लिए हमें autonomous_transaction pragma का उपयोग करना चाहिए , जिसका अर्थ है कि डीडीएल एक अलग, नेस्टेड लेनदेन में चलता है।

create or replace TRIGGER TestTrigger
    BEFORE INSERT ON TestTable
    REFERENCING OLD AS OLD NEW AS NEW 
FOR EACH ROW 
declare
    pragma autonomous_transaction;
BEGIN 
    execute immediate 'create role '|| :New.RoleName;
END;

स्वायत्त लेनदेन उन निर्माणों में से एक है जो हमारे लिए अपने स्वयं के अनुप्रयोगों का दुरुपयोग और तोड़फोड़ करना आसान है। आपके परिदृश्य में रोड़ा यह है कि क्रिएट रोल अपने ट्रांजेक्शन बबल में सफल हो सकता है जबकि INSETT TestTable में विफल रहता है; ऐसा "स्वायत्त लेनदेन" का अर्थ है। तो आपको अभी भी "[आपकी] तालिका और ऑरैकल भूमिकाओं के बीच समन्वय" की गारंटी नहीं है।

एक बेहतर उपाय यह होगा कि डीएमएल को कुछ ऐसा करने के लिए छल करने की कोशिश करने के बजाय दोनों बयानों को एक प्रक्रियात्मक कॉल में लपेट दिया जाए।

create or replace procedure create_role
     ( p_role_name in user_roles.role%type
       , p_desc in testtable.description%type )
is
    pragma autonomous_transaction;
begin 
    insert into testtable
        ( id, creationdate, rolename, description) 
    values
        ( some_seq.nextval, sysdate, p_role_name, p_desc );
    execute immediate 'create role '|| p_role_name;
end; 



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. ड्रॉप टेबलस्पेस यदि मौजूद नहीं है

  2. ORA-00933 प्राप्त करते रहें:SQL कमांड ठीक से समाप्त नहीं हुआ

  3. Oracle में सबसे बड़े कार्य में नल को संभालना

  4. कनेक्शन खो जाने पर SQL सर्वर से Oracle सर्वर पर OpenQuery अनिश्चित काल के लिए हैंग हो जाता है

  5. oracle में xmltype विशेषता से नाम और मूल्य प्राप्त करना