ओरेकल 12 सी। नई सुविधाओं की निरंतर समीक्षा। SQL पाठ विस्तार

मैंने अभी टी। पतंग के ब्लॉग में एक बहुत ही उपयोगी, मेरी राय में, नए 12-का अवसर पाया।
इसे SQL टेक्स्ट विस्तार कहा जाता है। वास्तव में, यह आपको सभी परिवर्तनों और परिवर्धन के बाद, अंतिम अनुरोध प्राप्त करने की अनुमति देता है।

1) सभी विषय दृश्य खोला जाएगा। यानी आइए आपको बताते हैं, पहली नज़र में, एक दृश्य से एक सरल क्वेरी है, लेकिन अगर आप गहराई से खुदाई करते हैं, तो आप पाएंगे कि इस दृश्य के अंदर एक जटिल अनुरोध है, और यह कि अन्य विचारों पर आधारित है, जो बदले में, बहुत अधिक हैं अभ्यावेदन। निश्चित रूप से हम में से बहुत से लोग इस पर आए हैं और जानते हैं कि यह पूरी तस्वीर को एक सिर में एक साथ रखने के लायक है, प्रत्येक प्रस्तुति के विवरण के माध्यम से चल रहा है और यह कल्पना करने की कोशिश कर रहा है कि यह सब एक अनुरोध में एक साथ कैसे आता है ...

2) तर्क और प्रदर्शन डिबगिंग करते समय वर्चुअल प्राइवेट डेटाबेस (dbms_rls) के साथ काम करना एक विशेष प्रयास है। अब एक नया अवसर आपको अपने जीवन को सरल बनाने की अनुमति देता है (जो कोई भी आया है वह निश्चित रूप से इसकी सराहना करेगा!)।

अब एक नया कार्य है, DBAND_UTILITY पैकेज से EXPAND_SQL_TEXT।
कुछ उदाहरण (टी। काइट की वेबसाइट से लिए गए)।

आइए देखें कि मानक all_users से डेटा प्राप्त करने के लिए वास्तव में SQL को क्या निष्पादित किया जाएगा

ops$tkyte%ORA12CR1> variable x clob ops$tkyte%ORA12CR1> begin 2 dbms_utility.expand_sql_text 3 ( input_sql_text => 'select * from all_users', 4 output_sql_text => :x ); 5 end; 6 / PL/SQL procedure successfully completed. ops$tkyte%ORA12CR1> print x X -------------------------------------------------------------------------------- SELECT "A1"."USERNAME" "USERNAME","A1"."USER_ID" "USER_ID","A1"."CREATED" "CREATED","A1"."COMMON" "COMMON" FROM (SELECT "A4"."NAME" "USERNAME","A4"."USER#" "USER_ID","A4"."CTIME" "CREATED",DECODE(BITAND "A4"."SPARE1",128),128,'YES','NO') "COMMON" FROM "SYS"."USER$" "A4","SYS"."TS$" "A3","SYS"."TS$" "A2" WHERE "A4"."DATATS#"="A3"."TS#" AND "A4"."TEMPTS#"="A2"."TS#" AND "A4"."TYPE#"=1) "A1" 


खैर, VPD के साथ काम करने का एक उदाहरण:

 --    ops$tkyte%ORA12CR1> create table my_table 2 ( data varchar2(30), 3 OWNER varchar2(30) default USER 4 ) 5 / Table created. ops$tkyte%ORA12CR1> create or replace 2 function my_security_function( p_schema in varchar2, 3 p_object in varchar2 ) 4 return varchar2 5 as 6 begin 7 return 'owner = USER'; 8 end; 9 / Function created. ops$tkyte%ORA12CR1> begin 2 dbms_rls.add_policy 3 ( object_schema => user, 4 object_name => 'MY_TABLE', 5 policy_name => 'MY_POLICY', 6 function_schema => user, 7 policy_function => 'My_Security_Function', 8 statement_types => 'select, insert, update, delete' , 9 update_check => TRUE ); 10 end; 11 / PL/SQL procedure successfully completed. --       . ops$tkyte%ORA12CR1> begin 2 dbms_utility.expand_sql_text 3 ( input_sql_text => 'select * from my_table', 4 output_sql_text => :x ); 5 end; 6 / PL/SQL procedure successfully completed. ops$tkyte%ORA12CR1> print x X -------------------------------------------------------------------------------- SELECT "A1"."DATA" "DATA","A1"."OWNER" "OWNER" FROM (SELECT "A2"."DATA" "DATA", "A2"."OWNER" "OWNER" FROM "OPS$TKYTE"."MY_TABLE" "A2" WHERE "A2"."OWNER"=USER@!) "A1" 

Source: https://habr.com/ru/post/In189544/


All Articles