{"id":8527,"date":"2018-07-18T19:52:54","date_gmt":"2018-07-18T17:52:54","guid":{"rendered":"https:\/\/www.salvis.com\/blog\/?p=8527"},"modified":"2023-11-08T02:36:10","modified_gmt":"2023-11-08T01:36:10","slug":"is-your-application-smartdb","status":"publish","type":"post","link":"https:\/\/www.salvis.com\/blog\/2018\/07\/18\/is-your-application-smartdb\/","title":{"rendered":"Is Your Application SmartDB?"},"content":{"rendered":"\n<p>I recently had a few discussions regarding the Smart Database Paradigm (SmartDB) with long-standing customers, new customers, partners, competitors and colleagues. Some people think that using APEX and PL\/SQL in their database application is SmartDB. But it is not that simple.&nbsp;Bryn Llewelyn defined the term &#8220;Smart Database Paradigm&#8221; (SmartDB) in his talk&nbsp;<a href=\"https:\/\/community.oracle.com\/servlet\/JiveServlet\/previewBody\/1018915-102-1-164853\/Guarding_Your_Data_Behind_a_Hard_Shell_Plsql_API.pdf\">Guarding your data behind a hard shell PL\/SQL API<\/a>. Based on his definition a SmartDB application must have the following five properties:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><a href=\"#property_1\">The connect user does not own database objects<\/a><\/li>\n\n\n\n<li><a href=\"#property_2\">The connect user can execute PL\/SQL API units only<\/a><\/li>\n\n\n\n<li><a href=\"#property_3\">PL\/SQL API units handle transactions<\/a><\/li>\n\n\n\n<li><a href=\"#property_4\">SQL statements are written by human hand<\/a><\/li>\n\n\n\n<li><a href=\"#property_5\">SQL statements exploit the full power of set-based SQL<\/a><\/li>\n<\/ol>\n\n\n\n<p>These five properties are not a set of recommendations. They are the bare minimum. Either your application has these properties or not. It&#8217;s binary. There is (almost) no room for interpretation. Here&#8217;s an excerpt of a longer Twitter thread, making my and especially Bryn Llewelyn&#8217;s view a bit clearer.<\/p>\n\n\n<div class=\"jq-tabs tabs_wrapper tabs_horizontal\"><ul><li><a href=\"#tab-69d6620266823-1\">My tweet<\/a><\/li><li><a href=\"#tab-69d6620266823-2\">Bryn's answer 1\/3<\/a><\/li><li><a href=\"#tab-69d6620266823-3\">Bryn's answer 2\/3<\/a><\/li><li><a href=\"#tab-69d6620266823-4\">Bryn's answer 3\/3<\/a><\/li><\/ul><div id=\"tab-69d6620266823-1\" ><\/p>\n<p><a href=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2018\/07\/smartdb_twitter_1.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-8555\" src=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2018\/07\/smartdb_twitter_1.png\" alt=\"\" width=\"452\" height=\"350\" srcset=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2018\/07\/smartdb_twitter_1.png 602w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2018\/07\/smartdb_twitter_1-300x232.png 300w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2018\/07\/smartdb_twitter_1-189x146.png 189w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2018\/07\/smartdb_twitter_1-50x39.png 50w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2018\/07\/smartdb_twitter_1-97x75.png 97w\" sizes=\"auto, (max-width:767px) 452px, 452px\" \/><\/a><\/p>\n<p><\/div><div id=\"tab-69d6620266823-2\" ><\/p>\n<p><a href=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2018\/07\/smartdb_twitter_2.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-8556\" src=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2018\/07\/smartdb_twitter_2.png\" alt=\"\" width=\"449\" height=\"448\" srcset=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2018\/07\/smartdb_twitter_2.png 599w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2018\/07\/smartdb_twitter_2-150x150.png 150w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2018\/07\/smartdb_twitter_2-300x300.png 300w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2018\/07\/smartdb_twitter_2-146x146.png 146w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2018\/07\/smartdb_twitter_2-50x50.png 50w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2018\/07\/smartdb_twitter_2-75x75.png 75w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2018\/07\/smartdb_twitter_2-85x85.png 85w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2018\/07\/smartdb_twitter_2-80x80.png 80w\" sizes=\"auto, (max-width:767px) 449px, 449px\" \/><\/a><\/p>\n<p><\/div><div id=\"tab-69d6620266823-3\" ><\/p>\n<p><a href=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2018\/07\/smartdb_twitter_3.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-8557\" src=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2018\/07\/smartdb_twitter_3.png\" alt=\"\" width=\"452\" height=\"188\" srcset=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2018\/07\/smartdb_twitter_3.png 602w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2018\/07\/smartdb_twitter_3-300x125.png 300w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2018\/07\/smartdb_twitter_3-260x108.png 260w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2018\/07\/smartdb_twitter_3-50x21.png 50w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2018\/07\/smartdb_twitter_3-150x63.png 150w\" sizes=\"auto, (max-width:767px) 452px, 452px\" \/><\/a><\/p>\n<p><\/div><div id=\"tab-69d6620266823-4\" ><\/p>\n<p><a href=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2018\/07\/smartdb_twitter_4.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-8558\" src=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2018\/07\/smartdb_twitter_4.png\" alt=\"\" width=\"448\" height=\"618\" srcset=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2018\/07\/smartdb_twitter_4.png 597w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2018\/07\/smartdb_twitter_4-217x300.png 217w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2018\/07\/smartdb_twitter_4-106x146.png 106w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2018\/07\/smartdb_twitter_4-36x50.png 36w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2018\/07\/smartdb_twitter_4-54x75.png 54w\" sizes=\"auto, (max-width:767px) 448px, 448px\" \/><\/a><\/p>\n<p><\/div><\/div>\n\n\n\n<p>In this blog post I show how to check the compliance with the first three SmartDB properties by querying the Oracle data dictionary. The remaining two SmartDB properties have to be evaluated manually using reviews. The goal is to show that some of these properties are easily not followed (for good reasons) and that makes your database-centric application something else than SmartDB (but not necessarily a <a href=\"https:\/\/en.wikipedia.org\/wiki\/Curate%27s_egg\">curate&#8217;s egg<\/a>).<\/p>\n\n\n\n<p>In <a href=\"https:\/\/www.salvis.com\/blog\/2017\/12\/17\/how-to-prove-that-your-smartdb-app-is-secured-against-sql-injection-attacks\/\">How to Prove That Your SmartDB App Is Secure<\/a>&nbsp;I&#8217;ve crafted a good, a bad and an ugly demo application. I installed these applications using <a href=\"https:\/\/gist.github.com\/PhilippSalvisberg\/052b1321b0207bd71f1f1b44eb03a8fc#file-install_demo_apps-sql\">this script<\/a>&nbsp;in my Oracle Database 18c instance.<\/p>\n\n\n\n<p>The anonymous PL\/SQL block and the SQL queries in this blog post require DBA privileges. The required minimum database version is mentioned in the title of the code block, e.g. (&gt;=9.2), (&gt;=12.1) or (&gt;=12.2).<\/p>\n\n\n\n<p>Now let&#8217;s look at the five SmartDB properties.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><a name=\"property_1\"><\/a>1. The connect user does not own database objects<\/h2>\n\n\n\n<p>The connect user is used by application components outside of the database to interact with the database. It is configured for example in the connection pool of the middle-tier application.<\/p>\n\n\n\n<p>The connect user must access only the APIs of the underlying database applications and therefore does not need own database objects.<\/p>\n\n\n\n<p>Checking the compliance of this property is simple.<\/p>\n\n\n\n<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\">Check SmartDB property 1: query (>=9.2)<\/span><span role=\"button\" tabindex=\"0\" data-code=\"SELECT username\n  FROM dba_users\n WHERE username NOT IN (\n         SELECT owner\n           FROM dba_objects\n       )\n ORDER BY username;\" 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\"> username<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> dba_users<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">WHERE<\/span><span style=\"color: #D4D4D4\"> username <\/span><span style=\"color: #569CD6\">NOT<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">IN<\/span><span style=\"color: #D4D4D4\"> (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">         <\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">owner<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">           <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> dba_objects<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">ORDER BY<\/span><span style=\"color: #D4D4D4\"> username;<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<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\">Check SmartDB property 1: result (complying connect users)<\/span><span role=\"button\" tabindex=\"0\" data-code=\"USERNAME                \n------------------------\nANONYMOUS\nAPEX_INSTANCE_ADMIN_USER\nAPEX_PUBLIC_USER\nAPEX_REST_PUBLIC_USER\nDIP\nGGSYS\nGSMCATUSER\nGSMUSER\nMDDATA\nORDS_PUBLIC_USER\nSYS$UMF\nSYSBACKUP\nSYSDG\nSYSKM\nSYSRAC\nTHE_BAD_USER\nTHE_GOOD_USER\nTHE_UGLY_USER\nXS$NULL\n\n19 rows selected.\" 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\">USERNAME                <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">------------------------<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">ANONYMOUS<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">APEX_INSTANCE_ADMIN_USER<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">APEX_PUBLIC_USER<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">APEX_REST_PUBLIC_USER<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">DIP<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">GGSYS<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">GSMCATUSER<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">GSMUSER<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">MDDATA<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">ORDS_PUBLIC_USER<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">SYS$UMF<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">SYSBACKUP<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">SYSDG<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">SYSKM<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">SYSRAC<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">THE_BAD_USER<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">THE_GOOD_USER<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">THE_UGLY_USER<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">XS$NULL<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"><\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">19 rows selected.<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>If you are using a connect user that is not listed as a result, then your application is not SmartDB.<\/p>\n\n\n\n<p>The result contains also users that do not have the <code>CREATE SESSION<\/code> privilege and therefore cannot be used as connect users. The queries to check SmartDB properties 2 and 3 will address this issue.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><a name=\"property_2\"><\/a>2. The connect user can execute PL\/SQL API units only<\/h2>\n\n\n\n<p>Database views and tables are guarded behind a hard shell PL\/SQL API. Only the following database objects may be part of the API:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Packages<\/li>\n\n\n\n<li>Types<\/li>\n\n\n\n<li>Functions<\/li>\n\n\n\n<li>Procedures<\/li>\n<\/ul>\n\n\n\n<p>So we just have to check if the connect user has access to objects with the predicate <code>object_type NOT IN ('PACKAGE', 'TYPE', 'FUNCTION', 'PROCEDURE')<\/code>, right? Yes, but the result would not be helpful. Why? Because every user with just the <code>CREATE SESSION<\/code> privilege has access to some thousand tables and views via the <code>PUBLIC<\/code> role. For example <code>DUAL<\/code>, <code>ALL_VIEWS<\/code> or&nbsp;<code>NLS_SESSION_PARAMETERS<\/code>. Strictly speaking, it is not possible to create an Oracle user that can execute PL\/SQL units only. Some might argue that this alone makes SmartDB applications a fantasy. However, I&#8217;m not in that camp. I think we just have to&nbsp;focus on our own objects and exclude all Oracle-maintained users along with some common utility users from the analysis.<\/p>\n\n\n\n<p>Furthermore,&nbsp;the connect user should only have the <code>CONNECT<\/code> role (no more and no less). This way we ensure\/know that no access is granted to internal objects via <code>ANY<\/code> privileges.<\/p>\n\n\n\n<p>For this check, we can reuse the query for rule 1 from my previous blog post <a href=\"https:\/\/www.salvis.com\/blog\/2017\/12\/17\/how-to-prove-that-your-smartdb-app-is-secured-against-sql-injection-attacks\/\">How to Prove That Your SmartDB App Is Secure<\/a>.<\/p>\n\n\n<div class=\"accordion\"><div class=\"mfn-acc accordion_wrapper  toggle\"><br \/>\n<div class=\"question\"><div class=\"title\"><i class=\"icon-plus acc-icon-plus\" aria-hidden=\"true\"><\/i><i class=\"icon-minus acc-icon-minus\" aria-hidden=\"true\"><\/i>Query to check SmartDB property 2<\/div><div class=\"answer\"><\/p>\n\n\n\n<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(3 * 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\">Check SmartDB property 2: query (>=12.1)<\/span><span role=\"button\" tabindex=\"0\" data-code=\"WITH\n   -- roles as recursive structure\n   role_base AS (\n      -- roles without parent (=roots)\n      SELECT r.role, NULL AS parent_role\n        FROM dba_roles r\n       WHERE r.role NOT IN (\n                SELECT p.granted_role\n                  FROM role_role_privs p\n             )\n      UNION ALL\n      -- roles with parent (=children)\n      SELECT granted_role AS role, role AS parent_role\n        FROM role_role_privs\n   ),\n   -- roles tree, calculate role_path for every hierarchy level\n   role_tree AS (\n      SELECT role,\n             parent_role,\n             sys_connect_by_path(ROLE, '\/') AS role_path\n        FROM role_base\n      CONNECT BY PRIOR role = parent_role\n   ),\n   -- roles graph, child added to all ancestors including self\n   -- allows simple join to parent_role to find all descendants\n   role_graph AS (\n      SELECT DISTINCT\n             role,\n             regexp_substr(role_path, '(\/)(\\w+)', 1, 1, 'i', 2) AS parent_role\n        FROM role_tree\n   ),\n   -- application users in scope of the analysis\n   -- other users are treated as if they were not installed\n   app_user AS (\n      SELECT username\n        FROM dba_users\n       WHERE oracle_maintained = 'N' -- SYS, SYSTEM, SYSAUX, ...\n         AND username NOT IN ('FTLDB', 'PLSCOPE', 'UT3')\n   ),\n   -- user system privileges\n   sys_priv AS (\n      -- system privileges granted directly to users\n      SELECT u.username, p.privilege\n        FROM dba_sys_privs p\n        JOIN app_user u ON u.username = p.grantee\n      UNION\n      -- system privileges granted directly to PUBLIC\n      SELECT u.username, p.privilege\n        FROM dba_sys_privs p\n       CROSS JOIN app_user u\n       WHERE p.grantee = 'PUBLIC'\n         AND p.privilege NOT IN (\n                SELECT r.role\n                  FROM dba_roles r\n             )\n      UNION\n      -- system privileges granted to users via roles\n      SELECT u.username, p.privilege\n        FROM dba_role_privs r\n        JOIN app_user u ON u.username = r.grantee\n        JOIN role_graph g ON g.parent_role = r.granted_role\n        JOIN dba_sys_privs p ON p.grantee = g.role\n      UNION\n      -- system privileges granted to PUBLIC via roles\n      SELECT u.username, p.privilege\n        FROM dba_role_privs r\n        JOIN role_graph g ON g.parent_role = r.granted_role\n        JOIN dba_sys_privs p ON p.grantee = g.role\n        CROSS JOIN app_user u\n       WHERE r.grantee = 'PUBLIC'\n   ),\n   -- user object privileges\n   obj_priv AS (\n      -- objects granted directly to users\n      SELECT u.username, p.owner, p.type AS object_type, p.table_name AS object_name\n        FROM dba_tab_privs p\n        JOIN app_user u ON u.username = p.grantee\n       WHERE p.owner IN (\n                SELECT u2.username\n                  FROM app_user u2\n             )\n      UNION\n      -- objects granted to users via roles\n      SELECT u.username, p.owner, p.type AS object_type, p.table_name AS object_name\n        FROM dba_role_privs r\n        JOIN app_user u ON u.username = r.grantee\n        JOIN role_graph g ON g.parent_role = r.granted_role\n        JOIN dba_tab_privs p ON p.grantee = g.role\n       WHERE p.owner IN (\n                SELECT u2.username\n                  FROM app_user u2\n             )\n      -- objects granted to PUBLIC\n      UNION\n      SELECT u.username, p.owner, p.type AS object_type, p.table_name AS object_name\n        FROM dba_tab_privs p\n       CROSS JOIN app_user u\n       WHERE p.owner IN (\n                SELECT u2.username\n                  FROM app_user u2\n             )\n         AND p.grantee = 'PUBLIC'\n   ),\n   -- issues if user is configured in the connection pool of a middle tier\n   issues AS (\n      -- privileges not part of CONNECT role\n      SELECT username,\n             'SYS' AS owner,\n             'PRIVILEGE' AS object_type,\n             privilege AS object_name,\n             'Privilege is not part of the CONNECT role' AS issue\n        FROM sys_priv\n       WHERE privilege NOT IN ('CREATE SESSION', 'SET CONTAINER')\n      -- access to non PL\/SQL units\n      UNION ALL\n      SELECT username,\n             owner,\n             object_type,\n             object_name,\n             'Access to non-PL\/SQL unit'\n        FROM obj_priv\n       WHERE object_type NOT IN ('PACKAGE', 'TYPE', 'FUNCTION', 'PROCEDURE')\n      -- own objects\n      UNION ALL\n      SELECT u.username,\n             o.owner,\n             o.object_type,\n             o.object_name,\n             'Connect user must not own any object'\n        FROM app_user u\n        JOIN dba_objects o ON o.owner = u.username\n      -- missing CREATE SESSION privilege\n      UNION ALL\n      SELECT u.username,\n             'SYS',\n             'PRIVILEGE',\n             'CREATE SESSION',\n             'Privilege is missing, but required'\n        FROM app_user u\n       WHERE u.username NOT IN (\n                SELECT username\n                  FROM sys_priv\n                 WHERE privilege = 'CREATE SESSION' \n             )\n   ),\n   -- aggregate issues per user\n   issue_aggr AS (\n      SELECT u.username, COUNT(i.username) issue_count\n        FROM app_user u\n        LEFT JOIN issues i ON i.username = u.username\n       GROUP BY u.username\n   ),\n   -- user summary (calculate is_smartdb_property_2_met)\n   summary AS (\n      SELECT username,\n             CASE\n                WHEN issue_count = 0 THEN\n                   'YES'\n                ELSE\n                   'NO'\n             END AS is_smartdb_property_2_met,\n             issue_count\n        FROM issue_aggr\n       ORDER BY is_smartdb_property_2_met DESC, username\n   )\n-- main\nSELECT * \n  FROM summary\n WHERE issue_count = 0;\" 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\">WITH<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #6A9955\">-- roles as recursive structure<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   role_base <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #6A9955\">-- roles without parent (=roots)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> r.role, <\/span><span style=\"color: #569CD6\">NULL<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> parent_role<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> dba_roles r<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       <\/span><span style=\"color: #569CD6\">WHERE<\/span><span style=\"color: #D4D4D4\"> r.role <\/span><span style=\"color: #569CD6\">NOT<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">IN<\/span><span style=\"color: #D4D4D4\"> (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                <\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> p.granted_role<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                  <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> role_role_privs p<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">UNION ALL<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #6A9955\">-- roles with parent (=children)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> granted_role <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">role<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #569CD6\">role<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> parent_role<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> role_role_privs<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   ),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #6A9955\">-- roles tree, calculate role_path for every hierarchy level<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   role_tree <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">role<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             parent_role,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             sys_connect_by_path(<\/span><span style=\"color: #569CD6\">ROLE<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#39;\/&#39;<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> role_path<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> role_base<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><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\">PRIOR<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">role<\/span><span style=\"color: #D4D4D4\"> = parent_role<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   ),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #6A9955\">-- roles graph, child added to all ancestors including self<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #6A9955\">-- allows simple join to parent_role to find all descendants<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   role_graph <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">SELECT DISTINCT<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             <\/span><span style=\"color: #569CD6\">role<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             regexp_substr(role_path, <\/span><span style=\"color: #CE9178\">&#39;(\/)(\\w+)&#39;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#39;i&#39;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">2<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> parent_role<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> role_tree<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   ),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #6A9955\">-- application users in scope of the analysis<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #6A9955\">-- other users are treated as if they were not installed<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">   app_user <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> (<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> username<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> dba_users<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">       <\/span><span style=\"color: #569CD6\">WHERE<\/span><span style=\"color: #D4D4D4\"> oracle_maintained = <\/span><span style=\"color: #CE9178\">&#39;N&#39;<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #6A9955\">-- SYS, SYSTEM, SYSAUX, ...<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">         <\/span><span style=\"color: #569CD6\">AND<\/span><span style=\"color: #D4D4D4\"> username <\/span><span style=\"color: #569CD6\">NOT<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">IN<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #CE9178\">&#39;FTLDB&#39;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#39;PLSCOPE&#39;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#39;UT3&#39;<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">   ),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #6A9955\">-- user system privileges<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   sys_priv <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #6A9955\">-- system privileges granted directly to users<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> u.username, p.privilege<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> dba_sys_privs p<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">JOIN<\/span><span style=\"color: #D4D4D4\"> app_user u <\/span><span style=\"color: #569CD6\">ON<\/span><span style=\"color: #D4D4D4\"> u.username = p.grantee<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">UNION<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #6A9955\">-- system privileges granted directly to PUBLIC<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> u.username, p.privilege<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> dba_sys_privs p<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       <\/span><span style=\"color: #569CD6\">CROSS JOIN<\/span><span style=\"color: #D4D4D4\"> app_user u<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       <\/span><span style=\"color: #569CD6\">WHERE<\/span><span style=\"color: #D4D4D4\"> p.grantee = <\/span><span style=\"color: #CE9178\">&#39;PUBLIC&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">         <\/span><span style=\"color: #569CD6\">AND<\/span><span style=\"color: #D4D4D4\"> p.privilege <\/span><span style=\"color: #569CD6\">NOT<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">IN<\/span><span style=\"color: #D4D4D4\"> (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                <\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> r.role<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                  <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> dba_roles r<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">UNION<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #6A9955\">-- system privileges granted to users via roles<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> u.username, p.privilege<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> dba_role_privs r<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">JOIN<\/span><span style=\"color: #D4D4D4\"> app_user u <\/span><span style=\"color: #569CD6\">ON<\/span><span style=\"color: #D4D4D4\"> u.username = r.grantee<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">JOIN<\/span><span style=\"color: #D4D4D4\"> role_graph g <\/span><span style=\"color: #569CD6\">ON<\/span><span style=\"color: #D4D4D4\"> g.parent_role = r.granted_role<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">JOIN<\/span><span style=\"color: #D4D4D4\"> dba_sys_privs p <\/span><span style=\"color: #569CD6\">ON<\/span><span style=\"color: #D4D4D4\"> p.grantee = g.role<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">UNION<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #6A9955\">-- system privileges granted to PUBLIC via roles<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> u.username, p.privilege<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> dba_role_privs r<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">JOIN<\/span><span style=\"color: #D4D4D4\"> role_graph g <\/span><span style=\"color: #569CD6\">ON<\/span><span style=\"color: #D4D4D4\"> g.parent_role = r.granted_role<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">JOIN<\/span><span style=\"color: #D4D4D4\"> dba_sys_privs p <\/span><span style=\"color: #569CD6\">ON<\/span><span style=\"color: #D4D4D4\"> p.grantee = g.role<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">CROSS JOIN<\/span><span style=\"color: #D4D4D4\"> app_user u<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       <\/span><span style=\"color: #569CD6\">WHERE<\/span><span style=\"color: #D4D4D4\"> r.grantee = <\/span><span style=\"color: #CE9178\">&#39;PUBLIC&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   ),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #6A9955\">-- user object privileges<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   obj_priv <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #6A9955\">-- objects granted directly to users<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> u.username, p.owner, p.type <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> object_type, p.table_name <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> object_name<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> dba_tab_privs p<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">JOIN<\/span><span style=\"color: #D4D4D4\"> app_user u <\/span><span style=\"color: #569CD6\">ON<\/span><span style=\"color: #D4D4D4\"> u.username = p.grantee<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       <\/span><span style=\"color: #569CD6\">WHERE<\/span><span style=\"color: #D4D4D4\"> p.owner <\/span><span style=\"color: #569CD6\">IN<\/span><span style=\"color: #D4D4D4\"> (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                <\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> u2.username<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                  <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> app_user u2<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">UNION<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #6A9955\">-- objects granted to users via roles<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> u.username, p.owner, p.type <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> object_type, p.table_name <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> object_name<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> dba_role_privs r<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">JOIN<\/span><span style=\"color: #D4D4D4\"> app_user u <\/span><span style=\"color: #569CD6\">ON<\/span><span style=\"color: #D4D4D4\"> u.username = r.grantee<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">JOIN<\/span><span style=\"color: #D4D4D4\"> role_graph g <\/span><span style=\"color: #569CD6\">ON<\/span><span style=\"color: #D4D4D4\"> g.parent_role = r.granted_role<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">JOIN<\/span><span style=\"color: #D4D4D4\"> dba_tab_privs p <\/span><span style=\"color: #569CD6\">ON<\/span><span style=\"color: #D4D4D4\"> p.grantee = g.role<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       <\/span><span style=\"color: #569CD6\">WHERE<\/span><span style=\"color: #D4D4D4\"> p.owner <\/span><span style=\"color: #569CD6\">IN<\/span><span style=\"color: #D4D4D4\"> (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                <\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> u2.username<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                  <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> app_user u2<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #6A9955\">-- objects granted to PUBLIC<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">UNION<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> u.username, p.owner, p.type <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> object_type, p.table_name <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> object_name<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> dba_tab_privs p<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       <\/span><span style=\"color: #569CD6\">CROSS JOIN<\/span><span style=\"color: #D4D4D4\"> app_user u<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       <\/span><span style=\"color: #569CD6\">WHERE<\/span><span style=\"color: #D4D4D4\"> p.owner <\/span><span style=\"color: #569CD6\">IN<\/span><span style=\"color: #D4D4D4\"> (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                <\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> u2.username<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                  <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> app_user u2<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">         <\/span><span style=\"color: #569CD6\">AND<\/span><span style=\"color: #D4D4D4\"> p.grantee = <\/span><span style=\"color: #CE9178\">&#39;PUBLIC&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   ),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #6A9955\">-- issues if user is configured in the connection pool of a middle tier<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   issues <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #6A9955\">-- privileges not part of CONNECT role<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> username,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             <\/span><span style=\"color: #CE9178\">&#39;SYS&#39;<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">owner<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             <\/span><span style=\"color: #CE9178\">&#39;PRIVILEGE&#39;<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> object_type,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             privilege <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> object_name,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             <\/span><span style=\"color: #CE9178\">&#39;Privilege is not part of the CONNECT role&#39;<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> issue<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> sys_priv<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       <\/span><span style=\"color: #569CD6\">WHERE<\/span><span style=\"color: #D4D4D4\"> privilege <\/span><span style=\"color: #569CD6\">NOT<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">IN<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #CE9178\">&#39;CREATE SESSION&#39;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#39;SET CONTAINER&#39;<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #6A9955\">-- access to non PL\/SQL units<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">UNION ALL<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> username,<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">             <\/span><span style=\"color: #569CD6\">owner<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">             object_type,<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">             object_name,<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">             <\/span><span style=\"color: #CE9178\">&#39;Access to non-PL\/SQL unit&#39;<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> obj_priv<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">       <\/span><span style=\"color: #569CD6\">WHERE<\/span><span style=\"color: #D4D4D4\"> object_type <\/span><span style=\"color: #569CD6\">NOT<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">IN<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #CE9178\">&#39;PACKAGE&#39;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#39;TYPE&#39;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#39;FUNCTION&#39;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#39;PROCEDURE&#39;<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #6A9955\">-- own objects<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">UNION ALL<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> u.username,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             o.owner,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             o.object_type,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             o.object_name,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             <\/span><span style=\"color: #CE9178\">&#39;Connect user must not own any object&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> app_user u<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">JOIN<\/span><span style=\"color: #D4D4D4\"> dba_objects o <\/span><span style=\"color: #569CD6\">ON<\/span><span style=\"color: #D4D4D4\"> o.owner = u.username<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #6A9955\">-- missing CREATE SESSION privilege<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">UNION ALL<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> u.username,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             <\/span><span style=\"color: #CE9178\">&#39;SYS&#39;<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             <\/span><span style=\"color: #CE9178\">&#39;PRIVILEGE&#39;<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             <\/span><span style=\"color: #CE9178\">&#39;CREATE SESSION&#39;<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             <\/span><span style=\"color: #CE9178\">&#39;Privilege is missing, but required&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> app_user u<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       <\/span><span style=\"color: #569CD6\">WHERE<\/span><span style=\"color: #D4D4D4\"> u.username <\/span><span style=\"color: #569CD6\">NOT<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">IN<\/span><span style=\"color: #D4D4D4\"> (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                <\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> username<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                  <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> sys_priv<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                 <\/span><span style=\"color: #569CD6\">WHERE<\/span><span style=\"color: #D4D4D4\"> privilege = <\/span><span style=\"color: #CE9178\">&#39;CREATE SESSION&#39;<\/span><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   ),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #6A9955\">-- aggregate issues per user<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   issue_aggr <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> u.username, <\/span><span style=\"color: #DCDCAA\">COUNT<\/span><span style=\"color: #D4D4D4\">(i.username) issue_count<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> app_user u<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">LEFT JOIN<\/span><span style=\"color: #D4D4D4\"> issues i <\/span><span style=\"color: #569CD6\">ON<\/span><span style=\"color: #D4D4D4\"> i.username = u.username<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       <\/span><span style=\"color: #569CD6\">GROUP BY<\/span><span style=\"color: #D4D4D4\"> u.username<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   ),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #6A9955\">-- user summary (calculate is_smartdb_property_2_met)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   summary <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> username,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             <\/span><span style=\"color: #569CD6\">CASE<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                <\/span><span style=\"color: #569CD6\">WHEN<\/span><span style=\"color: #D4D4D4\"> issue_count = <\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">THEN<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                   <\/span><span style=\"color: #CE9178\">&#39;YES&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                <\/span><span style=\"color: #569CD6\">ELSE<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                   <\/span><span style=\"color: #CE9178\">&#39;NO&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             <\/span><span style=\"color: #569CD6\">END<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> is_smartdb_property_2_met,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             issue_count<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> issue_aggr<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       <\/span><span style=\"color: #569CD6\">ORDER BY<\/span><span style=\"color: #D4D4D4\"> is_smartdb_property_2_met <\/span><span style=\"color: #569CD6\">DESC<\/span><span style=\"color: #D4D4D4\">, username<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">-- main<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> * <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> summary<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">WHERE<\/span><span style=\"color: #D4D4D4\"> issue_count = <\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span><\/code><\/pre><\/div>\n\n\n<p><\/div><\/div>\n<br \/>\n<\/div><\/div>\n\n\n\n\n<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\">Check SmartDB property 2: result (complying connect users)<\/span><span role=\"button\" tabindex=\"0\" data-code=\"USERNAME                 IS_SMARTDB_PROPERTY_2_MET ISSUE_COUNT\n------------------------ ------------------------- -----------\nAPEX_REST_PUBLIC_USER    YES                                 0\nTHE_BAD_USER             YES                                 0\nTHE_GOOD_USER            YES                                 0\" 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\">USERNAME                 IS_SMARTDB_PROPERTY_2_MET ISSUE_COUNT<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">------------------------ ------------------------- -----------<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">APEX_REST_PUBLIC_USER    YES                                 0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">THE_BAD_USER             YES                                 0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">THE_GOOD_USER            YES                                 0<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>If you are using a connect user that is not listed as a result, then your application is not SmartDB.<\/p>\n\n\n\n<p>In this case, the <code>APEX_REST_PUBLIC_USER<\/code> is a false positive. The named subquery&nbsp; <code>app_user<\/code> excludes the&nbsp;<code>APEX_180100<\/code> user which grants various views and sequences to <code>PUBLIC<\/code>. Hence APEX 18.1 is not a SmartDB application.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><a name=\"property_3\"><\/a>3. PL\/SQL API units handle transactions<\/h2>\n\n\n\n<p>A SmartDB application holds the complete business logic in the database. A PL\/SQL API call handles a transaction completely. The API must not contain units for partial transaction work. Such units may exist, but must not be part of the PL\/SQL API exposed to the connect user.<\/p>\n\n\n\n<p>For write operations a&nbsp;<code>COMMIT<\/code> is called on success and a <code>ROLLBACK<\/code> is called on failure at the end of the operation.<\/p>\n\n\n\n<p>For read operations, the PL\/SQL API is responsible for the read consistency.<\/p>\n\n\n\n<p>Distributed transactions are supported via&nbsp;database links only. Other data sources cannot participate in the same database transaction. If this is a mandatory requirement, then SmartDB is the wrong approach. However, Oracle AQ can be a good alternative to propagate data consistently in upstream or downstream transactions.<\/p>\n\n\n\n<p>To check if an application has this SmartDB property, we have to do something like this:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Find all PL\/SQL API units (as we&#8217;ve done for the <a href=\"#property_2\">SmartDB property 2<\/a>).<\/li>\n\n\n\n<li>Produce a call tree for PL\/SQL API units. On the object level, this could be achieved by querying <code>DBA_DEPENDENCIES<\/code>. For a more accurate result on the sub-object level, PL\/Scope could be used by querying&nbsp;<code>DBA_IDENTIFIERS<\/code>&nbsp;.<\/li>\n\n\n\n<li>Find <code>INSERT<\/code>, <code>UPDATE<\/code>,&nbsp; <code>DELETE<\/code>, <code>MERGE<\/code>, <code>COMMIT<\/code> and&nbsp;<code>ROLLBACK<\/code> statements in PL\/SQL units. Static statements can be found via PL\/Scope in the <code>DBA_STATEMENTS<\/code> view. But executions in dynamic statements are a challenge, since the DML may be stored outside of the PL\/SQL unit (e.g. in tables). It&#8217;s virtually impossible to get a complete result using static code analysis.<\/li>\n\n\n\n<li>Bring these results together and check if DML statements are followed by a transaction control statement. This is another challenge. Without a parser (and some semantic analysis) it is not possible to find out if a statement is really executed (e.g. PL\/Scope does not provide information about control structures).<\/li>\n<\/ul>\n\n\n\n<p>For this blog post, we use a na\u00efve static code analysis approach. We analyze the object level and consider static SQL statements only. Furthermore, we assume that DML statements (INSERT, UPDATE,&nbsp; DELETE, MERGE) and transaction control statements (COMMIT,&nbsp;ROLLBACK) found in the call hierarchy are all executed and the transaction control statement is at the very end.<\/p>\n\n\n\n<p>As long as the transaction control statements are not executed as dynamic SQL the result should be good enough. This means if the query produces no result for an application, then this is for sure not a SmartDB application, but if a result is produced, then this does not guarantee that the application is really following the rules and issuing a <code>COMMIT<\/code>&nbsp;or a <code>ROLLBACK<\/code>&nbsp;at the end of a write transaction.<\/p>\n\n\n<div class=\"accordion\"><div class=\"mfn-acc accordion_wrapper  toggle\"><br \/>\n<div class=\"question\"><div class=\"title\"><i class=\"icon-plus acc-icon-plus\" aria-hidden=\"true\"><\/i><i class=\"icon-minus acc-icon-minus\" aria-hidden=\"true\"><\/i>Compile all application users with PL\/Scope<\/div><div class=\"answer\"><\/p>\n\n\n\n<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\">Prepare check SmartDB property 3: compile with PL\/Scope (>=12.2)<\/span><span role=\"button\" tabindex=\"0\" data-code=\"SET SERVEROUTPUT ON SIZE UNLIMITED\nDECLARE\n   PROCEDURE exec_sql (in_sql_stmt IN VARCHAR2) IS\n   BEGIN\n      dbms_output.put_line('executing: ' || in_sql_stmt);\n      EXECUTE IMMEDIATE in_sql_stmt;\n   END exec_sql;\n   --\n   PROCEDURE enable_plscope IS\n   BEGIN\n      exec_sql(q'&#091;ALTER SESSION SET plscope_settings='IDENTIFIERS:ALL, STATEMENTS:ALL'&#093;');\n   END enable_plscope;\n   --\n   PROCEDURE compile_private_synonyms(in_user IN VARCHAR2) IS\n   BEGIN\n      &lt;&lt;synonyms&gt;&gt;\n      FOR r IN (\n         SELECT synonym_name\n           FROM dba_synonyms\n          WHERE owner = in_user\n      ) LOOP\n         exec_sql('ALTER SYNONYM &quot;' || in_user || '&quot;.&quot;' || r.synonym_name || '&quot; COMPILE');\n      END LOOP synonyms;\n   END compile_private_synonyms;\n   --\n   PROCEDURE compile_public_synonyms(in_user IN VARCHAR2) IS\n   BEGIN\n      FOR r IN (\n         SELECT synonym_name\n           FROM dba_synonyms\n          WHERE owner = 'PUBLIC'\n            AND table_owner = in_user\n      ) LOOP\n         exec_sql('ALTER PUBLIC SYNONYM &quot;' || r.synonym_name || '&quot; COMPILE');\n      END LOOP public_synonyms;\n   END compile_public_synonyms;\n   --\n   PROCEDURE compile_types(in_user IN VARCHAR2) IS\n      e_has_table_deps EXCEPTION;\n      e_is_not_udt     EXCEPTION;\n      e_compile_error  EXCEPTION;\n      PRAGMA exception_init(e_has_table_deps, -2311);\n      PRAGMA exception_init(e_is_not_udt, -22307);\n      PRAGMA exception_init(e_compile_error, -24344);\n   BEGIN\n      &lt;&lt;types&gt;&gt;\n      FOR r IN (\n         SELECT o.object_type, o.object_name, count(d.name) AS priority \n           FROM dba_objects o\n           LEFT JOIN dba_dependencies d\n             ON d.owner = o.owner\n                AND d.type = o.object_type\n                AND d.name = o.object_name\n          WHERE o.owner = in_user\n            AND o.object_type in ('TYPE', 'TYPE BODY')\n          GROUP BY o.object_type, o.object_name\n          ORDER BY priority\n      ) LOOP\n         &lt;&lt;compile_type&gt;&gt;\n         BEGIN\n             IF r.object_type = 'TYPE' THEN\n                exec_sql('ALTER TYPE &quot;' || in_user || '&quot;.&quot;' || r.object_name || '&quot; COMPILE');\n             ELSE\n                exec_sql('ALTER TYPE &quot;' || in_user || '&quot;.&quot;' || r.object_name || '&quot; COMPILE BODY');\n             END IF;\n         EXCEPTION\n            WHEN e_has_table_deps OR e_is_not_udt OR e_compile_error THEN\n               NULL;\n         END compile_type;\n      END LOOP types;\n   END compile_types;\n   --\n   PROCEDURE compile_schema(in_user IN VARCHAR2) IS\n   BEGIN\n      -- synonyms and types are not covered by dbms_utility.compile_schema\n      compile_private_synonyms(in_user);\n      compile_public_synonyms(in_user);\n      compile_types(in_user);\n      dbms_utility.compile_schema(\n         schema         =&gt; in_user,\n         compile_all    =&gt; TRUE,\n         reuse_settings =&gt; FALSE\n      );\n   END compile_schema;\nBEGIN\n   enable_plscope;\n   &lt;&lt;app_user&gt;&gt;\n   FOR r IN (\n      SELECT username\n        FROM dba_users\n       WHERE oracle_maintained = 'N' \n         AND username NOT IN ('FTLDB', 'PLSCOPE', 'UT3')      \n   ) LOOP\n      compile_schema(r.username);\n   END LOOP app_user;\nEND;\n\/\" 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\"> SIZE UNLIMITED<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">DECLARE<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #569CD6\">PROCEDURE<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">exec_sql<\/span><span style=\"color: #D4D4D4\"> (in_sql_stmt <\/span><span style=\"color: #569CD6\">IN<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">VARCHAR2<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #569CD6\">IS<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #569CD6\">BEGIN<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #DCDCAA\">dbms_output.<\/span><span style=\"color: #4EC9B0\">put_line<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&#39;executing: &#39;<\/span><span style=\"color: #D4D4D4\"> || in_sql_stmt);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #DCDCAA\">EXECUTE IMMEDIATE<\/span><span style=\"color: #D4D4D4\"> in_sql_stmt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #569CD6\">END<\/span><span style=\"color: #D4D4D4\"> exec_sql;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #6A9955\">--<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #569CD6\">PROCEDURE<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">enable_plscope<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">IS<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #569CD6\">BEGIN<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      exec_sql(q<\/span><span style=\"color: #CE9178\">&#39;[ALTER SESSION SET plscope_settings=&#39;<\/span><span style=\"color: #D4D4D4\">IDENTIFIERS:<\/span><span style=\"color: #569CD6\">ALL<\/span><span style=\"color: #D4D4D4\">, STATEMENTS:<\/span><span style=\"color: #569CD6\">ALL<\/span><span style=\"color: #CE9178\">&#39;]&#39;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #569CD6\">END<\/span><span style=\"color: #D4D4D4\"> enable_plscope;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #6A9955\">--<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #569CD6\">PROCEDURE<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">compile_private_synonyms<\/span><span style=\"color: #D4D4D4\">(in_user <\/span><span style=\"color: #569CD6\">IN<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">VARCHAR2<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #569CD6\">IS<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #569CD6\">BEGIN<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      &lt;&lt;synonyms&gt;&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #C586C0\">FOR<\/span><span style=\"color: #D4D4D4\"> r <\/span><span style=\"color: #569CD6\">IN<\/span><span style=\"color: #D4D4D4\"> (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">         <\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> synonym_name<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">           <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> dba_synonyms<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          <\/span><span style=\"color: #569CD6\">WHERE<\/span><span style=\"color: #D4D4D4\"> owner = in_user<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      ) <\/span><span style=\"color: #C586C0\">LOOP<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">         exec_sql(<\/span><span style=\"color: #CE9178\">&#39;ALTER SYNONYM &quot;&#39;<\/span><span style=\"color: #D4D4D4\"> || in_user || <\/span><span style=\"color: #CE9178\">&#39;&quot;.&quot;&#39;<\/span><span style=\"color: #D4D4D4\"> || r.synonym_name || <\/span><span style=\"color: #CE9178\">&#39;&quot; COMPILE&#39;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #C586C0\">END LOOP<\/span><span style=\"color: #D4D4D4\"> synonyms;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #569CD6\">END<\/span><span style=\"color: #D4D4D4\"> compile_private_synonyms;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #6A9955\">--<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #569CD6\">PROCEDURE<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">compile_public_synonyms<\/span><span style=\"color: #D4D4D4\">(in_user <\/span><span style=\"color: #569CD6\">IN<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">VARCHAR2<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #569CD6\">IS<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #569CD6\">BEGIN<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #C586C0\">FOR<\/span><span style=\"color: #D4D4D4\"> r <\/span><span style=\"color: #569CD6\">IN<\/span><span style=\"color: #D4D4D4\"> (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">         <\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> synonym_name<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">           <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> dba_synonyms<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          <\/span><span style=\"color: #569CD6\">WHERE<\/span><span style=\"color: #D4D4D4\"> owner = <\/span><span style=\"color: #CE9178\">&#39;PUBLIC&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #569CD6\">AND<\/span><span style=\"color: #D4D4D4\"> table_owner = in_user<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      ) <\/span><span style=\"color: #C586C0\">LOOP<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">         exec_sql(<\/span><span style=\"color: #CE9178\">&#39;ALTER PUBLIC SYNONYM &quot;&#39;<\/span><span style=\"color: #D4D4D4\"> || r.synonym_name || <\/span><span style=\"color: #CE9178\">&#39;&quot; COMPILE&#39;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #C586C0\">END LOOP<\/span><span style=\"color: #D4D4D4\"> public_synonyms;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #569CD6\">END<\/span><span style=\"color: #D4D4D4\"> compile_public_synonyms;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #6A9955\">--<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #569CD6\">PROCEDURE<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">compile_types<\/span><span style=\"color: #D4D4D4\">(in_user <\/span><span style=\"color: #569CD6\">IN<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">VARCHAR2<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #569CD6\">IS<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      e_has_table_deps <\/span><span style=\"color: #569CD6\">EXCEPTION<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      e_is_not_udt     <\/span><span style=\"color: #569CD6\">EXCEPTION<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      e_compile_error  <\/span><span style=\"color: #569CD6\">EXCEPTION<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">PRAGMA exception_init<\/span><span style=\"color: #D4D4D4\">(e_has_table_deps, -<\/span><span style=\"color: #B5CEA8\">2311<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">PRAGMA exception_init<\/span><span style=\"color: #D4D4D4\">(e_is_not_udt, -<\/span><span style=\"color: #B5CEA8\">22307<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">PRAGMA exception_init<\/span><span style=\"color: #D4D4D4\">(e_compile_error, -<\/span><span style=\"color: #B5CEA8\">24344<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #569CD6\">BEGIN<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      &lt;&lt;types&gt;&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #C586C0\">FOR<\/span><span style=\"color: #D4D4D4\"> r <\/span><span style=\"color: #569CD6\">IN<\/span><span style=\"color: #D4D4D4\"> (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">         <\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> o.object_type, o.object_name, <\/span><span style=\"color: #DCDCAA\">count<\/span><span style=\"color: #D4D4D4\">(d.<\/span><span style=\"color: #569CD6\">name<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> priority <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">           <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> dba_objects o<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">           <\/span><span style=\"color: #569CD6\">LEFT JOIN<\/span><span style=\"color: #D4D4D4\"> dba_dependencies d<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             <\/span><span style=\"color: #569CD6\">ON<\/span><span style=\"color: #D4D4D4\"> d.owner = o.owner<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                <\/span><span style=\"color: #569CD6\">AND<\/span><span style=\"color: #D4D4D4\"> d.<\/span><span style=\"color: #569CD6\">type<\/span><span style=\"color: #D4D4D4\"> = o.object_type<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                <\/span><span style=\"color: #569CD6\">AND<\/span><span style=\"color: #D4D4D4\"> d.<\/span><span style=\"color: #569CD6\">name<\/span><span style=\"color: #D4D4D4\"> = o.object_name<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          <\/span><span style=\"color: #569CD6\">WHERE<\/span><span style=\"color: #D4D4D4\"> o.owner = in_user<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #569CD6\">AND<\/span><span style=\"color: #D4D4D4\"> o.object_type <\/span><span style=\"color: #569CD6\">in<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #CE9178\">&#39;TYPE&#39;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#39;TYPE BODY&#39;<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          <\/span><span style=\"color: #569CD6\">GROUP BY<\/span><span style=\"color: #D4D4D4\"> o.object_type, o.object_name<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          <\/span><span style=\"color: #569CD6\">ORDER BY<\/span><span style=\"color: #D4D4D4\"> priority<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      ) <\/span><span style=\"color: #C586C0\">LOOP<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">         &lt;&lt;compile_type&gt;&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">         <\/span><span style=\"color: #569CD6\">BEGIN<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             <\/span><span style=\"color: #C586C0\">IF<\/span><span style=\"color: #D4D4D4\"> r.object_type = <\/span><span style=\"color: #CE9178\">&#39;TYPE&#39;<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">THEN<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                exec_sql(<\/span><span style=\"color: #CE9178\">&#39;ALTER TYPE &quot;&#39;<\/span><span style=\"color: #D4D4D4\"> || in_user || <\/span><span style=\"color: #CE9178\">&#39;&quot;.&quot;&#39;<\/span><span style=\"color: #D4D4D4\"> || r.object_name || <\/span><span style=\"color: #CE9178\">&#39;&quot; COMPILE&#39;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             <\/span><span style=\"color: #C586C0\">ELSE<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                exec_sql(<\/span><span style=\"color: #CE9178\">&#39;ALTER TYPE &quot;&#39;<\/span><span style=\"color: #D4D4D4\"> || in_user || <\/span><span style=\"color: #CE9178\">&#39;&quot;.&quot;&#39;<\/span><span style=\"color: #D4D4D4\"> || r.object_name || <\/span><span style=\"color: #CE9178\">&#39;&quot; COMPILE BODY&#39;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             <\/span><span style=\"color: #C586C0\">END IF<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">         <\/span><span style=\"color: #569CD6\">EXCEPTION<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #569CD6\">WHEN<\/span><span style=\"color: #D4D4D4\"> e_has_table_deps <\/span><span style=\"color: #569CD6\">OR<\/span><span style=\"color: #D4D4D4\"> e_is_not_udt <\/span><span style=\"color: #569CD6\">OR<\/span><span style=\"color: #D4D4D4\"> e_compile_error <\/span><span style=\"color: #569CD6\">THEN<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">               <\/span><span style=\"color: #569CD6\">NULL<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">         <\/span><span style=\"color: #569CD6\">END<\/span><span style=\"color: #D4D4D4\"> compile_type;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #C586C0\">END LOOP<\/span><span style=\"color: #D4D4D4\"> types;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #569CD6\">END<\/span><span style=\"color: #D4D4D4\"> compile_types;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #6A9955\">--<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #569CD6\">PROCEDURE<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">compile_schema<\/span><span style=\"color: #D4D4D4\">(in_user <\/span><span style=\"color: #569CD6\">IN<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">VARCHAR2<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #569CD6\">IS<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #569CD6\">BEGIN<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #6A9955\">-- synonyms and types are not covered by dbms_utility.compile_schema<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      compile_private_synonyms(in_user);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      compile_public_synonyms(in_user);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      compile_types(in_user);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #DCDCAA\">dbms_utility.<\/span><span style=\"color: #4EC9B0\">compile_schema<\/span><span style=\"color: #D4D4D4\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">         schema         =&gt; in_user,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">         compile_all    =&gt; <\/span><span style=\"color: #569CD6\">TRUE<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">         reuse_settings =&gt; <\/span><span style=\"color: #569CD6\">FALSE<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      );<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #569CD6\">END<\/span><span style=\"color: #D4D4D4\"> compile_schema;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">BEGIN<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">   enable_plscope;<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">   &lt;&lt;app_user&gt;&gt;<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #C586C0\">FOR<\/span><span style=\"color: #D4D4D4\"> r <\/span><span style=\"color: #569CD6\">IN<\/span><span style=\"color: #D4D4D4\"> (<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> username<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> dba_users<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">       <\/span><span style=\"color: #569CD6\">WHERE<\/span><span style=\"color: #D4D4D4\"> oracle_maintained = <\/span><span style=\"color: #CE9178\">&#39;N&#39;<\/span><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">         <\/span><span style=\"color: #569CD6\">AND<\/span><span style=\"color: #D4D4D4\"> username <\/span><span style=\"color: #569CD6\">NOT<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">IN<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #CE9178\">&#39;FTLDB&#39;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#39;PLSCOPE&#39;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#39;UT3&#39;<\/span><span style=\"color: #D4D4D4\">)      <\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">   ) <\/span><span style=\"color: #C586C0\">LOOP<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">      compile_schema(r.username);<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #C586C0\">END LOOP<\/span><span style=\"color: #D4D4D4\"> app_user;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">END<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">\/<\/span><\/span><\/code><\/pre><\/div>\n\n\n<p><\/div><\/div>\n<br \/>\n<div class=\"question\"><div class=\"title\"><i class=\"icon-plus acc-icon-plus\" aria-hidden=\"true\"><\/i><i class=\"icon-minus acc-icon-minus\" aria-hidden=\"true\"><\/i>Query to check SmartDB property 3<\/div><div class=\"answer\"><\/p>\n\n\n\n<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(3 * 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\">Check SmartDB property 3: query (>=12.2)<\/span><span role=\"button\" tabindex=\"0\" data-code=\"WITH \n   -- calculate object dependencies recursively\n   -- using PL\/SQL to handle cycles (expected on object level)\n   -- SQL variant using NOCYCLE did not work (runs forever)\n   FUNCTION get_dep (\n      in_xml IN XMLTYPE\n   ) RETURN XMLTYPE IS\n      l_deps     sys.ora_mining_varchar2_nt;\n      l_result   XMLTYPE := XMLTYPE('&lt;xml\/&gt;');\n      l_element  XMLTYPE;\n      --\n      PROCEDURE add_child(\n         io_deps  IN OUT sys.ora_mining_varchar2_nt,\n         in_owner           IN VARCHAR2,\n         in_type            IN VARCHAR2,\n         in_name            IN VARCHAR2,\n         in_has_dml         IN INTEGER,\n         in_has_transaction IN INTEGER\n      ) IS\n      BEGIN\n         io_deps.extend;\n         io_deps(io_deps.count) := in_owner || '.' || in_type || '.' || in_name \n            || '.' || in_has_dml || '.' || in_has_transaction;         \n      END add_child;\n      --\n      FUNCTION exists_child(\n         in_deps            IN sys.ora_mining_varchar2_nt,\n         in_owner           IN VARCHAR2,\n         in_type            IN VARCHAR2,\n         in_name            IN VARCHAR2,\n         in_has_dml         IN INTEGER,\n         in_has_transaction IN INTEGER\n      ) RETURN BOOLEAN is\n         l_found INTEGER;\n      BEGIN\n         SELECT COUNT(*)\n           INTO l_found\n           FROM table(in_deps)\n          WHERE column_value = in_owner || '.' || in_type || '.' || in_name \n                   || '.' || in_has_dml || '.' || in_has_transaction\n            AND rownum = 1;\n         RETURN l_found &gt; 0;\n      END exists_child;\n      --\n      PROCEDURE add_children(\n         io_deps  IN OUT sys.ora_mining_varchar2_nt,\n         in_xml   IN     XMLTYPE,\n         in_owner IN     VARCHAR2,\n         in_type  IN     VARCHAR2,\n         in_name  IN     VARCHAR2\n      ) IS\n      BEGIN\n         FOR r IN (\n            SELECT owner, type, name, has_dml, has_transaction\n              FROM XMLTABLE(\n                      'xml\/row\/value\/dependency&#091;..\/..\/key\/owner=$owner and ..\/..\/key\/type=$type and ..\/..\/key\/name=$name&#093;'\n                      PASSING in_xml, in_owner AS &quot;owner&quot;, in_type AS &quot;type&quot;, in_name AS &quot;name&quot;\n                      COLUMNS owner           VARCHAR2(128) PATH 'referenced_owner',\n                              type            VARCHAR2(128) PATH 'referenced_type',\n                              name            VARCHAR2(128) PATH 'referenced_name',\n                              has_dml         INTEGER       PATH 'referenced_has_dml',\n                              has_transaction INTEGER       PATH 'referenced_has_transaction'\n                   )\n         ) LOOP\n            IF NOT exists_child(io_deps, r.owner, r.type, r.name, r.has_dml, r.has_transaction) THEN\n               add_child(io_deps, r.owner, r.type, r.name, r.has_dml, r.has_transaction);\n               add_children(io_deps, in_xml, r.owner, r.type, r.name);\n            END IF;\n         END LOOP;\n      END add_children;\n      ---\n      FUNCTION get_fragment(\n         in_deps  IN sys.ora_mining_varchar2_nt,\n         in_owner IN VARCHAR2,\n         in_type  IN VARCHAR2,\n         in_name  IN VARCHAR2\n      ) RETURN XMLTYPE IS\n         l_xml XMLTYPE;\n      BEGIN\n         SELECT XMLELEMENT(&quot;xml&quot;,\n                   XMLAGG(\n                      XMLELEMENT(&quot;row&quot;,\n                         XMLELEMENT(&quot;owner&quot;, in_owner),\n                         XMLELEMENT(&quot;type&quot;, in_type),\n                         XMLELEMENT(&quot;name&quot;, in_name),\n                         XMLELEMENT(&quot;referenced_owner&quot;, regexp_substr(column_value, '&#091;^\\.&#093;+', 1, 1)),\n                         XMLELEMENT(&quot;referenced_type&quot;, regexp_substr(column_value, '&#091;^\\.&#093;+', 1, 2)),\n                         XMLELEMENT(&quot;referenced_name&quot;, regexp_substr(column_value, '&#091;^\\.&#093;+', 1, 3)),\n                         XMLELEMENT(&quot;referenced_has_dml&quot;, regexp_substr(column_value, '&#091;^\\.&#093;+', 1, 4)),\n                         XMLELEMENT(&quot;referenced_has_transaction&quot;, regexp_substr(column_value, '&#091;^\\.&#093;+', 1, 5))\n                      )\n                   )\n                )   \n           INTO l_xml\n           FROM table(in_deps);\n          RETURN l_xml;\n      END get_fragment;\n      ---\n      PROCEDURE add_to_result(\n         io_result    IN OUT XMLTYPE,\n         in_fragment  IN     XMLTYPE\n      ) IS\n      BEGIN\n         SELECT xmlquery('\n                   copy $i := $p1 modify\n                   (\n                      for $j in $i\/xml \n                      return insert node $p2 into $j\n                   )\n                   return $i'\n                   PASSING io_result AS &quot;p1&quot;, in_fragment.extract('\/xml\/row') AS &quot;p2&quot;\n                   RETURNING CONTENT\n                )\n           INTO io_result\n           FROM dual;  \n      END add_to_result;\n   BEGIN\n      FOR r IN (\n         SELECT owner, type, name\n           FROM XMLTABLE (\n                   '\/xml\/row\/key'\n                   PASSING in_xml\n                   COLUMNS owner VARCHAR2(128) PATH 'owner',\n                           type  VARCHAR2(128) PATH 'type',\n                           name  VARCHAR2(128) PATH 'name'                           \n                )\n      ) \n      LOOP\n         l_deps := sys.ora_mining_varchar2_nt();\n         add_children(l_deps, in_xml, r.owner, r.type, r.name);\n         add_to_result(l_result, get_fragment(l_deps, r.owner, r.type, r.name));\n      END LOOP;\n      RETURN l_result;\n   END get_dep;\n   -- application users in scope of the analysis\n   -- other users are treated as if they were not installed\n   app_user AS (\n      SELECT username\n        FROM dba_users\n       WHERE oracle_maintained = 'N' -- SYS, SYSTEM, SYSAUX, ...\n         AND username NOT IN ('FTLDB', 'PLSCOPE', 'UT3')\n   ),\n   -- materialize relevant PL\/Scope identifiers to avoid very bad execution plans\n   identifiers AS (\n      SELECT --+ materialize\n             owner,\n             object_type, \n             object_name\n        FROM dba_identifiers i\n       WHERE usage_context_id = 0\n         AND object_type IN ('PACKAGE BODY', 'TYPE BODY', 'FUNCTION', 'PROCEDURE', 'TRIGGER')\n   ),\n   -- PL\/SQL objects without PL\/Scope metadata\n   missing_plscope_obj AS (\n      SELECT o.owner, o.object_type, o.object_name\n        FROM dba_objects o\n        JOIN app_user u ON u.username = o.owner\n        LEFT JOIN identifiers i\n          ON i.owner = o.owner\n             AND i.object_type = o.object_type\n             AND i.object_name = o.object_name\n       WHERE o.object_type IN ('PACKAGE BODY', 'TYPE BODY', 'FUNCTION', 'PROCEDURE', 'TRIGGER')\n         AND i.object_name IS NULL\n   ),   \n   -- PL\/SQL bodies extended by has_dml and has_transaction colums using PL\/Scope \n   plscope_obj AS (\n      SELECT s.owner, s.object_type, s.object_name,\n             MAX (\n                CASE\n                   WHEN s.type IN ('INSERT', 'UPDATE', 'DELETE', 'MERGE') THEN\n                      1\n                   ELSE\n                      0\n                END\n             ) AS has_dml,\n             MAX (\n                CASE\n                   WHEN s.type IN ('COMMIT', 'ROLLBACK') THEN\n                      1\n                   ELSE\n                      0\n                END\n             ) AS has_transaction\n        FROM dba_statements s\n        JOIN app_user u ON u.username = s.owner\n       WHERE s.object_type IN ('PACKAGE BODY', 'TYPE BODY', 'FUNCTION', 'PROCEDURE', 'TRIGGER')\n       GROUP BY s.owner, s.object_type, s.object_name\n   ),\n   -- dba_dependencies reduced to a PL\/SQL bodies\n   dep_base AS (\n      SELECT owner,\n             type, \n             name, \n             referenced_owner,\n             CASE referenced_type\n                WHEN 'PACKAGE' THEN 'PACKAGE BODY'\n                WHEN 'TYPE' THEN 'TYPE BODY'\n                ELSE referenced_type\n             END AS referenced_type,\n             referenced_name\n        FROM dba_dependencies d\n       WHERE referenced_type IN ('PACKAGE', 'PACKAGE BODY', 'TYPE', 'TYPE BODY', 'FUNCTION', 'PROCEDURE', 'SYNONYM')\n         and (owner = 'PUBLIC' OR owner IN (SELECT username FROM app_user))\n         and (referenced_owner = 'PUBLIC' OR referenced_owner IN (SELECT username FROM app_user))\n   ), \n   -- extend dependencies by columns has_dml and has_transaction\n   dep AS (\n      select d.owner,\n             d.type,\n             d.name, \n             d.referenced_owner, \n             d.referenced_type, \n             d.referenced_name, \n             nvl(p.has_dml, 0) AS referenced_has_dml,\n             nvl(p.has_transaction, 0) AS referenced_has_transaction\n        FROM dep_base d\n        LEFT JOIN plscope_obj p\n          ON p.owner = d.referenced_owner\n             AND p.object_type = d.referenced_type\n             AND p.object_name = d.referenced_name\n   ),\n   -- XML because JSON values are still restricted to 4000\/32767 bytes\n   -- see Bug 27199654 : ORA-40459 WHEN GENERATING JSON DATA\n   xml_dep AS (\n      SELECT XMLELEMENT(&quot;xml&quot;,\n                XMLAGG(\n                   XMLELEMENT(&quot;row&quot;,\n                      XMLELEMENT(&quot;key&quot;,\n                         XMLELEMENT(&quot;owner&quot;, d.owner),\n                         XMLELEMENT(&quot;type&quot;, d.type),\n                         XMLELEMENT(&quot;name&quot;, d.name)\n                      ),\n                      XMLELEMENT(&quot;value&quot;,\n                         XMLAGG(\n                            XMLELEMENT(&quot;dependency&quot;,\n                               XMLELEMENT(&quot;referenced_owner&quot;, d.referenced_owner),\n                               XMLELEMENT(&quot;referenced_type&quot;, d.referenced_type),\n                               XMLELEMENT(&quot;referenced_name&quot;, d.referenced_name),\n                               XMLELEMENT(&quot;referenced_has_dml&quot;, d.referenced_has_dml),\n                               XMLELEMENT(&quot;referenced_has_transaction&quot;, d.referenced_has_transaction)\n                            )\n                         )\n                      )\n                   )\n                )\n             ) AS xmldoc\n        FROM dep d\n        JOIN dba_objects o\n          ON d.owner = o.owner\n         AND d.type = o.object_type\n         AND d.name = o.object_name\n       WHERE o.owner IN (SELECT username FROM app_user)\n         AND o.object_type IN ('PACKAGE BODY', 'TYPE BODY', 'FUNCTION', 'PROCEDURE')\n         AND (d.owner, replace(d.type, ' BODY'), d.name) IN (\n                SELECT owner, type, table_name \n                 FROM dba_tab_privs\n             )\n       GROUP BY d.owner, d.type, d.name               \n   ),\n   -- get the object dependencies via PL\/SQL function\n   -- passing data as XML because the PL\/SQL function dont't have access to named subqueries\n   dep_hier AS (\n      SELECT owner, type, name, referenced_owner, referenced_type, referenced_name, \n             referenced_has_dml, referenced_has_transaction\n        FROM XMLTABLE(\n               '\/xml\/row'\n               PASSING get_dep((SELECT xmldoc from xml_dep))\n                   COLUMNS owner                      VARCHAR2(128) PATH 'owner',\n                           type                       VARCHAR2(128) PATH 'type',\n                           name                       VARCHAR2(128) PATH 'name',\n                           referenced_owner           VARCHAR2(128) PATH 'referenced_owner',\n                           referenced_type            VARCHAR2(128) PATH 'referenced_type',\n                           referenced_name            VARCHAR2(128) PATH 'referenced_name',\n                           referenced_has_dml         INTEGER       PATH 'referenced_has_dml',\n                           referenced_has_transaction INTEGER       PATH 'referenced_has_transaction'\n             )\n   ),\n   -- aggregate columns has_dml and has_transaction per root PL\/SQL body\n   app_plsql AS (\n      SELECT owner, type AS object_type, name AS object_name,\n             MAX(referenced_has_dml) AS has_dml,\n             MAX(referenced_has_transaction) AS has_transaction\n        FROM dep_hier\n       GROUP by owner, type, name\n   ),\n   -- roles as recursive structure\n   role_base AS (\n      -- roles without parent (=roots)\n      SELECT r.role, NULL AS parent_role\n        FROM dba_roles r\n       WHERE r.role NOT IN (\n                SELECT p.granted_role\n                  FROM role_role_privs p\n             )\n      UNION ALL\n      -- roles with parent (=children)\n      SELECT granted_role AS role, role AS parent_role\n        FROM role_role_privs\n   ),\n   -- roles tree, calculate role_path for every hierarchy level\n   role_tree AS (\n      SELECT role,\n             parent_role,\n             sys_connect_by_path(ROLE, '\/') AS role_path\n        FROM role_base\n      CONNECT BY PRIOR role = parent_role\n   ),\n   -- roles graph, child added to all ancestors including self\n   -- allows simple join to parent_role to find all descendants\n   role_graph AS (\n      SELECT DISTINCT\n             role,\n             regexp_substr(role_path, '(\/)(\\w+)', 1, 1, 'i', 2) AS parent_role\n        FROM role_tree\n   ),\n   -- user system privileges\n   sys_priv AS (\n      -- system privileges granted directly to users\n      SELECT u.username, p.privilege\n        FROM dba_sys_privs p\n        JOIN app_user u ON u.username = p.grantee\n      UNION\n      -- system privileges granted directly to PUBLIC\n      SELECT u.username, p.privilege\n        FROM dba_sys_privs p\n       CROSS JOIN app_user u\n       WHERE p.grantee = 'PUBLIC'\n         AND p.privilege NOT IN (\n                SELECT r.role\n                  FROM dba_roles r\n             )\n      UNION\n      -- system privileges granted to users via roles\n      SELECT u.username, p.privilege\n        FROM dba_role_privs r\n        JOIN app_user u ON u.username = r.grantee\n        JOIN role_graph g ON g.parent_role = r.granted_role\n        JOIN dba_sys_privs p ON p.grantee = g.role\n      UNION\n      -- system privileges granted to PUBLIC via roles\n      SELECT u.username, p.privilege\n        FROM dba_role_privs r\n        JOIN role_graph g ON g.parent_role = r.granted_role\n        JOIN dba_sys_privs p ON p.grantee = g.role\n        CROSS JOIN app_user u\n       WHERE r.grantee = 'PUBLIC'\n   ),\n   -- user object privileges\n   obj_priv AS (\n      -- objects granted directly to users\n      SELECT u.username, p.owner, p.type AS object_type, p.table_name AS object_name\n        FROM dba_tab_privs p\n        JOIN app_user u ON u.username = p.grantee\n       WHERE p.owner IN (\n                SELECT u2.username\n                  FROM app_user u2\n             )\n      UNION\n      -- objects granted to users via roles\n      SELECT u.username, p.owner, p.type AS object_type, p.table_name AS object_name\n        FROM dba_role_privs r\n        JOIN app_user u ON u.username = r.grantee\n        JOIN role_graph g ON g.parent_role = r.granted_role\n        JOIN dba_tab_privs p ON p.grantee = g.role\n       WHERE p.owner IN (\n                SELECT u2.username\n                  FROM app_user u2\n             )\n      -- objects granted to PUBLIC\n      UNION\n      SELECT u.username, p.owner, p.type AS object_type, p.table_name AS object_name\n        FROM dba_tab_privs p\n       CROSS JOIN app_user u\n       WHERE p.owner IN (\n                SELECT u2.username\n                  FROM app_user u2\n             )\n         AND p.grantee = 'PUBLIC'\n   ),\n   -- issues if user is configured in the connection pool of a middle tier\n   issues AS (\n     -- privileges not part of CONNECT role\n      SELECT username,\n             'SYS' AS owner,\n             'PRIVILEGE' AS object_type,\n             privilege AS object_name,\n             'Privilege is not part of the CONNECT role' AS issue\n        FROM sys_priv\n       WHERE privilege NOT IN ('CREATE SESSION', 'SET CONTAINER')\n      -- access to non PL\/SQL units\n      UNION ALL\n      SELECT username,\n             owner,\n             object_type,\n             object_name,\n             'Access to non-PL\/SQL unit'\n        FROM obj_priv\n       WHERE object_type NOT IN ('PACKAGE', 'TYPE', 'FUNCTION', 'PROCEDURE')\n       -- own objects\n      UNION ALL\n      SELECT u.username,\n             o.owner,\n             o.object_type,\n             o.object_name,\n             'Connect user must not own any object'\n        FROM app_user u\n        JOIN dba_objects o ON o.owner = u.username\n      -- missing CREATE SESSION privilege\n      UNION ALL\n      SELECT u.username,\n             'SYS',\n             'PRIVILEGE',\n             'CREATE SESSION',\n             'Privilege is missing, but required'\n        FROM app_user u\n       WHERE u.username NOT IN (\n                SELECT username\n                  FROM sys_priv\n                 WHERE privilege = 'CREATE SESSION' \n             )\n      -- missing PL\/Scope metadata leads to wrong results\n      UNION ALL \n      SELECT p.username,\n             p.owner, \n             p.object_type, \n             p.object_name, \n             'PL\/Scope metadata is missing, required for analysis'\n        FROM obj_priv p\n        JOIN missing_plscope_obj s\n          ON s.owner = p.owner\n             AND replace(s.object_type, ' BODY') = p.object_type\n             AND s.object_name = p.object_name\n      -- access to PL\/SQL units updating database state without COMMIT\/ROLLBACK\n      UNION ALL \n      SELECT p.username,\n             p.owner,\n             p.object_type,\n             p.object_name,\n             'INSERT\/UPDATE\/DELETE\/MERGE without COMMIT\/ROLLBACK'\n        FROM obj_priv p\n        JOIN app_plsql a\n          ON a.owner = p.owner\n             AND replace(a.object_type, ' BODY') = p.object_type\n             AND a.object_name = p.object_name\n       WHERE p.object_type IN ('PACKAGE', 'TYPE', 'FUNCTION', 'PROCEDURE') \n         AND a.has_dml = 1 AND a.has_transaction = 0\n   ),\n   -- aggregate issues per user\n   issue_aggr AS (\n      SELECT u.username, COUNT(i.username) issue_count\n        FROM app_user u\n        LEFT JOIN issues i ON i.username = u.username\n       GROUP BY u.username\n   ),\n   -- user summary (calculate is_smartdb_property_3_met)\n   summary AS (\n      SELECT username,\n             CASE\n                WHEN issue_count = 0 THEN\n                   'YES'\n                ELSE\n                   'NO'\n             END AS is_smartdb_property_3_met,\n             issue_count\n        FROM issue_aggr\n       ORDER BY is_smartdb_property_3_met DESC, username\n   )\n-- main\nSELECT * \n  FROM summary\n WHERE issue_count = 0;\n\/\" 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\">WITH<\/span><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #6A9955\">-- calculate object dependencies recursively<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #6A9955\">-- using PL\/SQL to handle cycles (expected on object level)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #6A9955\">-- SQL variant using NOCYCLE did not work (runs forever)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #569CD6\">FUNCTION<\/span><span style=\"color: #D4D4D4\"> get_dep (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      in_xml <\/span><span style=\"color: #569CD6\">IN<\/span><span style=\"color: #D4D4D4\"> XMLTYPE<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   ) <\/span><span style=\"color: #569CD6\">RETURN<\/span><span style=\"color: #D4D4D4\"> XMLTYPE <\/span><span style=\"color: #569CD6\">IS<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      l_deps     sys.ora_mining_varchar2_nt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      l_result   XMLTYPE := XMLTYPE(<\/span><span style=\"color: #CE9178\">&#39;&lt;xml\/&gt;&#39;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      l_element  XMLTYPE;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #6A9955\">--<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">PROCEDURE<\/span><span style=\"color: #D4D4D4\"> add_child(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">         io_deps  <\/span><span style=\"color: #569CD6\">IN<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">OUT<\/span><span style=\"color: #D4D4D4\"> sys.ora_mining_varchar2_nt,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">         in_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>\n<span class=\"line\"><span style=\"color: #D4D4D4\">         in_type            <\/span><span style=\"color: #569CD6\">IN<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">VARCHAR2<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">         in_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>\n<span class=\"line\"><span style=\"color: #D4D4D4\">         in_has_dml         <\/span><span style=\"color: #569CD6\">IN<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">INTEGER<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">         in_has_transaction <\/span><span style=\"color: #569CD6\">IN<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">INTEGER<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      ) <\/span><span style=\"color: #569CD6\">IS<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">BEGIN<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">         io_deps.extend;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">         io_deps(io_deps.count) := in_owner || <\/span><span style=\"color: #CE9178\">&#39;.&#39;<\/span><span style=\"color: #D4D4D4\"> || in_type || <\/span><span style=\"color: #CE9178\">&#39;.&#39;<\/span><span style=\"color: #D4D4D4\"> || in_name <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            || <\/span><span style=\"color: #CE9178\">&#39;.&#39;<\/span><span style=\"color: #D4D4D4\"> || in_has_dml || <\/span><span style=\"color: #CE9178\">&#39;.&#39;<\/span><span style=\"color: #D4D4D4\"> || in_has_transaction;         <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">END<\/span><span style=\"color: #D4D4D4\"> add_child;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #6A9955\">--<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">FUNCTION<\/span><span style=\"color: #D4D4D4\"> exists_child(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">         in_deps            <\/span><span style=\"color: #569CD6\">IN<\/span><span style=\"color: #D4D4D4\"> sys.ora_mining_varchar2_nt,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">         in_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>\n<span class=\"line\"><span style=\"color: #D4D4D4\">         in_type            <\/span><span style=\"color: #569CD6\">IN<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">VARCHAR2<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">         in_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>\n<span class=\"line\"><span style=\"color: #D4D4D4\">         in_has_dml         <\/span><span style=\"color: #569CD6\">IN<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">INTEGER<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">         in_has_transaction <\/span><span style=\"color: #569CD6\">IN<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">INTEGER<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      ) <\/span><span style=\"color: #569CD6\">RETURN<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">BOOLEAN<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">is<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">         l_found <\/span><span style=\"color: #569CD6\">INTEGER<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">BEGIN<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">         <\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">COUNT<\/span><span style=\"color: #D4D4D4\">(*)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">           <\/span><span style=\"color: #569CD6\">INTO<\/span><span style=\"color: #D4D4D4\"> l_found<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">           <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">table<\/span><span style=\"color: #D4D4D4\">(in_deps)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          <\/span><span style=\"color: #569CD6\">WHERE<\/span><span style=\"color: #D4D4D4\"> column_value = in_owner || <\/span><span style=\"color: #CE9178\">&#39;.&#39;<\/span><span style=\"color: #D4D4D4\"> || in_type || <\/span><span style=\"color: #CE9178\">&#39;.&#39;<\/span><span style=\"color: #D4D4D4\"> || in_name <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                   || <\/span><span style=\"color: #CE9178\">&#39;.&#39;<\/span><span style=\"color: #D4D4D4\"> || in_has_dml || <\/span><span style=\"color: #CE9178\">&#39;.&#39;<\/span><span style=\"color: #D4D4D4\"> || in_has_transaction<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #569CD6\">AND<\/span><span style=\"color: #D4D4D4\"> rownum = <\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">         <\/span><span style=\"color: #569CD6\">RETURN<\/span><span style=\"color: #D4D4D4\"> l_found &gt; <\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">END<\/span><span style=\"color: #D4D4D4\"> exists_child;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #6A9955\">--<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">PROCEDURE<\/span><span style=\"color: #D4D4D4\"> add_children(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">         io_deps  <\/span><span style=\"color: #569CD6\">IN<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">OUT<\/span><span style=\"color: #D4D4D4\"> sys.ora_mining_varchar2_nt,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">         in_xml   <\/span><span style=\"color: #569CD6\">IN<\/span><span style=\"color: #D4D4D4\">     XMLTYPE,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">         in_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>\n<span class=\"line\"><span style=\"color: #D4D4D4\">         in_type  <\/span><span style=\"color: #569CD6\">IN<\/span><span style=\"color: #D4D4D4\">     <\/span><span style=\"color: #569CD6\">VARCHAR2<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">         in_name  <\/span><span style=\"color: #569CD6\">IN<\/span><span style=\"color: #D4D4D4\">     <\/span><span style=\"color: #569CD6\">VARCHAR2<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      ) <\/span><span style=\"color: #569CD6\">IS<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">BEGIN<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">         <\/span><span style=\"color: #569CD6\">FOR<\/span><span style=\"color: #D4D4D4\"> r <\/span><span style=\"color: #569CD6\">IN<\/span><span style=\"color: #D4D4D4\"> (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">owner<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #569CD6\">type<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #569CD6\">name<\/span><span style=\"color: #D4D4D4\">, has_dml, has_transaction<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">              <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> XMLTABLE(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                      <\/span><span style=\"color: #CE9178\">&#39;xml\/row\/value\/dependency[..\/..\/key\/owner=$owner and ..\/..\/key\/type=$type and ..\/..\/key\/name=$name]&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                      PASSING in_xml, in_owner <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&quot;owner&quot;<\/span><span style=\"color: #D4D4D4\">, in_type <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&quot;type&quot;<\/span><span style=\"color: #D4D4D4\">, in_name <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&quot;name&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                      COLUMNS <\/span><span style=\"color: #569CD6\">owner<\/span><span style=\"color: #D4D4D4\">           <\/span><span style=\"color: #569CD6\">VARCHAR2<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #B5CEA8\">128<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #569CD6\">PATH<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&#39;referenced_owner&#39;<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                              <\/span><span style=\"color: #569CD6\">type<\/span><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #569CD6\">VARCHAR2<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #B5CEA8\">128<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #569CD6\">PATH<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&#39;referenced_type&#39;<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                              <\/span><span style=\"color: #569CD6\">name<\/span><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #569CD6\">VARCHAR2<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #B5CEA8\">128<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #569CD6\">PATH<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&#39;referenced_name&#39;<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                              has_dml         <\/span><span style=\"color: #569CD6\">INTEGER<\/span><span style=\"color: #D4D4D4\">       <\/span><span style=\"color: #569CD6\">PATH<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&#39;referenced_has_dml&#39;<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                              has_transaction <\/span><span style=\"color: #569CD6\">INTEGER<\/span><span style=\"color: #D4D4D4\">       <\/span><span style=\"color: #569CD6\">PATH<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&#39;referenced_has_transaction&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                   )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">         ) <\/span><span style=\"color: #569CD6\">LOOP<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #569CD6\">IF<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">NOT<\/span><span style=\"color: #D4D4D4\"> exists_child(io_deps, r.owner, r.type, r.name, r.has_dml, r.has_transaction) <\/span><span style=\"color: #569CD6\">THEN<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">               add_child(io_deps, r.owner, r.type, r.name, r.has_dml, r.has_transaction);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">               add_children(io_deps, in_xml, r.owner, r.type, r.name);<\/span><\/span>\n<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>\n<span class=\"line\"><span style=\"color: #D4D4D4\">         <\/span><span style=\"color: #569CD6\">END<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">LOOP<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">END<\/span><span style=\"color: #D4D4D4\"> add_children;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #6A9955\">---<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">FUNCTION<\/span><span style=\"color: #D4D4D4\"> get_fragment(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">         in_deps  <\/span><span style=\"color: #569CD6\">IN<\/span><span style=\"color: #D4D4D4\"> sys.ora_mining_varchar2_nt,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">         in_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>\n<span class=\"line\"><span style=\"color: #D4D4D4\">         in_type  <\/span><span style=\"color: #569CD6\">IN<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">VARCHAR2<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">         in_name  <\/span><span style=\"color: #569CD6\">IN<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">VARCHAR2<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      ) <\/span><span style=\"color: #569CD6\">RETURN<\/span><span style=\"color: #D4D4D4\"> XMLTYPE <\/span><span style=\"color: #569CD6\">IS<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">         l_xml XMLTYPE;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">BEGIN<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">         <\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> XMLELEMENT(<\/span><span style=\"color: #CE9178\">&quot;xml&quot;<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                   XMLAGG(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                      XMLELEMENT(<\/span><span style=\"color: #CE9178\">&quot;row&quot;<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                         XMLELEMENT(<\/span><span style=\"color: #CE9178\">&quot;owner&quot;<\/span><span style=\"color: #D4D4D4\">, in_owner),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                         XMLELEMENT(<\/span><span style=\"color: #CE9178\">&quot;type&quot;<\/span><span style=\"color: #D4D4D4\">, in_type),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                         XMLELEMENT(<\/span><span style=\"color: #CE9178\">&quot;name&quot;<\/span><span style=\"color: #D4D4D4\">, in_name),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                         XMLELEMENT(<\/span><span style=\"color: #CE9178\">&quot;referenced_owner&quot;<\/span><span style=\"color: #D4D4D4\">, regexp_substr(column_value, <\/span><span style=\"color: #CE9178\">&#39;[^\\.]+&#39;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\">)),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                         XMLELEMENT(<\/span><span style=\"color: #CE9178\">&quot;referenced_type&quot;<\/span><span style=\"color: #D4D4D4\">, regexp_substr(column_value, <\/span><span style=\"color: #CE9178\">&#39;[^\\.]+&#39;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">2<\/span><span style=\"color: #D4D4D4\">)),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                         XMLELEMENT(<\/span><span style=\"color: #CE9178\">&quot;referenced_name&quot;<\/span><span style=\"color: #D4D4D4\">, regexp_substr(column_value, <\/span><span style=\"color: #CE9178\">&#39;[^\\.]+&#39;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">3<\/span><span style=\"color: #D4D4D4\">)),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                         XMLELEMENT(<\/span><span style=\"color: #CE9178\">&quot;referenced_has_dml&quot;<\/span><span style=\"color: #D4D4D4\">, regexp_substr(column_value, <\/span><span style=\"color: #CE9178\">&#39;[^\\.]+&#39;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">4<\/span><span style=\"color: #D4D4D4\">)),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                         XMLELEMENT(<\/span><span style=\"color: #CE9178\">&quot;referenced_has_transaction&quot;<\/span><span style=\"color: #D4D4D4\">, regexp_substr(column_value, <\/span><span style=\"color: #CE9178\">&#39;[^\\.]+&#39;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">5<\/span><span style=\"color: #D4D4D4\">))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                      )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                   )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                )   <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">           <\/span><span style=\"color: #569CD6\">INTO<\/span><span style=\"color: #D4D4D4\"> l_xml<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">           <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">table<\/span><span style=\"color: #D4D4D4\">(in_deps);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          <\/span><span style=\"color: #569CD6\">RETURN<\/span><span style=\"color: #D4D4D4\"> l_xml;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">END<\/span><span style=\"color: #D4D4D4\"> get_fragment;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #6A9955\">---<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">PROCEDURE<\/span><span style=\"color: #D4D4D4\"> add_to_result(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">         io_result    <\/span><span style=\"color: #569CD6\">IN<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">OUT<\/span><span style=\"color: #D4D4D4\"> XMLTYPE,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">         in_fragment  <\/span><span style=\"color: #569CD6\">IN<\/span><span style=\"color: #D4D4D4\">     XMLTYPE<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      ) <\/span><span style=\"color: #569CD6\">IS<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">BEGIN<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">         <\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> xmlquery(<\/span><span style=\"color: #CE9178\">&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #CE9178\">                   copy $i := $p1 modify<\/span><\/span>\n<span class=\"line\"><span style=\"color: #CE9178\">                   (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #CE9178\">                      for $j in $i\/xml <\/span><\/span>\n<span class=\"line\"><span style=\"color: #CE9178\">                      return insert node $p2 into $j<\/span><\/span>\n<span class=\"line\"><span style=\"color: #CE9178\">                   )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #CE9178\">                   return $i&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                   PASSING io_result <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&quot;p1&quot;<\/span><span style=\"color: #D4D4D4\">, in_fragment.extract(<\/span><span style=\"color: #CE9178\">&#39;\/xml\/row&#39;<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&quot;p2&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                   RETURNING CONTENT<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">           <\/span><span style=\"color: #569CD6\">INTO<\/span><span style=\"color: #D4D4D4\"> io_result<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">           <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> dual;  <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">END<\/span><span style=\"color: #D4D4D4\"> add_to_result;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #569CD6\">BEGIN<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">FOR<\/span><span style=\"color: #D4D4D4\"> r <\/span><span style=\"color: #569CD6\">IN<\/span><span style=\"color: #D4D4D4\"> (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">         <\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">owner<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #569CD6\">type<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #569CD6\">name<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">           <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> XMLTABLE (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                   <\/span><span style=\"color: #CE9178\">&#39;\/xml\/row\/key&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                   PASSING in_xml<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                   COLUMNS <\/span><span style=\"color: #569CD6\">owner<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">VARCHAR2<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #B5CEA8\">128<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #569CD6\">PATH<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&#39;owner&#39;<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                           <\/span><span style=\"color: #569CD6\">type<\/span><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">VARCHAR2<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #B5CEA8\">128<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #569CD6\">PATH<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&#39;type&#39;<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                           <\/span><span style=\"color: #569CD6\">name<\/span><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">VARCHAR2<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #B5CEA8\">128<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #569CD6\">PATH<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&#39;name&#39;<\/span><span style=\"color: #D4D4D4\">                           <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      ) <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">LOOP<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">         l_deps := sys.ora_mining_varchar2_nt();<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">         add_children(l_deps, in_xml, r.owner, r.type, r.name);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">         add_to_result(l_result, get_fragment(l_deps, r.owner, r.type, r.name));<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">END<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">LOOP<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">RETURN<\/span><span style=\"color: #D4D4D4\"> l_result;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #569CD6\">END<\/span><span style=\"color: #D4D4D4\"> get_dep;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #6A9955\">-- application users in scope of the analysis<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #6A9955\">-- other users are treated as if they were not installed<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">   app_user <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> (<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> username<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> dba_users<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">       <\/span><span style=\"color: #569CD6\">WHERE<\/span><span style=\"color: #D4D4D4\"> oracle_maintained = <\/span><span style=\"color: #CE9178\">&#39;N&#39;<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #6A9955\">-- SYS, SYSTEM, SYSAUX, ...<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">         <\/span><span style=\"color: #569CD6\">AND<\/span><span style=\"color: #D4D4D4\"> username <\/span><span style=\"color: #569CD6\">NOT<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">IN<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #CE9178\">&#39;FTLDB&#39;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#39;PLSCOPE&#39;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#39;UT3&#39;<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">   ),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #6A9955\">-- materialize relevant PL\/Scope identifiers to avoid very bad execution plans<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   identifiers <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #6A9955\">--+ materialize<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             <\/span><span style=\"color: #569CD6\">owner<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             object_type, <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             object_name<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> dba_identifiers i<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       <\/span><span style=\"color: #569CD6\">WHERE<\/span><span style=\"color: #D4D4D4\"> usage_context_id = <\/span><span style=\"color: #B5CEA8\">0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">         <\/span><span style=\"color: #569CD6\">AND<\/span><span style=\"color: #D4D4D4\"> object_type <\/span><span style=\"color: #569CD6\">IN<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #CE9178\">&#39;PACKAGE BODY&#39;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#39;TYPE BODY&#39;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#39;FUNCTION&#39;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#39;PROCEDURE&#39;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#39;TRIGGER&#39;<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   ),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #6A9955\">-- PL\/SQL objects without PL\/Scope metadata<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   missing_plscope_obj <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> o.owner, o.object_type, o.object_name<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> dba_objects o<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">JOIN<\/span><span style=\"color: #D4D4D4\"> app_user u <\/span><span style=\"color: #569CD6\">ON<\/span><span style=\"color: #D4D4D4\"> u.username = o.owner<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">LEFT JOIN<\/span><span style=\"color: #D4D4D4\"> identifiers i<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          <\/span><span style=\"color: #569CD6\">ON<\/span><span style=\"color: #D4D4D4\"> i.owner = o.owner<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             <\/span><span style=\"color: #569CD6\">AND<\/span><span style=\"color: #D4D4D4\"> i.object_type = o.object_type<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             <\/span><span style=\"color: #569CD6\">AND<\/span><span style=\"color: #D4D4D4\"> i.object_name = o.object_name<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       <\/span><span style=\"color: #569CD6\">WHERE<\/span><span style=\"color: #D4D4D4\"> o.object_type <\/span><span style=\"color: #569CD6\">IN<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #CE9178\">&#39;PACKAGE BODY&#39;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#39;TYPE BODY&#39;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#39;FUNCTION&#39;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#39;PROCEDURE&#39;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#39;TRIGGER&#39;<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">         <\/span><span style=\"color: #569CD6\">AND<\/span><span style=\"color: #D4D4D4\"> i.object_name <\/span><span style=\"color: #569CD6\">IS<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">NULL<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   ),   <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #6A9955\">-- PL\/SQL bodies extended by has_dml and has_transaction colums using PL\/Scope <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   plscope_obj <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> s.owner, s.object_type, s.object_name,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             <\/span><span style=\"color: #DCDCAA\">MAX<\/span><span style=\"color: #D4D4D4\"> (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                <\/span><span style=\"color: #569CD6\">CASE<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                   <\/span><span style=\"color: #569CD6\">WHEN<\/span><span style=\"color: #D4D4D4\"> s.type <\/span><span style=\"color: #569CD6\">IN<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #CE9178\">&#39;INSERT&#39;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#39;UPDATE&#39;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#39;DELETE&#39;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#39;MERGE&#39;<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #569CD6\">THEN<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                      <\/span><span style=\"color: #B5CEA8\">1<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                   <\/span><span style=\"color: #569CD6\">ELSE<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                      <\/span><span style=\"color: #B5CEA8\">0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                <\/span><span style=\"color: #569CD6\">END<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             ) <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> has_dml,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             <\/span><span style=\"color: #DCDCAA\">MAX<\/span><span style=\"color: #D4D4D4\"> (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                <\/span><span style=\"color: #569CD6\">CASE<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                   <\/span><span style=\"color: #569CD6\">WHEN<\/span><span style=\"color: #D4D4D4\"> s.type <\/span><span style=\"color: #569CD6\">IN<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #CE9178\">&#39;COMMIT&#39;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#39;ROLLBACK&#39;<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #569CD6\">THEN<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                      <\/span><span style=\"color: #B5CEA8\">1<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                   <\/span><span style=\"color: #569CD6\">ELSE<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                      <\/span><span style=\"color: #B5CEA8\">0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                <\/span><span style=\"color: #569CD6\">END<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             ) <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> has_transaction<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> dba_statements s<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">JOIN<\/span><span style=\"color: #D4D4D4\"> app_user u <\/span><span style=\"color: #569CD6\">ON<\/span><span style=\"color: #D4D4D4\"> u.username = s.owner<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       <\/span><span style=\"color: #569CD6\">WHERE<\/span><span style=\"color: #D4D4D4\"> s.object_type <\/span><span style=\"color: #569CD6\">IN<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #CE9178\">&#39;PACKAGE BODY&#39;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#39;TYPE BODY&#39;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#39;FUNCTION&#39;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#39;PROCEDURE&#39;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#39;TRIGGER&#39;<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       <\/span><span style=\"color: #569CD6\">GROUP BY<\/span><span style=\"color: #D4D4D4\"> s.owner, s.object_type, s.object_name<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   ),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #6A9955\">-- dba_dependencies reduced to a PL\/SQL bodies<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   dep_base <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">owner<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             <\/span><span style=\"color: #569CD6\">type<\/span><span style=\"color: #D4D4D4\">, <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             <\/span><span style=\"color: #569CD6\">name<\/span><span style=\"color: #D4D4D4\">, <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             referenced_owner,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             <\/span><span style=\"color: #569CD6\">CASE<\/span><span style=\"color: #D4D4D4\"> referenced_type<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                <\/span><span style=\"color: #569CD6\">WHEN<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&#39;PACKAGE&#39;<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">THEN<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&#39;PACKAGE BODY&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                <\/span><span style=\"color: #569CD6\">WHEN<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&#39;TYPE&#39;<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">THEN<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&#39;TYPE BODY&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                <\/span><span style=\"color: #569CD6\">ELSE<\/span><span style=\"color: #D4D4D4\"> referenced_type<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             <\/span><span style=\"color: #569CD6\">END<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> referenced_type,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             referenced_name<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> dba_dependencies d<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       <\/span><span style=\"color: #569CD6\">WHERE<\/span><span style=\"color: #D4D4D4\"> referenced_type <\/span><span style=\"color: #569CD6\">IN<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #CE9178\">&#39;PACKAGE&#39;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#39;PACKAGE BODY&#39;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#39;TYPE&#39;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#39;TYPE BODY&#39;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#39;FUNCTION&#39;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#39;PROCEDURE&#39;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#39;SYNONYM&#39;<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">         <\/span><span style=\"color: #569CD6\">and<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #569CD6\">owner<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #CE9178\">&#39;PUBLIC&#39;<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">OR<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">owner<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">IN<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> username <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> app_user))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">         <\/span><span style=\"color: #569CD6\">and<\/span><span style=\"color: #D4D4D4\"> (referenced_owner = <\/span><span style=\"color: #CE9178\">&#39;PUBLIC&#39;<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">OR<\/span><span style=\"color: #D4D4D4\"> referenced_owner <\/span><span style=\"color: #569CD6\">IN<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> username <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> app_user))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   ), <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #6A9955\">-- extend dependencies by columns has_dml and has_transaction<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   dep <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">select<\/span><span style=\"color: #D4D4D4\"> d.owner,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             d.type,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             d.name, <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             d.referenced_owner, <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             d.referenced_type, <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             d.referenced_name, <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             nvl(p.has_dml, <\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> referenced_has_dml,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             nvl(p.has_transaction, <\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> referenced_has_transaction<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> dep_base d<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">LEFT JOIN<\/span><span style=\"color: #D4D4D4\"> plscope_obj p<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          <\/span><span style=\"color: #569CD6\">ON<\/span><span style=\"color: #D4D4D4\"> p.owner = d.referenced_owner<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             <\/span><span style=\"color: #569CD6\">AND<\/span><span style=\"color: #D4D4D4\"> p.object_type = d.referenced_type<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             <\/span><span style=\"color: #569CD6\">AND<\/span><span style=\"color: #D4D4D4\"> p.object_name = d.referenced_name<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   ),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #6A9955\">-- XML because JSON values are still restricted to 4000\/32767 bytes<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #6A9955\">-- see Bug 27199654 : ORA-40459 WHEN GENERATING JSON DATA<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   xml_dep <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> XMLELEMENT(<\/span><span style=\"color: #CE9178\">&quot;xml&quot;<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                XMLAGG(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                   XMLELEMENT(<\/span><span style=\"color: #CE9178\">&quot;row&quot;<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                      XMLELEMENT(<\/span><span style=\"color: #CE9178\">&quot;key&quot;<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                         XMLELEMENT(<\/span><span style=\"color: #CE9178\">&quot;owner&quot;<\/span><span style=\"color: #D4D4D4\">, d.owner),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                         XMLELEMENT(<\/span><span style=\"color: #CE9178\">&quot;type&quot;<\/span><span style=\"color: #D4D4D4\">, d.type),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                         XMLELEMENT(<\/span><span style=\"color: #CE9178\">&quot;name&quot;<\/span><span style=\"color: #D4D4D4\">, d.name)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                      ),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                      XMLELEMENT(<\/span><span style=\"color: #CE9178\">&quot;value&quot;<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                         XMLAGG(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                            XMLELEMENT(<\/span><span style=\"color: #CE9178\">&quot;dependency&quot;<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                               XMLELEMENT(<\/span><span style=\"color: #CE9178\">&quot;referenced_owner&quot;<\/span><span style=\"color: #D4D4D4\">, d.referenced_owner),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                               XMLELEMENT(<\/span><span style=\"color: #CE9178\">&quot;referenced_type&quot;<\/span><span style=\"color: #D4D4D4\">, d.referenced_type),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                               XMLELEMENT(<\/span><span style=\"color: #CE9178\">&quot;referenced_name&quot;<\/span><span style=\"color: #D4D4D4\">, d.referenced_name),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                               XMLELEMENT(<\/span><span style=\"color: #CE9178\">&quot;referenced_has_dml&quot;<\/span><span style=\"color: #D4D4D4\">, d.referenced_has_dml),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                               XMLELEMENT(<\/span><span style=\"color: #CE9178\">&quot;referenced_has_transaction&quot;<\/span><span style=\"color: #D4D4D4\">, d.referenced_has_transaction)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                            )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                         )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                      )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                   )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             ) <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> xmldoc<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> dep d<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">JOIN<\/span><span style=\"color: #D4D4D4\"> dba_objects o<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          <\/span><span style=\"color: #569CD6\">ON<\/span><span style=\"color: #D4D4D4\"> d.owner = o.owner<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">         <\/span><span style=\"color: #569CD6\">AND<\/span><span style=\"color: #D4D4D4\"> d.type = o.object_type<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">         <\/span><span style=\"color: #569CD6\">AND<\/span><span style=\"color: #D4D4D4\"> d.name = o.object_name<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       <\/span><span style=\"color: #569CD6\">WHERE<\/span><span style=\"color: #D4D4D4\"> o.owner <\/span><span style=\"color: #569CD6\">IN<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> username <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> app_user)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">         <\/span><span style=\"color: #569CD6\">AND<\/span><span style=\"color: #D4D4D4\"> o.object_type <\/span><span style=\"color: #569CD6\">IN<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #CE9178\">&#39;PACKAGE BODY&#39;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#39;TYPE BODY&#39;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#39;FUNCTION&#39;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#39;PROCEDURE&#39;<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">         <\/span><span style=\"color: #569CD6\">AND<\/span><span style=\"color: #D4D4D4\"> (d.owner, <\/span><span style=\"color: #DCDCAA\">replace<\/span><span style=\"color: #D4D4D4\">(d.type, <\/span><span style=\"color: #CE9178\">&#39; BODY&#39;<\/span><span style=\"color: #D4D4D4\">), d.name) <\/span><span style=\"color: #569CD6\">IN<\/span><span style=\"color: #D4D4D4\"> (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                <\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">owner<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #569CD6\">type<\/span><span style=\"color: #D4D4D4\">, table_name <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                 <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> dba_tab_privs<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       <\/span><span style=\"color: #569CD6\">GROUP BY<\/span><span style=\"color: #D4D4D4\"> d.owner, d.type, d.name               <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   ),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #6A9955\">-- get the object dependencies via PL\/SQL function<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #6A9955\">-- passing data as XML because the PL\/SQL function dont&#39;t have access to named subqueries<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   dep_hier <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">owner<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #569CD6\">type<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #569CD6\">name<\/span><span style=\"color: #D4D4D4\">, referenced_owner, referenced_type, referenced_name, <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             referenced_has_dml, referenced_has_transaction<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> XMLTABLE(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">               <\/span><span style=\"color: #CE9178\">&#39;\/xml\/row&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">               PASSING get_dep((<\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> xmldoc <\/span><span style=\"color: #569CD6\">from<\/span><span style=\"color: #D4D4D4\"> xml_dep))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                   COLUMNS <\/span><span style=\"color: #569CD6\">owner<\/span><span style=\"color: #D4D4D4\">                      <\/span><span style=\"color: #569CD6\">VARCHAR2<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #B5CEA8\">128<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #569CD6\">PATH<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&#39;owner&#39;<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                           <\/span><span style=\"color: #569CD6\">type<\/span><span style=\"color: #D4D4D4\">                       <\/span><span style=\"color: #569CD6\">VARCHAR2<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #B5CEA8\">128<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #569CD6\">PATH<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&#39;type&#39;<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                           <\/span><span style=\"color: #569CD6\">name<\/span><span style=\"color: #D4D4D4\">                       <\/span><span style=\"color: #569CD6\">VARCHAR2<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #B5CEA8\">128<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #569CD6\">PATH<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&#39;name&#39;<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                           referenced_owner           <\/span><span style=\"color: #569CD6\">VARCHAR2<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #B5CEA8\">128<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #569CD6\">PATH<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&#39;referenced_owner&#39;<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                           referenced_type            <\/span><span style=\"color: #569CD6\">VARCHAR2<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #B5CEA8\">128<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #569CD6\">PATH<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&#39;referenced_type&#39;<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                           referenced_name            <\/span><span style=\"color: #569CD6\">VARCHAR2<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #B5CEA8\">128<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #569CD6\">PATH<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&#39;referenced_name&#39;<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                           referenced_has_dml         <\/span><span style=\"color: #569CD6\">INTEGER<\/span><span style=\"color: #D4D4D4\">       <\/span><span style=\"color: #569CD6\">PATH<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&#39;referenced_has_dml&#39;<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                           referenced_has_transaction <\/span><span style=\"color: #569CD6\">INTEGER<\/span><span style=\"color: #D4D4D4\">       <\/span><span style=\"color: #569CD6\">PATH<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&#39;referenced_has_transaction&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   ),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #6A9955\">-- aggregate columns has_dml and has_transaction per root PL\/SQL body<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   app_plsql <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">owner<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #569CD6\">type<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> object_type, <\/span><span style=\"color: #569CD6\">name<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> object_name,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             <\/span><span style=\"color: #DCDCAA\">MAX<\/span><span style=\"color: #D4D4D4\">(referenced_has_dml) <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> has_dml,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             <\/span><span style=\"color: #DCDCAA\">MAX<\/span><span style=\"color: #D4D4D4\">(referenced_has_transaction) <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> has_transaction<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> dep_hier<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       <\/span><span style=\"color: #569CD6\">GROUP by<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">owner<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #569CD6\">type<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #569CD6\">name<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   ),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #6A9955\">-- roles as recursive structure<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   role_base <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #6A9955\">-- roles without parent (=roots)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> r.role, <\/span><span style=\"color: #569CD6\">NULL<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> parent_role<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> dba_roles r<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       <\/span><span style=\"color: #569CD6\">WHERE<\/span><span style=\"color: #D4D4D4\"> r.role <\/span><span style=\"color: #569CD6\">NOT<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">IN<\/span><span style=\"color: #D4D4D4\"> (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                <\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> p.granted_role<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                  <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> role_role_privs p<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">UNION ALL<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #6A9955\">-- roles with parent (=children)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> granted_role <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">role<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #569CD6\">role<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> parent_role<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> role_role_privs<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   ),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #6A9955\">-- roles tree, calculate role_path for every hierarchy level<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   role_tree <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">role<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             parent_role,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             sys_connect_by_path(<\/span><span style=\"color: #569CD6\">ROLE<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#39;\/&#39;<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> role_path<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> role_base<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><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\">PRIOR<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">role<\/span><span style=\"color: #D4D4D4\"> = parent_role<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   ),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #6A9955\">-- roles graph, child added to all ancestors including self<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #6A9955\">-- allows simple join to parent_role to find all descendants<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   role_graph <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">SELECT DISTINCT<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             <\/span><span style=\"color: #569CD6\">role<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             regexp_substr(role_path, <\/span><span style=\"color: #CE9178\">&#39;(\/)(\\w+)&#39;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#39;i&#39;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">2<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> parent_role<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> role_tree<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   ),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #6A9955\">-- user system privileges<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   sys_priv <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #6A9955\">-- system privileges granted directly to users<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> u.username, p.privilege<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> dba_sys_privs p<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">JOIN<\/span><span style=\"color: #D4D4D4\"> app_user u <\/span><span style=\"color: #569CD6\">ON<\/span><span style=\"color: #D4D4D4\"> u.username = p.grantee<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">UNION<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #6A9955\">-- system privileges granted directly to PUBLIC<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> u.username, p.privilege<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> dba_sys_privs p<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       <\/span><span style=\"color: #569CD6\">CROSS JOIN<\/span><span style=\"color: #D4D4D4\"> app_user u<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       <\/span><span style=\"color: #569CD6\">WHERE<\/span><span style=\"color: #D4D4D4\"> p.grantee = <\/span><span style=\"color: #CE9178\">&#39;PUBLIC&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">         <\/span><span style=\"color: #569CD6\">AND<\/span><span style=\"color: #D4D4D4\"> p.privilege <\/span><span style=\"color: #569CD6\">NOT<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">IN<\/span><span style=\"color: #D4D4D4\"> (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                <\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> r.role<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                  <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> dba_roles r<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">UNION<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #6A9955\">-- system privileges granted to users via roles<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> u.username, p.privilege<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> dba_role_privs r<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">JOIN<\/span><span style=\"color: #D4D4D4\"> app_user u <\/span><span style=\"color: #569CD6\">ON<\/span><span style=\"color: #D4D4D4\"> u.username = r.grantee<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">JOIN<\/span><span style=\"color: #D4D4D4\"> role_graph g <\/span><span style=\"color: #569CD6\">ON<\/span><span style=\"color: #D4D4D4\"> g.parent_role = r.granted_role<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">JOIN<\/span><span style=\"color: #D4D4D4\"> dba_sys_privs p <\/span><span style=\"color: #569CD6\">ON<\/span><span style=\"color: #D4D4D4\"> p.grantee = g.role<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">UNION<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #6A9955\">-- system privileges granted to PUBLIC via roles<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> u.username, p.privilege<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> dba_role_privs r<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">JOIN<\/span><span style=\"color: #D4D4D4\"> role_graph g <\/span><span style=\"color: #569CD6\">ON<\/span><span style=\"color: #D4D4D4\"> g.parent_role = r.granted_role<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">JOIN<\/span><span style=\"color: #D4D4D4\"> dba_sys_privs p <\/span><span style=\"color: #569CD6\">ON<\/span><span style=\"color: #D4D4D4\"> p.grantee = g.role<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">CROSS JOIN<\/span><span style=\"color: #D4D4D4\"> app_user u<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       <\/span><span style=\"color: #569CD6\">WHERE<\/span><span style=\"color: #D4D4D4\"> r.grantee = <\/span><span style=\"color: #CE9178\">&#39;PUBLIC&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   ),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #6A9955\">-- user object privileges<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   obj_priv <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #6A9955\">-- objects granted directly to users<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> u.username, p.owner, p.type <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> object_type, p.table_name <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> object_name<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> dba_tab_privs p<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">JOIN<\/span><span style=\"color: #D4D4D4\"> app_user u <\/span><span style=\"color: #569CD6\">ON<\/span><span style=\"color: #D4D4D4\"> u.username = p.grantee<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       <\/span><span style=\"color: #569CD6\">WHERE<\/span><span style=\"color: #D4D4D4\"> p.owner <\/span><span style=\"color: #569CD6\">IN<\/span><span style=\"color: #D4D4D4\"> (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                <\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> u2.username<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                  <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> app_user u2<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">UNION<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #6A9955\">-- objects granted to users via roles<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> u.username, p.owner, p.type <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> object_type, p.table_name <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> object_name<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> dba_role_privs r<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">JOIN<\/span><span style=\"color: #D4D4D4\"> app_user u <\/span><span style=\"color: #569CD6\">ON<\/span><span style=\"color: #D4D4D4\"> u.username = r.grantee<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">JOIN<\/span><span style=\"color: #D4D4D4\"> role_graph g <\/span><span style=\"color: #569CD6\">ON<\/span><span style=\"color: #D4D4D4\"> g.parent_role = r.granted_role<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">JOIN<\/span><span style=\"color: #D4D4D4\"> dba_tab_privs p <\/span><span style=\"color: #569CD6\">ON<\/span><span style=\"color: #D4D4D4\"> p.grantee = g.role<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       <\/span><span style=\"color: #569CD6\">WHERE<\/span><span style=\"color: #D4D4D4\"> p.owner <\/span><span style=\"color: #569CD6\">IN<\/span><span style=\"color: #D4D4D4\"> (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                <\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> u2.username<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                  <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> app_user u2<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #6A9955\">-- objects granted to PUBLIC<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">UNION<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> u.username, p.owner, p.type <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> object_type, p.table_name <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> object_name<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> dba_tab_privs p<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       <\/span><span style=\"color: #569CD6\">CROSS JOIN<\/span><span style=\"color: #D4D4D4\"> app_user u<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       <\/span><span style=\"color: #569CD6\">WHERE<\/span><span style=\"color: #D4D4D4\"> p.owner <\/span><span style=\"color: #569CD6\">IN<\/span><span style=\"color: #D4D4D4\"> (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                <\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> u2.username<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                  <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> app_user u2<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">         <\/span><span style=\"color: #569CD6\">AND<\/span><span style=\"color: #D4D4D4\"> p.grantee = <\/span><span style=\"color: #CE9178\">&#39;PUBLIC&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   ),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #6A9955\">-- issues if user is configured in the connection pool of a middle tier<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   issues <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">     <\/span><span style=\"color: #6A9955\">-- privileges not part of CONNECT role<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> username,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             <\/span><span style=\"color: #CE9178\">&#39;SYS&#39;<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">owner<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             <\/span><span style=\"color: #CE9178\">&#39;PRIVILEGE&#39;<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> object_type,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             privilege <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> object_name,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             <\/span><span style=\"color: #CE9178\">&#39;Privilege is not part of the CONNECT role&#39;<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> issue<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> sys_priv<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       <\/span><span style=\"color: #569CD6\">WHERE<\/span><span style=\"color: #D4D4D4\"> privilege <\/span><span style=\"color: #569CD6\">NOT<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">IN<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #CE9178\">&#39;CREATE SESSION&#39;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#39;SET CONTAINER&#39;<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #6A9955\">-- access to non PL\/SQL units<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">UNION ALL<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> username,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             <\/span><span style=\"color: #569CD6\">owner<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             object_type,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             object_name,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             <\/span><span style=\"color: #CE9178\">&#39;Access to non-PL\/SQL unit&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> obj_priv<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       <\/span><span style=\"color: #569CD6\">WHERE<\/span><span style=\"color: #D4D4D4\"> object_type <\/span><span style=\"color: #569CD6\">NOT<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">IN<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #CE9178\">&#39;PACKAGE&#39;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#39;TYPE&#39;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#39;FUNCTION&#39;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#39;PROCEDURE&#39;<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       <\/span><span style=\"color: #6A9955\">-- own objects<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">UNION ALL<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> u.username,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             o.owner,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             o.object_type,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             o.object_name,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             <\/span><span style=\"color: #CE9178\">&#39;Connect user must not own any object&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> app_user u<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">JOIN<\/span><span style=\"color: #D4D4D4\"> dba_objects o <\/span><span style=\"color: #569CD6\">ON<\/span><span style=\"color: #D4D4D4\"> o.owner = u.username<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #6A9955\">-- missing CREATE SESSION privilege<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">UNION ALL<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> u.username,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             <\/span><span style=\"color: #CE9178\">&#39;SYS&#39;<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             <\/span><span style=\"color: #CE9178\">&#39;PRIVILEGE&#39;<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             <\/span><span style=\"color: #CE9178\">&#39;CREATE SESSION&#39;<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             <\/span><span style=\"color: #CE9178\">&#39;Privilege is missing, but required&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> app_user u<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       <\/span><span style=\"color: #569CD6\">WHERE<\/span><span style=\"color: #D4D4D4\"> u.username <\/span><span style=\"color: #569CD6\">NOT<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">IN<\/span><span style=\"color: #D4D4D4\"> (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                <\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> username<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                  <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> sys_priv<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                 <\/span><span style=\"color: #569CD6\">WHERE<\/span><span style=\"color: #D4D4D4\"> privilege = <\/span><span style=\"color: #CE9178\">&#39;CREATE SESSION&#39;<\/span><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #6A9955\">-- missing PL\/Scope metadata leads to wrong results<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">UNION ALL<\/span><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> p.username,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             p.owner, <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             p.object_type, <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             p.object_name, <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             <\/span><span style=\"color: #CE9178\">&#39;PL\/Scope metadata is missing, required for analysis&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> obj_priv p<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">JOIN<\/span><span style=\"color: #D4D4D4\"> missing_plscope_obj s<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          <\/span><span style=\"color: #569CD6\">ON<\/span><span style=\"color: #D4D4D4\"> s.owner = p.owner<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             <\/span><span style=\"color: #569CD6\">AND<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">replace<\/span><span style=\"color: #D4D4D4\">(s.object_type, <\/span><span style=\"color: #CE9178\">&#39; BODY&#39;<\/span><span style=\"color: #D4D4D4\">) = p.object_type<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             <\/span><span style=\"color: #569CD6\">AND<\/span><span style=\"color: #D4D4D4\"> s.object_name = p.object_name<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #6A9955\">-- access to PL\/SQL units updating database state without COMMIT\/ROLLBACK<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">UNION ALL<\/span><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> p.username,<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">             p.owner,<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">             p.object_type,<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">             p.object_name,<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">             <\/span><span style=\"color: #CE9178\">&#39;INSERT\/UPDATE\/DELETE\/MERGE without COMMIT\/ROLLBACK&#39;<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> obj_priv p<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">JOIN<\/span><span style=\"color: #D4D4D4\"> app_plsql a<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">          <\/span><span style=\"color: #569CD6\">ON<\/span><span style=\"color: #D4D4D4\"> a.owner = p.owner<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">             <\/span><span style=\"color: #569CD6\">AND<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">replace<\/span><span style=\"color: #D4D4D4\">(a.object_type, <\/span><span style=\"color: #CE9178\">&#39; BODY&#39;<\/span><span style=\"color: #D4D4D4\">) = p.object_type<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">             <\/span><span style=\"color: #569CD6\">AND<\/span><span style=\"color: #D4D4D4\"> a.object_name = p.object_name<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">       <\/span><span style=\"color: #569CD6\">WHERE<\/span><span style=\"color: #D4D4D4\"> p.object_type <\/span><span style=\"color: #569CD6\">IN<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #CE9178\">&#39;PACKAGE&#39;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#39;TYPE&#39;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#39;FUNCTION&#39;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&#39;PROCEDURE&#39;<\/span><span style=\"color: #D4D4D4\">) <\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">         <\/span><span style=\"color: #569CD6\">AND<\/span><span style=\"color: #D4D4D4\"> a.has_dml = <\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">AND<\/span><span style=\"color: #D4D4D4\"> a.has_transaction = <\/span><span style=\"color: #B5CEA8\">0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   ),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #6A9955\">-- aggregate issues per user<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   issue_aggr <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> u.username, <\/span><span style=\"color: #DCDCAA\">COUNT<\/span><span style=\"color: #D4D4D4\">(i.username) issue_count<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> app_user u<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">LEFT JOIN<\/span><span style=\"color: #D4D4D4\"> issues i <\/span><span style=\"color: #569CD6\">ON<\/span><span style=\"color: #D4D4D4\"> i.username = u.username<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       <\/span><span style=\"color: #569CD6\">GROUP BY<\/span><span style=\"color: #D4D4D4\"> u.username<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   ),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #6A9955\">-- user summary (calculate is_smartdb_property_3_met)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   summary <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> username,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             <\/span><span style=\"color: #569CD6\">CASE<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                <\/span><span style=\"color: #569CD6\">WHEN<\/span><span style=\"color: #D4D4D4\"> issue_count = <\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">THEN<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                   <\/span><span style=\"color: #CE9178\">&#39;YES&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                <\/span><span style=\"color: #569CD6\">ELSE<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                   <\/span><span style=\"color: #CE9178\">&#39;NO&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             <\/span><span style=\"color: #569CD6\">END<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> is_smartdb_property_3_met,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">             issue_count<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> issue_aggr<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       <\/span><span style=\"color: #569CD6\">ORDER BY<\/span><span style=\"color: #D4D4D4\"> is_smartdb_property_3_met <\/span><span style=\"color: #569CD6\">DESC<\/span><span style=\"color: #D4D4D4\">, username<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">-- main<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> * <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> summary<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">WHERE<\/span><span style=\"color: #D4D4D4\"> issue_count = <\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">\/<\/span><\/span><\/code><\/pre><\/div>\n\n\n<p><\/div><\/div>\n<br \/>\n<\/div><\/div>\n\n\n\n\n<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\">Check SmartDB property 3: result (complying connect users)<\/span><span role=\"button\" tabindex=\"0\" data-code=\"USERNAME                 IS_SMARTDB_PROPERTY_3_MET ISSUE_COUNT\n------------------------ ------------------------- -----------\nAPEX_REST_PUBLIC_USER    YES                                 0\nTHE_BAD_USER             YES                                 0\nTHE_GOOD_USER            YES                                 0\" 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\">USERNAME                 IS_SMARTDB_PROPERTY_3_MET ISSUE_COUNT<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">------------------------ ------------------------- -----------<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">APEX_REST_PUBLIC_USER    YES                                 0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">THE_BAD_USER             YES                                 0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">THE_GOOD_USER            YES                                 0<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>If you are using a connect user that is not listed as a result, then your application is not SmartDB.<\/p>\n\n\n\n<p>The query checks also the SmartDB properties 1 and 2. However, the query produces only a result if the PL\/SQL bodies in application users are compiled with PL\/Scope (see script above). Change the main part of the query to <code>SELECT * from issues<\/code> if you want to know why a connect user is not shown in the result.<\/p>\n\n\n\n<p>BTW: the check results for the SmartDB properties 2 and 3 are identical because&nbsp;<code>THE_BAD_USER<\/code> and <code>THE_GOOD_USER<\/code> do not have access to write operations.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><a name=\"property_4\"><\/a>4. SQL statements are written by human hand<\/h2>\n\n\n\n<p>If you generate&nbsp;<code>SELECT<\/code>, <code>INSERT<\/code>, <code>UPDATE<\/code>,&nbsp; <code>DELETE<\/code> or&nbsp;<code>MERGE<\/code> statements, then your application is not SmartDB.<\/p>\n\n\n\n<p>I see the following reasons to generate code (including SQL statements):<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Don&#8217;t repeat yourself (<a href=\"https:\/\/en.wikipedia.org\/wiki\/Don%27t_repeat_yourself\">DRY principle<\/a>). Striving for DRYness leads to better data models, better designs and better code. In some cases, code generators are required to achieve the goal.<\/li>\n\n\n\n<li>Reduce the overall complexity by using a domain-specific language (DSL). Enforce rules and conventions in the DSL and the code templates. This leads to a smaller code base and improves productivity.<\/li>\n<\/ul>\n\n\n\n<p>A generator creates code at design\/build time or at runtime. Both approaches have pros and cons. Code generators producing code at runtime are easier to deploy but may produce more runtime errors, are harder to debug and come with a performance penalty. Code generators producing code at design\/build time are more extensive and more costly to deploy, are much easier to debug, have better runtime performance and produce errors at install time rather than runtime.<\/p>\n\n\n\n<p>Even if generated code should look like written by human hand, it should never become a part of your code base. Generated code is derived from something else. This &#8220;something else&#8221; (generator, code templates, generator input) is part of your code base. Do not amend generated code and keep your code base as small as possible. It&#8217;s okay to keep the generated code also in the version control system, but you should separate it from the &#8220;real code base&#8221;. It should be absolutely clear that the generated code is completely replaced by a subsequent generator run.<\/p>\n\n\n\n<p>Code generators offer a high value when used correctly.&nbsp;Therefore, the general ban on the use of generators is simply ignorant.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><a name=\"property_5\"><\/a>5. SQL statements exploit the full power of set-based SQL<\/h2>\n\n\n\n<p>If you use row-by-row processing when set-based SQL is feasible and noticeably faster, then your application is not SmartDB.<\/p>\n\n\n\n<p>This is the most important SmartDB property. Set-based SQL is the key to good performance. It means that you are using the database as a processing engine and not as a data store only.<\/p>\n\n\n\n<p>You should make it a habit to minimize the total number of executed SQL statements to get a job done. Less loops, more set-based SQL. In the end, it is simpler. You tell the database what you want and the optimizer figures out how to do it efficiently.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Conclusion<\/h2>\n\n\n\n<p>If you use set-based SQL in your application and manually craft your SQL statements, then you can check with a single SQL statement, if your application is really SmartDB. Don&#8217;t be disappointed, if it is not. Besides some demo applications, I haven&#8217;t seen a SmartDB application and I do not expect to see one soon.<\/p>\n\n\n\n<p>The SmartDB idea is based on sound analysis and some good advice (see Toon Koppelaar&#8217;s excellent&nbsp;video and slide deck). But the resulting SmartDB definition overshoots the mark. It focuses too much on PL\/SQL and ignores the capabilities of database-aware tools. These tools support SQL (or MDX) as the primary interface to the database (especially for queries). Using another path to the database is usually possible, but less efficient from a development cost and time-to-market perspective.<\/p>\n\n\n\n<p>It looks like there is currently no&nbsp;way to refine the SmartDB definition making this approach broadly usable. The recommended alternative is to come up with your own definition. My <a href=\"https:\/\/www.salvis.com\/blog\/2018\/07\/18\/the-pink-database-paradigm-pinkdb\/\">next post<\/a> is dealing with that topic. However, I&#8217;d still like to see a SmartDB 2.0 definition that tolerates views as part of the API, generated code and transaction control statements by the API caller.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>I recently had a few discussions regarding the Smart Database Paradigm (SmartDB) with long-standing customers, new customers, partners, competitors and colleagues. Some people think that using APEX and PL\/SQL in their database application is SmartDB. But it is not that simple.&nbsp;Bryn Llewelyn defined the term &#8220;Smart Database Paradigm&#8221; (SmartDB) in his talk&nbsp;Guarding<span class=\"excerpt-hellip\"> [\u2026]<\/span><\/p>\n","protected":false},"author":1,"featured_media":8047,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5],"tags":[109,97,13,103,85,104],"class_list":["post-8527","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-oracle","tag-pinkdb","tag-plscope","tag-plsql","tag-smartdb","tag-sql","tag-sql-injection"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.3 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Is Your Application SmartDB? - Philipp Salvisberg&#039;s Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.salvis.com\/blog\/2018\/07\/18\/is-your-application-smartdb\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Is Your Application SmartDB? - Philipp Salvisberg&#039;s Blog\" \/>\n<meta property=\"og:description\" content=\"I recently had a few discussions regarding the Smart Database Paradigm (SmartDB) with long-standing customers, new customers, partners, competitors and colleagues. Some people think that using APEX and PL\/SQL in their database application is SmartDB. But it is not that simple.&nbsp;Bryn Llewelyn defined the term &#8220;Smart Database Paradigm&#8221; (SmartDB) in his talk&nbsp;Guarding [\u2026]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.salvis.com\/blog\/2018\/07\/18\/is-your-application-smartdb\/\" \/>\n<meta property=\"og:site_name\" content=\"Philipp Salvisberg&#039;s Blog\" \/>\n<meta property=\"article:published_time\" content=\"2018-07-18T17:52:54+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-11-08T01:36:10+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/12\/the_good_layers.png\" \/>\n\t<meta property=\"og:image:width\" content=\"618\" \/>\n\t<meta property=\"og:image:height\" content=\"618\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Philipp Salvisberg\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@phsalvisberg\" \/>\n<meta name=\"twitter:site\" content=\"@phsalvisberg\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Philipp Salvisberg\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"17 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2018\\\/07\\\/18\\\/is-your-application-smartdb\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2018\\\/07\\\/18\\\/is-your-application-smartdb\\\/\"},\"author\":{\"name\":\"Philipp Salvisberg\",\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/#\\\/schema\\\/person\\\/34352245c48678b1a5a05d4bc1339515\"},\"headline\":\"Is Your Application SmartDB?\",\"datePublished\":\"2018-07-18T17:52:54+00:00\",\"dateModified\":\"2023-11-08T01:36:10+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2018\\\/07\\\/18\\\/is-your-application-smartdb\\\/\"},\"wordCount\":1954,\"commentCount\":6,\"publisher\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/#\\\/schema\\\/person\\\/34352245c48678b1a5a05d4bc1339515\"},\"image\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2018\\\/07\\\/18\\\/is-your-application-smartdb\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/wp-content\\\/uploads\\\/2017\\\/12\\\/the_good_layers.png\",\"keywords\":[\"PinkDB\",\"PL\\\/Scope\",\"PL\\\/SQL\",\"SmartDB\",\"SQL\",\"SQL Injection\"],\"articleSection\":[\"Oracle\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2018\\\/07\\\/18\\\/is-your-application-smartdb\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2018\\\/07\\\/18\\\/is-your-application-smartdb\\\/\",\"url\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2018\\\/07\\\/18\\\/is-your-application-smartdb\\\/\",\"name\":\"Is Your Application SmartDB? - Philipp Salvisberg&#039;s Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2018\\\/07\\\/18\\\/is-your-application-smartdb\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2018\\\/07\\\/18\\\/is-your-application-smartdb\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/wp-content\\\/uploads\\\/2017\\\/12\\\/the_good_layers.png\",\"datePublished\":\"2018-07-18T17:52:54+00:00\",\"dateModified\":\"2023-11-08T01:36:10+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2018\\\/07\\\/18\\\/is-your-application-smartdb\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2018\\\/07\\\/18\\\/is-your-application-smartdb\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2018\\\/07\\\/18\\\/is-your-application-smartdb\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/wp-content\\\/uploads\\\/2017\\\/12\\\/the_good_layers.png\",\"contentUrl\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/wp-content\\\/uploads\\\/2017\\\/12\\\/the_good_layers.png\",\"width\":618,\"height\":618},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2018\\\/07\\\/18\\\/is-your-application-smartdb\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Is Your Application SmartDB?\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/\",\"name\":\"Philipp Salvisberg&#039;s Blog\",\"description\":\"Database-centric development\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/#\\\/schema\\\/person\\\/34352245c48678b1a5a05d4bc1339515\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/#\\\/schema\\\/person\\\/34352245c48678b1a5a05d4bc1339515\",\"name\":\"Philipp Salvisberg\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/wp-content\\\/uploads\\\/2010\\\/11\\\/phs_trivadis4.jpg\",\"url\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/wp-content\\\/uploads\\\/2010\\\/11\\\/phs_trivadis4.jpg\",\"contentUrl\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/wp-content\\\/uploads\\\/2010\\\/11\\\/phs_trivadis4.jpg\",\"width\":400,\"height\":400,\"caption\":\"Philipp Salvisberg\"},\"logo\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/wp-content\\\/uploads\\\/2010\\\/11\\\/phs_trivadis4.jpg\"},\"sameAs\":[\"http:\\\/\\\/www.salvis.com\\\/\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Is Your Application SmartDB? - Philipp Salvisberg&#039;s Blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.salvis.com\/blog\/2018\/07\/18\/is-your-application-smartdb\/","og_locale":"en_US","og_type":"article","og_title":"Is Your Application SmartDB? - Philipp Salvisberg&#039;s Blog","og_description":"I recently had a few discussions regarding the Smart Database Paradigm (SmartDB) with long-standing customers, new customers, partners, competitors and colleagues. Some people think that using APEX and PL\/SQL in their database application is SmartDB. But it is not that simple.&nbsp;Bryn Llewelyn defined the term &#8220;Smart Database Paradigm&#8221; (SmartDB) in his talk&nbsp;Guarding [\u2026]","og_url":"https:\/\/www.salvis.com\/blog\/2018\/07\/18\/is-your-application-smartdb\/","og_site_name":"Philipp Salvisberg&#039;s Blog","article_published_time":"2018-07-18T17:52:54+00:00","article_modified_time":"2023-11-08T01:36:10+00:00","og_image":[{"width":618,"height":618,"url":"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/12\/the_good_layers.png","type":"image\/png"}],"author":"Philipp Salvisberg","twitter_card":"summary_large_image","twitter_creator":"@phsalvisberg","twitter_site":"@phsalvisberg","twitter_misc":{"Written by":"Philipp Salvisberg","Est. reading time":"17 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.salvis.com\/blog\/2018\/07\/18\/is-your-application-smartdb\/#article","isPartOf":{"@id":"https:\/\/www.salvis.com\/blog\/2018\/07\/18\/is-your-application-smartdb\/"},"author":{"name":"Philipp Salvisberg","@id":"https:\/\/www.salvis.com\/blog\/#\/schema\/person\/34352245c48678b1a5a05d4bc1339515"},"headline":"Is Your Application SmartDB?","datePublished":"2018-07-18T17:52:54+00:00","dateModified":"2023-11-08T01:36:10+00:00","mainEntityOfPage":{"@id":"https:\/\/www.salvis.com\/blog\/2018\/07\/18\/is-your-application-smartdb\/"},"wordCount":1954,"commentCount":6,"publisher":{"@id":"https:\/\/www.salvis.com\/blog\/#\/schema\/person\/34352245c48678b1a5a05d4bc1339515"},"image":{"@id":"https:\/\/www.salvis.com\/blog\/2018\/07\/18\/is-your-application-smartdb\/#primaryimage"},"thumbnailUrl":"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/12\/the_good_layers.png","keywords":["PinkDB","PL\/Scope","PL\/SQL","SmartDB","SQL","SQL Injection"],"articleSection":["Oracle"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.salvis.com\/blog\/2018\/07\/18\/is-your-application-smartdb\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.salvis.com\/blog\/2018\/07\/18\/is-your-application-smartdb\/","url":"https:\/\/www.salvis.com\/blog\/2018\/07\/18\/is-your-application-smartdb\/","name":"Is Your Application SmartDB? - Philipp Salvisberg&#039;s Blog","isPartOf":{"@id":"https:\/\/www.salvis.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.salvis.com\/blog\/2018\/07\/18\/is-your-application-smartdb\/#primaryimage"},"image":{"@id":"https:\/\/www.salvis.com\/blog\/2018\/07\/18\/is-your-application-smartdb\/#primaryimage"},"thumbnailUrl":"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/12\/the_good_layers.png","datePublished":"2018-07-18T17:52:54+00:00","dateModified":"2023-11-08T01:36:10+00:00","breadcrumb":{"@id":"https:\/\/www.salvis.com\/blog\/2018\/07\/18\/is-your-application-smartdb\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.salvis.com\/blog\/2018\/07\/18\/is-your-application-smartdb\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.salvis.com\/blog\/2018\/07\/18\/is-your-application-smartdb\/#primaryimage","url":"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/12\/the_good_layers.png","contentUrl":"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2017\/12\/the_good_layers.png","width":618,"height":618},{"@type":"BreadcrumbList","@id":"https:\/\/www.salvis.com\/blog\/2018\/07\/18\/is-your-application-smartdb\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.salvis.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Is Your Application SmartDB?"}]},{"@type":"WebSite","@id":"https:\/\/www.salvis.com\/blog\/#website","url":"https:\/\/www.salvis.com\/blog\/","name":"Philipp Salvisberg&#039;s Blog","description":"Database-centric development","publisher":{"@id":"https:\/\/www.salvis.com\/blog\/#\/schema\/person\/34352245c48678b1a5a05d4bc1339515"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.salvis.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/www.salvis.com\/blog\/#\/schema\/person\/34352245c48678b1a5a05d4bc1339515","name":"Philipp Salvisberg","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2010\/11\/phs_trivadis4.jpg","url":"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2010\/11\/phs_trivadis4.jpg","contentUrl":"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2010\/11\/phs_trivadis4.jpg","width":400,"height":400,"caption":"Philipp Salvisberg"},"logo":{"@id":"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2010\/11\/phs_trivadis4.jpg"},"sameAs":["http:\/\/www.salvis.com\/"]}]}},"_links":{"self":[{"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/posts\/8527","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/comments?post=8527"}],"version-history":[{"count":119,"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/posts\/8527\/revisions"}],"predecessor-version":[{"id":12641,"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/posts\/8527\/revisions\/12641"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/media\/8047"}],"wp:attachment":[{"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/media?parent=8527"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/categories?post=8527"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/tags?post=8527"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}