<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Autonomous Database Archives - Philipp Salvisberg&#039;s Blog</title>
	<atom:link href="https://www.salvis.com/blog/tag/autonomous-database/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.salvis.com/blog/tag/autonomous-database/</link>
	<description>Database-centric development</description>
	<lastBuildDate>Wed, 08 Nov 2023 17:04:24 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://www.salvis.com/blog/wp-content/uploads/2014/04/favicon.png</url>
	<title>Autonomous Database Archives - Philipp Salvisberg&#039;s Blog</title>
	<link>https://www.salvis.com/blog/tag/autonomous-database/</link>
	<width>32</width>
	<height>32</height>
</image> 
<atom:link rel="hub" href="https://pubsubhubbub.appspot.com"/>
<atom:link rel="hub" href="https://pubsubhubbub.superfeedr.com"/>
<atom:link rel="hub" href="https://websubhub.com/hub"/>
<atom:link rel="self" href="https://www.salvis.com/blog/tag/autonomous-database/feed/"/>
	<item>
		<title>optimizer_secure_view_merging and plsql_declarations</title>
		<link>https://www.salvis.com/blog/2022/10/30/optimizer_secure_view_merging-and-plsql_declarations/</link>
					<comments>https://www.salvis.com/blog/2022/10/30/optimizer_secure_view_merging-and-plsql_declarations/#comments</comments>
		
		<dc:creator><![CDATA[Philipp Salvisberg]]></dc:creator>
		<pubDate>Sun, 30 Oct 2022 11:56:32 +0000</pubDate>
				<category><![CDATA[Oracle]]></category>
		<category><![CDATA[Autonomous Database]]></category>
		<category><![CDATA[PinkDB]]></category>
		<category><![CDATA[PL/SQL]]></category>
		<category><![CDATA[SQL]]></category>
		<guid isPermaLink="false">https://www.salvis.com/blog/?p=11897</guid>

					<description><![CDATA[<p>The Original Problem A customer is currently upgrading some Oracle databases from 11.2 to 19c. One query was extremely slow on the new test system and my job was to find out why. The root cause was that the database parameter optimizer_secure_view_merging was set to a different value. In 19c true and<span class="excerpt-hellip"> […]</span></p>
<p>The post <a href="https://www.salvis.com/blog/2022/10/30/optimizer_secure_view_merging-and-plsql_declarations/">optimizer_secure_view_merging and plsql_declarations</a> appeared first on <a href="https://www.salvis.com/blog">Philipp Salvisberg&#039;s Blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading">The Original Problem</h2>



<p>A customer is currently upgrading some Oracle databases from 11.2 to 19c. One query was extremely slow on the new test system and my job was to find out why. The root cause was that the database parameter <a href="https://docs.oracle.com/en/database/oracle/oracle-database/19/refrn/OPTIMIZER_SECURE_VIEW_MERGING.html">optimizer_secure_view_merging</a> was set to a different value. In 19c <code>true</code> and <code>false</code> in 11.2. This led to a different and in fact bad execution plan in 19c.</p>



<p>Now the question was, should the customer keep the default value of <code>optimizer_secure_view_merging</code> in 19c and rewrite the slow query or change the parameter to <code>false</code> as in 11.2 to get a good performance without a code change?</p>



<h2 class="wp-block-heading">What About the <code>opt_param</code> Hint?</h2>



<p>Actually, the first thing I tried was the <code>opt_param('optimizer_secure_view_merging','false')</code> hint. Unfortunately, this does not work in 19c. It&#8217;s a known bug 28504113. Fixed in 23c. However, I can&#8217;t really recommend waiting for 23c, right?</p>



<h2 class="wp-block-heading">What About the <code>merge view</code> Privilege?</h2>



<p>The <a href="https://docs.oracle.com/en/database/oracle/oracle-database/19/sqlrf/GRANT.html#GUID-20B4E2C0-A7F8-4BC8-A5E8-BE61BDC41AC3__BGBHCCFH">merge any view</a> privilege is a good option for highly privileged users and roles. But it should not be granted lightly to any ordinary role or user.</p>



<p>The <a href="https://docs.oracle.com/en/database/oracle/oracle-database/19/sqlrf/GRANT.html#d404029e6564">merge view</a> privilege can be granted per view to a user or role. This has a similar scope as a hint in the subquery of a view without having to change the code. In fact, it is an excellent option to override the <code>optimizer_secure_view_merging</code> setting for a view. We could <code>grant merge view on &lt;owner&gt;.&lt;view_name&gt; to public</code> to mimic the scope of a&nbsp;hint in the subquery of a view.</p>



<p>However, the customer uses a metadata-driven approach to generate the grants for end-user roles as part of the application. And it would require a change of the application to handle this exceptional case. Of course, this grant can easily be hard coded for the view in question, but this is something the customer would like to avoid.</p>



<h2 class="wp-block-heading">Christian Antognini&#8217;s Recommendation</h2>



<p>Chris explains <code>optimizer_secure_view_merging</code> on pages 289 to 291 in <a href="https://antognini.ch/top/">Troubleshooting Oracle Performance, 2nd Edition</a>. On page 291 he writes the following:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>If you’re neither using views nor VPD for security purposes, I advise you to set the <code>optimizer_secure_view_merging</code> initialization parameter to <code>FALSE</code>.</p>
</blockquote>



<p>In my case, the customer uses views and protects them with Virtual Private Database policies. According to Chris, the customer should keep the default value <code>true</code> for <code>optimizer_secure_view_merging</code>. A sound advice.</p>



<h2 class="wp-block-heading">What Security Risk Are We Talking About?</h2>



<p><a href="https://antognini.ch/top/">Troubleshooting Oracle Performance, 2nd Edition</a> comes with an <a href="https://antognini.ch/downloads/top2/allfiles.zip">allfiles.zip</a> file. It contains a script <code>optimizer_secure_view_merging.sql</code> in the folder <code>chapter09</code>. Chris used this script to explain the impact of <code>optimizer_secure_view_merging</code> in his book. I reused this script here with minor changes.</p>



<p>Let&#8217;s connect as user <code>sys</code> and create a database user <code>u1</code> for the application data and code and a user <code>u2</code> as connect user (with passwords which work in Autonomous Databases). We also disable <code>optimizer_secure_view_merging</code>.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">1) Setup as sys</span><span role="button" tabindex="0" data-code="create user u1 identified by &quot;AppOwner2022&quot;    default tablespace users quota unlimited on users;
create user u2 identified by &quot;ConnectUser2022&quot; default tablespace users quota unlimited on users;

grant create session, create table, create procedure, create view, create public synonym to u1;
grant create session, create procedure to u2;

alter system set optimizer_secure_view_merging=false scope=memory;" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">create</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">user</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">u1</span><span style="color: #D4D4D4"> identified </span><span style="color: #569CD6">by</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;AppOwner2022&quot;</span><span style="color: #D4D4D4">    </span><span style="color: #569CD6">default</span><span style="color: #D4D4D4"> tablespace users quota </span><span style="color: #569CD6">unlimited</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">on</span><span style="color: #D4D4D4"> users;</span></span>
<span class="line"><span style="color: #569CD6">create</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">user</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">u2</span><span style="color: #D4D4D4"> identified </span><span style="color: #569CD6">by</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;ConnectUser2022&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">default</span><span style="color: #D4D4D4"> tablespace users quota </span><span style="color: #569CD6">unlimited</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">on</span><span style="color: #D4D4D4"> users;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">grant</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">create</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">session</span><span style="color: #D4D4D4">, </span><span style="color: #569CD6">create</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">table</span><span style="color: #D4D4D4">, </span><span style="color: #569CD6">create</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">procedure</span><span style="color: #D4D4D4">, </span><span style="color: #569CD6">create</span><span style="color: #D4D4D4"> view, </span><span style="color: #569CD6">create</span><span style="color: #D4D4D4"> public </span><span style="color: #569CD6">synonym</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">to</span><span style="color: #D4D4D4"> u1;</span></span>
<span class="line"><span style="color: #569CD6">grant</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">create</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">session</span><span style="color: #D4D4D4">, </span><span style="color: #569CD6">create</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">procedure</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">to</span><span style="color: #D4D4D4"> u2;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">alter</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">system</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">set</span><span style="color: #D4D4D4"> optimizer_secure_view_merging=false scope=memory;</span></span></code></pre></div>



<p>Now we connect as user <code>u1</code> and create a table <code>t</code> with 6 rows. and a function <code>f</code> to filter rows in the view <code>v</code>.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">2) Setup as u1</span><span role="button" tabindex="0" data-code="create table t (
  id    number(10) primary key,
  class number(10),
  pad   varchar2(10)
);

execute dbms_random.seed(0)

insert into t (id, class, pad)
select rownum, mod(rownum, 3), dbms_random.string('a', 10)
  from dual
connect by level <= 6;

execute dbms_stats.gather_table_stats(user, 't')

create or replace function f(in_class in number) return number as
begin
   if in_class = 1 then
      return 1;
   else
      return 0;
   end if;
end;
/

create or replace view v as
   select *
     from t
    where f(class) = 1;

grant select on v to u2;

create or replace public synonym v for u1.v;" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">create</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">table</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">t</span><span style="color: #D4D4D4"> (</span></span>
<span class="line"><span style="color: #D4D4D4">  id    </span><span style="color: #569CD6">number</span><span style="color: #D4D4D4">(</span><span style="color: #B5CEA8">10</span><span style="color: #D4D4D4">) </span><span style="color: #569CD6">primary key</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">  class </span><span style="color: #569CD6">number</span><span style="color: #D4D4D4">(</span><span style="color: #B5CEA8">10</span><span style="color: #D4D4D4">),</span></span>
<span class="line"><span style="color: #D4D4D4">  pad   </span><span style="color: #569CD6">varchar2</span><span style="color: #D4D4D4">(</span><span style="color: #B5CEA8">10</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">execute</span><span style="color: #D4D4D4"> dbms_random.seed(</span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">insert into</span><span style="color: #D4D4D4"> t (id, class, pad)</span></span>
<span class="line"><span style="color: #569CD6">select</span><span style="color: #D4D4D4"> rownum, mod(rownum, </span><span style="color: #B5CEA8">3</span><span style="color: #D4D4D4">), dbms_random.string(</span><span style="color: #CE9178">&#39;a&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #B5CEA8">10</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">from</span><span style="color: #D4D4D4"> dual</span></span>
<span class="line"><span style="color: #569CD6">connect</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">by</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">level</span><span style="color: #D4D4D4"> &lt;= </span><span style="color: #B5CEA8">6</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">execute</span><span style="color: #D4D4D4"> dbms_stats.gather_table_stats(user, </span><span style="color: #CE9178">&#39;t&#39;</span><span style="color: #D4D4D4">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">create or replace</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">function</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">f</span><span style="color: #D4D4D4">(in_class </span><span style="color: #569CD6">in</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">number</span><span style="color: #D4D4D4">) </span><span style="color: #569CD6">return</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">number</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">as</span></span>
<span class="line"><span style="color: #569CD6">begin</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">if</span><span style="color: #D4D4D4"> in_class = </span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">then</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #569CD6">return</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">else</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #569CD6">return</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">end</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">if</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #569CD6">end</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">/</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">create or replace</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">view</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">v</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">as</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">select</span><span style="color: #D4D4D4"> *</span></span>
<span class="line"><span style="color: #D4D4D4">     </span><span style="color: #569CD6">from</span><span style="color: #D4D4D4"> t</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">where</span><span style="color: #D4D4D4"> f(class) = </span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">grant</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">select</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">on</span><span style="color: #D4D4D4"> v </span><span style="color: #569CD6">to</span><span style="color: #D4D4D4"> u2;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">create</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">or</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">replace</span><span style="color: #D4D4D4"> public </span><span style="color: #569CD6">synonym</span><span style="color: #D4D4D4"> v </span><span style="color: #569CD6">for</span><span style="color: #D4D4D4"> u1.v;</span></span></code></pre></div>



<p>Let&#8217;s connect as user <code>u2</code> to query the view.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">3) Query view v as u2</span><span role="button" tabindex="0" data-code="select id, pad
  from v
 where id between 1 and 5;

        ID PAD       
---------- ----------
         1 DrMLTDXxxq
         4 AszBGEUGEL" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">select</span><span style="color: #D4D4D4"> id, pad</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">from</span><span style="color: #D4D4D4"> v</span></span>
<span class="line"><span style="color: #D4D4D4"> </span><span style="color: #569CD6">where</span><span style="color: #D4D4D4"> id </span><span style="color: #569CD6">between</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">and</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">5</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">        ID PAD       </span></span>
<span class="line"><span style="color: #6A9955">---------- ----------</span></span>
<span class="line"><span style="color: #D4D4D4">         </span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4"> DrMLTDXxxq</span></span>
<span class="line"><span style="color: #D4D4D4">         </span><span style="color: #B5CEA8">4</span><span style="color: #D4D4D4"> AszBGEUGEL</span></span></code></pre></div>



<p>Only two of five rows are returned due to the where clause in the view. So far so good.</p>



<p>The user <code>u2</code> has the right to create own functions. And that is a security risk. Why? Because the user can write a <code>spy</code>&nbsp;function like in the next example:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(234, 191, 191, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">4) Accessing protected data as u2</span><span role="button" tabindex="0" data-code="create or replace function spy(
   in_id  in number,
   in_pad in varchar2
) return number as
begin
   dbms_output.put_line('id='
      || in_id
      || ' pad='
      || in_pad);
   return 1;
end;
/

set serveroutput on size unlimited
select id, pad
  from v
 where id between 1 and 5
   and spy(id, pad) = 1;

        ID PAD       
---------- ----------
         1 DrMLTDXxxq
         4 AszBGEUGEL

id=1 pad=DrMLTDXxxq
id=2 pad=XOZnqYRJwI
id=3 pad=nlGfGBTxNk
id=4 pad=AszBGEUGEL
id=5 pad=qTSRnFjRGb" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">create or replace</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">function</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">spy</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">   in_id  </span><span style="color: #569CD6">in</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">number</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">   in_pad </span><span style="color: #569CD6">in</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">varchar2</span></span>
<span class="line"><span style="color: #D4D4D4">) </span><span style="color: #569CD6">return</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">number</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">as</span></span>
<span class="line"><span style="color: #569CD6">begin</span></span>
<span class="line"><span style="color: #D4D4D4">   dbms_output.put_line(</span><span style="color: #CE9178">&#39;id=&#39;</span></span>
<span class="line"><span style="color: #D4D4D4">      || in_id</span></span>
<span class="line"><span style="color: #D4D4D4">      || </span><span style="color: #CE9178">&#39; pad=&#39;</span></span>
<span class="line"><span style="color: #D4D4D4">      || in_pad);</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">return</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #569CD6">end</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">/</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">set</span><span style="color: #D4D4D4"> serveroutput </span><span style="color: #569CD6">on</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">size</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">unlimited</span></span>
<span class="line"><span style="color: #569CD6">select</span><span style="color: #D4D4D4"> id, pad</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">from</span><span style="color: #D4D4D4"> v</span></span>
<span class="line"><span style="color: #D4D4D4"> </span><span style="color: #569CD6">where</span><span style="color: #D4D4D4"> id </span><span style="color: #569CD6">between</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">and</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">5</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">and</span><span style="color: #D4D4D4"> spy(id, pad) = </span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">        ID PAD       </span></span>
<span class="line"><span style="color: #6A9955">---------- ----------</span></span>
<span class="line"><span style="color: #D4D4D4">         </span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4"> DrMLTDXxxq</span></span>
<span class="line"><span style="color: #D4D4D4">         </span><span style="color: #B5CEA8">4</span><span style="color: #D4D4D4"> AszBGEUGEL</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">id=</span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4"> pad=DrMLTDXxxq</span></span>
<span class="line cbp-line-highlight"><span style="color: #D4D4D4">id=</span><span style="color: #B5CEA8">2</span><span style="color: #D4D4D4"> pad=XOZnqYRJwI</span></span>
<span class="line cbp-line-highlight"><span style="color: #D4D4D4">id=</span><span style="color: #B5CEA8">3</span><span style="color: #D4D4D4"> pad=nlGfGBTxNk</span></span>
<span class="line"><span style="color: #D4D4D4">id=</span><span style="color: #B5CEA8">4</span><span style="color: #D4D4D4"> pad=AszBGEUGEL</span></span>
<span class="line cbp-line-highlight"><span style="color: #D4D4D4">id=</span><span style="color: #B5CEA8">5</span><span style="color: #D4D4D4"> pad=qTSRnFjRGb</span></span></code></pre></div>



<p>Look at the server output for id 3, 4 and 5. By using the spy function in the where clause the user can get access to all rows in table <code>t</code>. This is only possible because</p>



<ul class="wp-block-list">
<li>the database parameter <code>optimizer_secure_view_merging</code> is set to <code>false</code>,</li>



<li>the optimizer applies the <code>spy</code> function to an intermediate result and</li>



<li>the user <code>u2</code> has the <code>create procedure</code> privilege.</li>
</ul>



<p>When you call <code>alter system set optimizer_secure_view_merging=true scope=memory;</code> then the result of the previous query looks like this:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">5) Result with optimizer_secure_view_merging=true</span><span role="button" tabindex="0" data-code="        ID PAD       
---------- ----------
         1 DrMLTDXxxq
         4 AszBGEUGEL

id=1 pad=DrMLTDXxxq
id=4 pad=AszBGEUGEL" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4">        ID PAD       </span></span>
<span class="line"><span style="color: #6A9955">---------- ----------</span></span>
<span class="line"><span style="color: #D4D4D4">         </span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4"> DrMLTDXxxq</span></span>
<span class="line"><span style="color: #D4D4D4">         </span><span style="color: #B5CEA8">4</span><span style="color: #D4D4D4"> AszBGEUGEL</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">id=</span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4"> pad=DrMLTDXxxq</span></span>
<span class="line"><span style="color: #D4D4D4">id=</span><span style="color: #B5CEA8">4</span><span style="color: #D4D4D4"> pad=AszBGEUGEL</span></span></code></pre></div>



<p>The <code>spy</code> function does not reveal protected data anymore. Thanks to <code>optimizer_secure_view_merging=true</code>.</p>



<h2 class="wp-block-heading">The Next Problem</h2>



<p>The customer&#8217;s connect users do not have <code>create procedure</code> privileges. After all, It&#8217;s a <a href="https://www.salvis.com/blog/2018/07/18/the-pink-database-paradigm-pinkdb/">PinkDB</a> application. Hence I could recommend to set <code>optimizer_secure_view_merging=false</code>, because the connect users would not be able to write their own <code>spy</code> functions, right?</p>



<p>Wrong. For two reasons.</p>



<p>Firstly, the user could have access to an existing function that might be misused, e.g. a logger function.</p>



<p>Secondly, we are on 19c. And since 12.1 we have <a href="https://docs.oracle.com/en/database/oracle/oracle-database/19/sqlrf/SELECT.html#GUID-CFA006CA-6FF1-4972-821E-6996142A51C6__GUID-28DA0E1D-87BF-462E-BCB8-8F77921022F9">plsql_declarations</a> to write PL/SQL functions and procedures in the&nbsp;<a href="https://docs.oracle.com/en/database/oracle/oracle-database/19/sqlrf/SELECT.html#GUID-CFA006CA-6FF1-4972-821E-6996142A51C6__GUID-7BFCEBF8-6459-4328-8CFC-6FF044E8A147">with_clause</a> of a <a href="https://docs.oracle.com/en/database/oracle/oracle-database/19/sqlrf/SELECT.html#GUID-CFA006CA-6FF1-4972-821E-6996142A51C6">select statement</a>. As a result, I can write a <code>spy</code> function without the <code>create procedure</code> privilege. For example like this:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(234, 191, 191, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">6) Spy function in the with_clause</span><span role="button" tabindex="0" data-code="set serveroutput on size unlimited
with
   function spy(
      in_id  in number,
      in_pad in varchar2
   ) return number as
   begin
      dbms_output.put_line('id='
         || in_id
         || ' pad='
         || in_pad);
      return 1;
   end;
select id, pad
  from v
 where id between 1 and 5
   and spy(id, pad) = 1;
/

        ID PAD       
---------- ----------
         1 DrMLTDXxxq
         4 AszBGEUGEL

id=1 pad=DrMLTDXxxq
id=2 pad=XOZnqYRJwI
id=3 pad=nlGfGBTxNk
id=4 pad=AszBGEUGEL
id=5 pad=qTSRnFjRGb" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">set</span><span style="color: #D4D4D4"> serveroutput </span><span style="color: #569CD6">on</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">size</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">unlimited</span></span>
<span class="line"><span style="color: #569CD6">with</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">function</span><span style="color: #D4D4D4"> spy(</span></span>
<span class="line"><span style="color: #D4D4D4">      in_id  </span><span style="color: #569CD6">in</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">number</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">      in_pad </span><span style="color: #569CD6">in</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">varchar2</span></span>
<span class="line"><span style="color: #D4D4D4">   ) </span><span style="color: #569CD6">return</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">number</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">as</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">begin</span></span>
<span class="line"><span style="color: #D4D4D4">      dbms_output.put_line(</span><span style="color: #CE9178">&#39;id=&#39;</span></span>
<span class="line"><span style="color: #D4D4D4">         || in_id</span></span>
<span class="line"><span style="color: #D4D4D4">         || </span><span style="color: #CE9178">&#39; pad=&#39;</span></span>
<span class="line"><span style="color: #D4D4D4">         || in_pad);</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #569CD6">return</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">end</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #569CD6">select</span><span style="color: #D4D4D4"> id, pad</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">from</span><span style="color: #D4D4D4"> v</span></span>
<span class="line"><span style="color: #D4D4D4"> </span><span style="color: #569CD6">where</span><span style="color: #D4D4D4"> id </span><span style="color: #569CD6">between</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">and</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">5</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">and</span><span style="color: #D4D4D4"> spy(id, pad) = </span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">/</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">        ID PAD       </span></span>
<span class="line"><span style="color: #6A9955">---------- ----------</span></span>
<span class="line"><span style="color: #D4D4D4">         </span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4"> DrMLTDXxxq</span></span>
<span class="line"><span style="color: #D4D4D4">         </span><span style="color: #B5CEA8">4</span><span style="color: #D4D4D4"> AszBGEUGEL</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">id=</span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4"> pad=DrMLTDXxxq</span></span>
<span class="line cbp-line-highlight"><span style="color: #D4D4D4">id=</span><span style="color: #B5CEA8">2</span><span style="color: #D4D4D4"> pad=XOZnqYRJwI</span></span>
<span class="line cbp-line-highlight"><span style="color: #D4D4D4">id=</span><span style="color: #B5CEA8">3</span><span style="color: #D4D4D4"> pad=nlGfGBTxNk</span></span>
<span class="line"><span style="color: #D4D4D4">id=</span><span style="color: #B5CEA8">4</span><span style="color: #D4D4D4"> pad=AszBGEUGEL</span></span>
<span class="line cbp-line-highlight"><span style="color: #D4D4D4">id=</span><span style="color: #B5CEA8">5</span><span style="color: #D4D4D4"> pad=qTSRnFjRGb</span></span></code></pre></div>



<p>Again, look at the server output for id 3, 4 and 5. Protected data is revealed, even if the user has only the <code>create session</code> privilege and <code>optimizer_secure_view_merging</code> is set to <code>true</code>. IMO this is clearly a security bug.</p>



<h2 class="wp-block-heading">What Database Versions Are Affected?</h2>



<p>I assume that all Oracle Database versions from 12.1 onwards are affected. Including Autonomous Databases. I have explicitly tested the following versions:</p>



<ul class="wp-block-list">
<li>OCI as of 2022-10-30:
<ul class="wp-block-list">
<li>Autonomous Database 21c (ATP)</li>



<li>Autonomous Database 19c (ADW, AJD)</li>
</ul>
</li>



<li>On-Premises
<ul class="wp-block-list">
<li>Oracle Database XE 21c</li>



<li>Oracle Database Enterprise Edition 19c (19.16)</li>
</ul>
</li>
</ul>



<h2 class="wp-block-heading">What Can We Do?</h2>



<p>I created SR 3-31087264311 for this issue. I expect that either a workaround is provided or a bug is opened and a fix will be available soon. I&#8217;ll update this blog post accordingly. <em>(Update on 2023-02-27: Bug 34777606 is referenced in the SR, but not visible. However, it&#8217;s an accepted security bug and fixed in 23c. I&#8217;ve tested it successfully in 23.2. It&#8217;s not planned to include a fix as part of an RU for 19c. However, you can request a one-off patch via SR.).</em></p>



<p>In any case, if you have views or VPD policies for security purposes, set <code>optimizer_secure_view_merging=true</code> and ensure that the connect users do not have the <code>create procedure</code> privilege. Follow the <a href="https://en.wikipedia.org/wiki/Principle_of_least_privilege">principle of least privileges</a>.</p>



<p>As a workaround, you can use <a href="https://docs.oracle.com/en/database/oracle/oracle-database/19/dbseg/configuring-audit-policies.html#GUID-B706FF6F-13A6-4944-AFCB-29971F5076FD">Fine-Grained Auditing</a> to identify statements with <code>plsql_declarations</code>. You can either log them or abort the execution as in the following example:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(234, 191, 191, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">7) Abort execution of statements with plsql_declarations (as sys)</span><span role="button" tabindex="0" data-code="create or replace procedure u1.suppress_plsql_delcarations_handler(
   in_object_owner in varchar2,
   in_object_name  in varchar2,
   in_policy_name  in varchar2
) is
begin
   if regexp_like(sys_context('userenv', 'current_sql'), 'with[^fp]+(function|procedure)', 'i') then
      raise_application_error(-20942, 'plsql_declarations are not allowed in the with_clause. See policy '
         || in_policy_name
         || ' for '
         || in_object_owner
         || '.'
         || in_object_name);
   end if;
end;
/

begin
   dbms_fga.add_policy(
      object_schema   =&gt; 'U1',
      object_name     =&gt; 'V',
      policy_name     =&gt; 'SUPPRESS_PLSQL_DELCARATIONS_POLICY',
      handler_schema  =&gt; 'U1',
      handler_module  =&gt; 'SUPPRESS_PLSQL_DELCARATIONS_HANDLER',
      statement_types =&gt; 'SELECT,INSERT,UPDATE,DELETE'
   );
end;
/" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">create or replace</span><span style="color: #D4D4D4"> procedure u1.suppress_plsql_delcarations_handler(</span></span>
<span class="line"><span style="color: #D4D4D4">   in_object_owner </span><span style="color: #569CD6">in</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">varchar2</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">   in_object_name  </span><span style="color: #569CD6">in</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">varchar2</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">   in_policy_name  </span><span style="color: #569CD6">in</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">varchar2</span></span>
<span class="line"><span style="color: #D4D4D4">) </span><span style="color: #569CD6">is</span></span>
<span class="line"><span style="color: #569CD6">begin</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> regexp_like(</span><span style="color: #DCDCAA">sys_context</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;userenv&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&#39;current_sql&#39;</span><span style="color: #D4D4D4">), </span><span style="color: #CE9178">&#39;with[^fp]+(function|procedure)&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&#39;i&#39;</span><span style="color: #D4D4D4">) </span><span style="color: #569CD6">then</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #DCDCAA">raise_application_error</span><span style="color: #D4D4D4">(-</span><span style="color: #B5CEA8">20942</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&#39;plsql_declarations are not allowed in the with_clause. See policy &#39;</span></span>
<span class="line"><span style="color: #D4D4D4">         || in_policy_name</span></span>
<span class="line"><span style="color: #D4D4D4">         || </span><span style="color: #CE9178">&#39; for &#39;</span></span>
<span class="line"><span style="color: #D4D4D4">         || in_object_owner</span></span>
<span class="line"><span style="color: #D4D4D4">         || </span><span style="color: #CE9178">&#39;.&#39;</span></span>
<span class="line"><span style="color: #D4D4D4">         || in_object_name);</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #C586C0">end if</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #569CD6">end</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">/</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">begin</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #DCDCAA">dbms_fga.</span><span style="color: #4EC9B0">add_policy</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">      object_schema   =&gt; </span><span style="color: #CE9178">&#39;U1&#39;</span><span style="color: #D4D4D4">,</span></span>
<span class="line cbp-line-highlight"><span style="color: #D4D4D4">      object_name     =&gt; </span><span style="color: #CE9178">&#39;V&#39;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">      policy_name     =&gt; </span><span style="color: #CE9178">&#39;SUPPRESS_PLSQL_DELCARATIONS_POLICY&#39;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">      handler_schema  =&gt; </span><span style="color: #CE9178">&#39;U1&#39;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">      handler_module  =&gt; </span><span style="color: #CE9178">&#39;SUPPRESS_PLSQL_DELCARATIONS_HANDLER&#39;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">      statement_types =&gt; </span><span style="color: #CE9178">&#39;SELECT,INSERT,UPDATE,DELETE&#39;</span></span>
<span class="line"><span style="color: #D4D4D4">   );</span></span>
<span class="line"><span style="color: #569CD6">end</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">/</span></span></code></pre></div>



<p class="has-text-align-left">You have to register a policy for each view. This can be easily generated. However, you should consider that such a policy has an impact on performance. Therefore, you should define such a policy only when needed.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p class="has-text-align-left"><em>Updated on 2022-11-02, documented workaround via <a href="https://docs.oracle.com/en/database/oracle/oracle-database/19/arpls/DBMS_FGA.html#GUID-DC7B93AE-4390-4D27-9CAC-43DC932D8622">DBMS_FGA</a>.</em></p>



<p class="has-text-align-left"><em>Updated on 2022-11-03, updated workaround regarding comments before <code>plsql_declarations</code> and support for all DML statements.</em></p>



<p class="has-text-align-left"><em>Updated on 2023-03-13, added reference to bug 34777606 (not visible), fixed in 23c, no information regarding backport yet.</em></p>



<p class="has-text-align-left"><em>Updated on 2023-03-27,&nbsp; &#8220;Bug 34255928 &#8211; INCORRECT SECURE VIEW MERGING FOR A QUERY WITH A FUNCTION DEFINED IN ITS WITH CLAUSE&#8221; fixed in 23c, backport possible as a one-off patch via SR. No plans to include it in an RU for 19c.</em></p>



<p class="has-text-align-left"><em>Updated on 2023-04-05: Tested successfully in 23c, <span class="s1">Developer-Release Version 23.2.0.0.0</span></em></p>
<p>The post <a href="https://www.salvis.com/blog/2022/10/30/optimizer_secure_view_merging-and-plsql_declarations/">optimizer_secure_view_merging and plsql_declarations</a> appeared first on <a href="https://www.salvis.com/blog">Philipp Salvisberg&#039;s Blog</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.salvis.com/blog/2022/10/30/optimizer_secure_view_merging-and-plsql_declarations/feed/</wfw:commentRss>
			<slash:comments>3</slash:comments>
		
		
			</item>
		<item>
		<title>Connecting via JDBC to the Oracle Cloud</title>
		<link>https://www.salvis.com/blog/2021/02/28/connecting-via-jdbc-to-the-oracle-cloud/</link>
		
		<dc:creator><![CDATA[Philipp Salvisberg]]></dc:creator>
		<pubDate>Sun, 28 Feb 2021 12:31:10 +0000</pubDate>
				<category><![CDATA[Oracle]]></category>
		<category><![CDATA[Autonomous Database]]></category>
		<category><![CDATA[JDBC]]></category>
		<guid isPermaLink="false">https://www.salvis.com/blog/?p=11053</guid>

					<description><![CDATA[<p>You can connect to an Oracle Autonomous Database in different ways. This is well documented here. It&#8217;s a bit different from what we know from on-premises environments. In this blog post, I show the steps to connect to an Autonomous Database from a third-party IDE like&#160;DataGrip. From a JDBC perspective, this is<span class="excerpt-hellip"> […]</span></p>
<p>The post <a href="https://www.salvis.com/blog/2021/02/28/connecting-via-jdbc-to-the-oracle-cloud/">Connecting via JDBC to the Oracle Cloud</a> appeared first on <a href="https://www.salvis.com/blog">Philipp Salvisberg&#039;s Blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>You can connect to an Oracle Autonomous Database in different ways. This is well documented <a href="https://docs.oracle.com/en/cloud/paas/autonomous-database/adbsa/connect-jdbc-thin-wallet.html">here</a>. It&#8217;s a bit different from what we know from on-premises environments. In this blog post, I show the steps to connect to an Autonomous Database from a third-party IDE like&nbsp;<a href="https://www.jetbrains.com/datagrip/">DataGrip</a>.</p>



<p>From a JDBC perspective, this is just an ordinary JDBC URL with some driver-specific properties. Therefore, this approach should work for any JDBC-based IDE and also for any Java application.</p>



<h2 class="wp-block-heading">Step 1 &#8211; Download the Wallet</h2>



<p>Go to your Autonomous Database and click on the &#8220;DB Connection&#8221; button. A screen similar to the following appears:</p>



<figure class="wp-block-image"><a href="https://www.salvis.com/blog/wp-content/uploads/2021/02/download-wallet.png"><img fetchpriority="high" decoding="async" width="1024" height="768" src="https://www.salvis.com/blog/wp-content/uploads/2021/02/download-wallet-1024x768.png" alt="" class="wp-image-11057" srcset="https://www.salvis.com/blog/wp-content/uploads/2021/02/download-wallet-1024x768.png 1024w, https://www.salvis.com/blog/wp-content/uploads/2021/02/download-wallet-300x225.png 300w, https://www.salvis.com/blog/wp-content/uploads/2021/02/download-wallet-768x576.png 768w, https://www.salvis.com/blog/wp-content/uploads/2021/02/download-wallet-1536x1152.png 1536w, https://www.salvis.com/blog/wp-content/uploads/2021/02/download-wallet-195x146.png 195w, https://www.salvis.com/blog/wp-content/uploads/2021/02/download-wallet-50x38.png 50w, https://www.salvis.com/blog/wp-content/uploads/2021/02/download-wallet-100x75.png 100w, https://www.salvis.com/blog/wp-content/uploads/2021/02/download-wallet-1x1.png 1w, https://www.salvis.com/blog/wp-content/uploads/2021/02/download-wallet.png 2048w" sizes="(max-width:767px) 480px, (max-width:1024px) 100vw, 1024px" /></a></figure>



<p>Press on the &#8220;Download Wallet&#8221; button and enter a password. This password is used to protect the key and the trust store. We will need it later. I named my instance &#8220;ATP21&#8221;.&nbsp;Therefore, in my case, a zip archive named &#8220;Wallet_ATP21.zip&#8221; was downloaded.</p>



<h2 class="wp-block-heading">Step 2 &#8211; Unzip the Wallet</h2>



<p>Unzip the downloaded zip file and move it to a location where want to keep it. The wallet contains the following files:</p>



<ul class="wp-block-list">
<li>README</li>



<li>ewallet.p12</li>



<li>ojdbc.properties</li>



<li>tnsnames.ora</li>



<li>cwallet.sso</li>



<li>keystore.jks</li>



<li>sqlnet.ora</li>



<li>truststore.jks</li>
</ul>



<p>Open the file &#8220;tnsnames.ora&#8221; in a text editor. It contains 5 entries. We need one of those entries to build the JDBC connection string. I highlighted the relevant part of the first entry in the next screenshot:</p>



<figure class="wp-block-image"><a href="https://www.salvis.com/blog/wp-content/uploads/2021/02/tnsnames.ora_.png"><img decoding="async" width="841" height="574" src="https://www.salvis.com/blog/wp-content/uploads/2021/02/tnsnames.ora_.png" alt="" class="wp-image-11059" srcset="https://www.salvis.com/blog/wp-content/uploads/2021/02/tnsnames.ora_.png 841w, https://www.salvis.com/blog/wp-content/uploads/2021/02/tnsnames.ora_-300x205.png 300w, https://www.salvis.com/blog/wp-content/uploads/2021/02/tnsnames.ora_-768x524.png 768w, https://www.salvis.com/blog/wp-content/uploads/2021/02/tnsnames.ora_-214x146.png 214w, https://www.salvis.com/blog/wp-content/uploads/2021/02/tnsnames.ora_-50x34.png 50w, https://www.salvis.com/blog/wp-content/uploads/2021/02/tnsnames.ora_-110x75.png 110w, https://www.salvis.com/blog/wp-content/uploads/2021/02/tnsnames.ora_-1x1.png 1w" sizes="(max-width:767px) 480px, (max-width:841px) 100vw, 841px" /></a></figure>



<h2 class="wp-block-heading"><span style="font-size: 30px;">Step 3a &#8211; Configure Connection in DataGrip (Legacy Driver)</span></h2>



<p>Add a new connection in DataGrip and select &#8220;Oracle&#8221; as shown in the following screenshot:</p>



<p><a href="https://www.salvis.com/blog/wp-content/uploads/2021/02/datagrip-datasource.png">0</a><a href="https://www.salvis.com/blog/wp-content/uploads/2021/02/datagrip-datasource.png"><img decoding="async" class="alignnone wp-image-11060" src="https://www.salvis.com/blog/wp-content/uploads/2021/02/datagrip-datasource.png" alt="" width="401" height="530" srcset="https://www.salvis.com/blog/wp-content/uploads/2021/02/datagrip-datasource.png 802w, https://www.salvis.com/blog/wp-content/uploads/2021/02/datagrip-datasource-227x300.png 227w, https://www.salvis.com/blog/wp-content/uploads/2021/02/datagrip-datasource-775x1024.png 775w, https://www.salvis.com/blog/wp-content/uploads/2021/02/datagrip-datasource-768x1015.png 768w, https://www.salvis.com/blog/wp-content/uploads/2021/02/datagrip-datasource-110x146.png 110w, https://www.salvis.com/blog/wp-content/uploads/2021/02/datagrip-datasource-38x50.png 38w, https://www.salvis.com/blog/wp-content/uploads/2021/02/datagrip-datasource-57x75.png 57w, https://www.salvis.com/blog/wp-content/uploads/2021/02/datagrip-datasource-1x1.png 1w" sizes="(max-width:767px) 401px, 401px" /></a></p>



<p>In the &#8220;General&#8221; tab change the Connection type to &#8220;URL only&#8221;. Enter the user, the password and the complete JDBC URL as shown in the next screenshot:</p>



<figure class="wp-block-image"><a href="https://www.salvis.com/blog/wp-content/uploads/2021/02/datagrip-1c.png"><img loading="lazy" decoding="async" width="1024" height="768" src="https://www.salvis.com/blog/wp-content/uploads/2021/02/datagrip-1c-1024x768.png" alt="" class="wp-image-11094" srcset="https://www.salvis.com/blog/wp-content/uploads/2021/02/datagrip-1c-1024x768.png 1024w, https://www.salvis.com/blog/wp-content/uploads/2021/02/datagrip-1c-300x225.png 300w, https://www.salvis.com/blog/wp-content/uploads/2021/02/datagrip-1c-768x576.png 768w, https://www.salvis.com/blog/wp-content/uploads/2021/02/datagrip-1c-1536x1152.png 1536w, https://www.salvis.com/blog/wp-content/uploads/2021/02/datagrip-1c-195x146.png 195w, https://www.salvis.com/blog/wp-content/uploads/2021/02/datagrip-1c-50x38.png 50w, https://www.salvis.com/blog/wp-content/uploads/2021/02/datagrip-1c-100x75.png 100w, https://www.salvis.com/blog/wp-content/uploads/2021/02/datagrip-1c-1x1.png 1w, https://www.salvis.com/blog/wp-content/uploads/2021/02/datagrip-1c.png 2048w" sizes="auto, (max-width:767px) 480px, (max-width:1024px) 100vw, 1024px" /></a></figure>



<p>The URL starts with <code>jdbc.oracle:thin:@</code>. The rest is the text I&#8217;ve highlighted in the tnsnames.ora file above.</p>



<p>Then click on the &#8220;Advanced&#8221; tab and define the following properties:</p>



<ul class="wp-block-list">
<li>javax.net.ssl.trustStore</li>



<li>javax.net.ssl.trustStorePassword</li>



<li>javax.net.ssl.keyStore</li>



<li>javax.net.ssl.keyStorePassword</li>
</ul>



<p>Here are my settings (of course you need to amend the values to match the environment of your wallet):</p>



<figure class="wp-block-image size-large"><a href="https://www.salvis.com/blog/wp-content/uploads/2021/02/datagrip-2b.png"><img loading="lazy" decoding="async" width="1024" height="768" src="https://www.salvis.com/blog/wp-content/uploads/2021/02/datagrip-2b-1024x768.png" alt="" class="wp-image-11063" srcset="https://www.salvis.com/blog/wp-content/uploads/2021/02/datagrip-2b-1024x768.png 1024w, https://www.salvis.com/blog/wp-content/uploads/2021/02/datagrip-2b-300x225.png 300w, https://www.salvis.com/blog/wp-content/uploads/2021/02/datagrip-2b-768x576.png 768w, https://www.salvis.com/blog/wp-content/uploads/2021/02/datagrip-2b-1536x1152.png 1536w, https://www.salvis.com/blog/wp-content/uploads/2021/02/datagrip-2b-195x146.png 195w, https://www.salvis.com/blog/wp-content/uploads/2021/02/datagrip-2b-50x38.png 50w, https://www.salvis.com/blog/wp-content/uploads/2021/02/datagrip-2b-100x75.png 100w, https://www.salvis.com/blog/wp-content/uploads/2021/02/datagrip-2b-1x1.png 1w, https://www.salvis.com/blog/wp-content/uploads/2021/02/datagrip-2b.png 2048w" sizes="auto, (max-width:767px) 480px, (max-width:1024px) 100vw, 1024px" /></a></figure>



<h2 class="wp-block-heading">Step 3b – Configure Connection in DataGrip (Current Driver)</h2>



<p>DataGrip automatically downloads the latest Oracle Database JDBC driver. In my case version 21.1.0.0. Since version 18.3 there is an easier way to connect. The JDBC driver can access the wallet directory and its files. As a result, you do not need to configure the java.net.ssl.* JDBC properties anymore. You just have to define one additional JDBC property “TNS_ADMIN” to define the path to the wallet directory.</p>



<p>And of course, you can pass this JDBC property directly in the JDBC URL as shown in the next screenshot:</p>



<figure class="wp-block-image size-large"><a href="https://www.salvis.com/blog/wp-content/uploads/2021/02/datagrip-latest-driver2.png"><img loading="lazy" decoding="async" width="1024" height="768" src="https://www.salvis.com/blog/wp-content/uploads/2021/02/datagrip-latest-driver2-1024x768.png" alt="" class="wp-image-11089" srcset="https://www.salvis.com/blog/wp-content/uploads/2021/02/datagrip-latest-driver2-1024x768.png 1024w, https://www.salvis.com/blog/wp-content/uploads/2021/02/datagrip-latest-driver2-300x225.png 300w, https://www.salvis.com/blog/wp-content/uploads/2021/02/datagrip-latest-driver2-768x576.png 768w, https://www.salvis.com/blog/wp-content/uploads/2021/02/datagrip-latest-driver2-1536x1152.png 1536w, https://www.salvis.com/blog/wp-content/uploads/2021/02/datagrip-latest-driver2-195x146.png 195w, https://www.salvis.com/blog/wp-content/uploads/2021/02/datagrip-latest-driver2-50x38.png 50w, https://www.salvis.com/blog/wp-content/uploads/2021/02/datagrip-latest-driver2-100x75.png 100w, https://www.salvis.com/blog/wp-content/uploads/2021/02/datagrip-latest-driver2-1x1.png 1w, https://www.salvis.com/blog/wp-content/uploads/2021/02/datagrip-latest-driver2.png 2048w" sizes="auto, (max-width:767px) 480px, (max-width:1024px) 100vw, 1024px" /></a></figure>



<h2 class="wp-block-heading">Conclusion</h2>



<p>Establishing a connection to an Autonomous Database requires a wallet. The JDBC driver needs access to this wallet. This doesn’t make things easier, but it doesn’t make them overly complicated either.</p>



<p>However, you need to deal with this additional resource regularly because the wallet has a limited lifetime. This is documented in the <code>README</code> file.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(234, 191, 191, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="Wallet Expiry Date
-----------------------
This wallet was downloaded on 2021-02-28 08:16:36.267 UTC.
The SSL certificates provided in this wallet will expire on 2023-03-19 21:43:22.0 UTC.
In order to avoid any service interruptions due to an expired SSL certificate, you must re-download the wallet before this date." style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4">Wallet Expiry Date</span></span>
<span class="line"><span style="color: #D4D4D4">-----------------------</span></span>
<span class="line"><span style="color: #D4D4D4">This wallet was downloaded on 2021-02-28 08:16:36.267 UTC.</span></span>
<span class="line cbp-line-highlight"><span style="color: #D4D4D4">The SSL certificates provided in this wallet will expire on 2023-03-19 21:43:22.0 UTC.</span></span>
<span class="line"><span style="color: #D4D4D4">In order to avoid any service interruptions due to an expired SSL certificate, you must re-download the wallet before this date.</span></span></code></pre></div>



<p>So I have to update my wallet in two years otherwise I won&#8217;t be able to connect anymore.</p>
<p>The post <a href="https://www.salvis.com/blog/2021/02/28/connecting-via-jdbc-to-the-oracle-cloud/">Connecting via JDBC to the Oracle Cloud</a> appeared first on <a href="https://www.salvis.com/blog">Philipp Salvisberg&#039;s Blog</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Always Free Autonomous JSON Database?</title>
		<link>https://www.salvis.com/blog/2020/08/14/always-free-autonomous-json-database/</link>
		
		<dc:creator><![CDATA[Philipp Salvisberg]]></dc:creator>
		<pubDate>Fri, 14 Aug 2020 19:53:54 +0000</pubDate>
				<category><![CDATA[Oracle]]></category>
		<category><![CDATA[Autonomous Database]]></category>
		<category><![CDATA[JSON]]></category>
		<category><![CDATA[SQL]]></category>
		<guid isPermaLink="false">https://www.salvis.com/blog/?p=10448</guid>

					<description><![CDATA[<p>Introduction Oracle just released the Autonomous JSON Database (AJD). This is a special version of the Autonomous Transaction Processing (ATP) database focussing on managing JSON documents via Simple Oracle Document Access (SODA) and SQL. Beda Hammerschmidt shows in this blog post how you can use SQL Developer Web to execute SODA and<span class="excerpt-hellip"> […]</span></p>
<p>The post <a href="https://www.salvis.com/blog/2020/08/14/always-free-autonomous-json-database/">Always Free Autonomous JSON Database?</a> appeared first on <a href="https://www.salvis.com/blog">Philipp Salvisberg&#039;s Blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading">Introduction</h2>



<p>Oracle just released the <a href="https://www.oracle.com/autonomous-database/autonomous-json-database/">Autonomous JSON Database (AJD)</a>. This is a special version of the Autonomous Transaction Processing (ATP) database focussing on managing JSON documents via Simple Oracle Document Access (SODA) and SQL.</p>



<p>Beda Hammerschmidt shows in <a href="https://blogs.oracle.com/jsondb/autonomous-json-database">this blog post</a> how you can use SQL Developer Web to execute SODA and SQL commands against this new Autonomous Database type. You can create a trial account and try this new offer for free. But what if you already have a cloud account and you don&#8217;t have free credits left? No problem, you can run it in your Always Free ATP database. Here&#8217;s how it works.</p>



<h2 class="wp-block-heading">Create User</h2>



<p>Connect as the <code>ADMIN</code> user and run the following commands:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">Create user with required privileges</span><span role="button" tabindex="0" data-code="CREATE USER soda IDENTIFIED BY Your_Secret_Password_42
   DEFAULT TABLESPACE data
   QUOTA UNLIMITED ON data;

GRANT CONNECT, RESOURCE, SODA_APP TO soda;

BEGIN
   ORDS.ENABLE_SCHEMA(
      p_enabled              =&gt; TRUE,
      p_schema               =&gt; 'SODA',
      p_url_mapping_type     =&gt; 'BASE_PATH',
      p_url_mapping_pattern  =&gt; 'soda',
      p_auto_rest_auth       =&gt; TRUE
   );
   COMMIT;
END;
/" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">CREATE</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">USER</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">soda</span><span style="color: #D4D4D4"> IDENTIFIED </span><span style="color: #569CD6">BY</span><span style="color: #D4D4D4"> Your_Secret_Password_42</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">DEFAULT</span><span style="color: #D4D4D4"> TABLESPACE </span><span style="color: #569CD6">data</span></span>
<span class="line"><span style="color: #D4D4D4">   QUOTA </span><span style="color: #569CD6">UNLIMITED</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">ON</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">data</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">GRANT</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">CONNECT</span><span style="color: #D4D4D4">, </span><span style="color: #569CD6">RESOURCE</span><span style="color: #D4D4D4">, SODA_APP </span><span style="color: #569CD6">TO</span><span style="color: #D4D4D4"> soda;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">BEGIN</span></span>
<span class="line"><span style="color: #D4D4D4">   ORDS.ENABLE_SCHEMA(</span></span>
<span class="line"><span style="color: #D4D4D4">      p_enabled              =&gt; TRUE,</span></span>
<span class="line"><span style="color: #D4D4D4">      p_schema               =&gt; </span><span style="color: #CE9178">&#39;SODA&#39;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">      p_url_mapping_type     =&gt; </span><span style="color: #CE9178">&#39;BASE_PATH&#39;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">      p_url_mapping_pattern  =&gt; </span><span style="color: #CE9178">&#39;soda&#39;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">      p_auto_rest_auth       =&gt; TRUE</span></span>
<span class="line"><span style="color: #D4D4D4">   );</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">COMMIT</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #569CD6">END</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">/</span></span></code></pre></div>



<p>This will create a new user <code>soda</code> with all privileges to store JSON documents via SODA and to connect via SQL Developer Web.</p>



<h2 class="wp-block-heading">Run SQL Developer Web</h2>



<p>Navigate to the tools page within your Always Free ATP database and click on the &#8220;Open SQL Developer Web&#8221; button.</p>



<figure class="wp-block-image"><a href="https://www.salvis.com/blog/wp-content/uploads/2020/08/atp_tools.png"><img loading="lazy" decoding="async" width="1280" height="641" src="https://www.salvis.com/blog/wp-content/uploads/2020/08/atp_tools.png" alt="" class="wp-image-10451" srcset="https://www.salvis.com/blog/wp-content/uploads/2020/08/atp_tools.png 1280w, https://www.salvis.com/blog/wp-content/uploads/2020/08/atp_tools-300x150.png 300w, https://www.salvis.com/blog/wp-content/uploads/2020/08/atp_tools-1024x513.png 1024w, https://www.salvis.com/blog/wp-content/uploads/2020/08/atp_tools-768x385.png 768w, https://www.salvis.com/blog/wp-content/uploads/2020/08/atp_tools-260x130.png 260w, https://www.salvis.com/blog/wp-content/uploads/2020/08/atp_tools-50x25.png 50w, https://www.salvis.com/blog/wp-content/uploads/2020/08/atp_tools-150x75.png 150w, https://www.salvis.com/blog/wp-content/uploads/2020/08/atp_tools-1x1.png 1w" sizes="auto, (max-width:767px) 480px, (max-width:1280px) 100vw, 1280px" /></a></figure>



<p>This will open an URL similar to</p>



<p><code>https://...adb.eu-frankfurt-1.oraclecloudapps.com/ords/<span style="color: #ff0000;"><strong>admin</strong></span>/_sdw/?nav=worksheet</code> .</p>



<p>Change the last part of the URL to <code>/ords/<strong><span style="color: #ff0000;">soda</span></strong>/_sdw</code> in the address bar of your browser und press enter.</p>



<figure class="wp-block-image"><a href="https://www.salvis.com/blog/wp-content/uploads/2020/08/soda_login-1.png"><img loading="lazy" decoding="async" width="1091" height="470" src="https://www.salvis.com/blog/wp-content/uploads/2020/08/soda_login-1.png" alt="" class="wp-image-10458" srcset="https://www.salvis.com/blog/wp-content/uploads/2020/08/soda_login-1.png 1091w, https://www.salvis.com/blog/wp-content/uploads/2020/08/soda_login-1-300x129.png 300w, https://www.salvis.com/blog/wp-content/uploads/2020/08/soda_login-1-1024x441.png 1024w, https://www.salvis.com/blog/wp-content/uploads/2020/08/soda_login-1-768x331.png 768w, https://www.salvis.com/blog/wp-content/uploads/2020/08/soda_login-1-260x112.png 260w, https://www.salvis.com/blog/wp-content/uploads/2020/08/soda_login-1-50x22.png 50w, https://www.salvis.com/blog/wp-content/uploads/2020/08/soda_login-1-150x65.png 150w" sizes="auto, (max-width:767px) 480px, (max-width:1091px) 100vw, 1091px" /></a></figure>



<p>Sign in as <code>soda</code> and change to the worksheet. Now you can try Beda&#8217;s examples yourself.</p>



<figure class="wp-block-image"><a href="https://www.salvis.com/blog/wp-content/uploads/2020/08/bedas_examples.png"><img loading="lazy" decoding="async" width="1600" height="845" src="https://www.salvis.com/blog/wp-content/uploads/2020/08/bedas_examples.png" alt="" class="wp-image-10455" srcset="https://www.salvis.com/blog/wp-content/uploads/2020/08/bedas_examples.png 1600w, https://www.salvis.com/blog/wp-content/uploads/2020/08/bedas_examples-300x158.png 300w, https://www.salvis.com/blog/wp-content/uploads/2020/08/bedas_examples-1024x541.png 1024w, https://www.salvis.com/blog/wp-content/uploads/2020/08/bedas_examples-768x406.png 768w, https://www.salvis.com/blog/wp-content/uploads/2020/08/bedas_examples-1536x811.png 1536w, https://www.salvis.com/blog/wp-content/uploads/2020/08/bedas_examples-260x137.png 260w, https://www.salvis.com/blog/wp-content/uploads/2020/08/bedas_examples-50x26.png 50w, https://www.salvis.com/blog/wp-content/uploads/2020/08/bedas_examples-142x75.png 142w, https://www.salvis.com/blog/wp-content/uploads/2020/08/bedas_examples-1x1.png 1w" sizes="auto, (max-width:767px) 480px, (max-width:1600px) 100vw, 1600px" /></a></figure>



<p>This is not an Always Free Autonomous JSON Database. However, you should now have everything you need to become familiar with many features of an Autonomous JSON Database. For free.</p>
<p>The post <a href="https://www.salvis.com/blog/2020/08/14/always-free-autonomous-json-database/">Always Free Autonomous JSON Database?</a> appeared first on <a href="https://www.salvis.com/blog">Philipp Salvisberg&#039;s Blog</a>.</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
