Oracle 12c。 新機能の継続的なレビュー。 SQLテキストの展開

T. Kiteのブログで、私の意見では、非常に有用な新しい12kaの機会の説明を見つけました。

SQLテキスト拡張と呼ばれます 。 実際、すべての変換と追加の後、最終リクエストを取得できます。



1)すべてのサブジェクトビューが開きます。 つまり 一見、あるビューから簡単なクエリを持っているとしましょう。しかし、もっと深く掘り下げると、このビュー内は複雑なリクエストで構成されており、他のビューに基づいていることがわかります。提出。 確かに私たちの多くはこれに出会い、全体像を1つの頭にまとめ、各プレゼンテーションの説明を実行し、1つのリクエストでそれがどのようにまとめられるか想像しようとする価値がある努力を知っています...



2)仮想プライベートデータベース(dbms_rls)の操作は、ロジックとパフォーマンスをデバッグする際の特別な努力です。 新しい機会により、人生を大幅に簡素化することができます(出会った人なら誰でも間違いなく感謝します!)。



DBMS_UTILITYパッケージのEXPAND_SQL_TEXTという新しい関数が追加されました。

いくつかの例(T. KiteのWebサイトから引用)。



標準の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"
      
      






All Articles