{"id":3788,"date":"2021-04-14T08:39:21","date_gmt":"2021-04-14T08:39:21","guid":{"rendered":"https:\/\/swiv.com.br\/enabling-common-users-to-view-information-about-specific-pdbs\/"},"modified":"2026-05-27T20:02:33","modified_gmt":"2026-05-27T19:02:33","slug":"enabling-common-users-to-view-information-about-specific-pdbs","status":"publish","type":"post","link":"https:\/\/swiv.com.br\/index.php\/2021\/04\/14\/enabling-common-users-to-view-information-about-specific-pdbs\/","title":{"rendered":"Enabling Common Users to View Information about specific PDBs"},"content":{"rendered":"<p>Quando fui pensar em reproduzir este artigo, confesso que criei muita confus\u00e3o com o recurso que tentarei demonstrar, e precisei assistir minhas aulas umas duas ou tr\u00eas vezes (do curso do Ahmed Baraka, link <a rel=\"\\&quot;noreferrer noopener\" noopener=\"\" href=\"https:\/\/www.ahmedbaraka.com\/\" target=\"\\&quot;_blank\\&quot;\">AQUI<\/a>) , recorrer \u00e0 documenta\u00e7\u00e3o oficial da Oracle (link <a rel=\"\\&quot;noreferrer noopener\" noopener=\"\" href=\"https:\/\/docs.oracle.com\/database\/121\/SQLRF\/statements_4003.htm#SQLRF01103\" target=\"\\&quot;_blank\\&quot;\">AQUI<\/a>)e aos artigos do Tim Hall (link <a href=\"https:\/\/oracle-base.com\/articles\/12c\/multitenant-querying-container-data-objects-12c\" target=\"\\&quot;_blank\\&quot;\" rel=\"\\&quot;noreferrer noopener\" noopener=\"\">AQUI<\/a>). Mas o bom disso \u00e9 tentarmos aprender algo novo sempre, e \u00e9 isso que faz do nosso trabalho algo desafiador e estimulante.<\/p>\n\n<p>Quando criamos um common user em nosso ambiente Multitenant, n\u00f3s usamos o par\u00e2metro CONTAINER=ALL, que significa que aquele usu\u00e1rio est\u00e1 sendo criado em todos os containers (e naqueles que ser\u00e3o criados posteriormente). O mesmo conceito se refere ao conceder privil\u00e9gios. Quando este valor \u00e9 declarado, o privil\u00e9gio \u00e9 concedido em todos os containers. Caso precise de exemplo, demonstrei <a rel=\"\\&quot;noreferrer noopener\" noopener=\"\" href=\"https:\/\/swiv.com.br\/managing-multitenant-common-users\/\" target=\"\\&quot;_blank\\&quot;\">NESTE<\/a> artigo. At\u00e9 aqui, tudo bem. Observemos nosso usu\u00e1rio abaixo:<\/p>\n\n<div class=\"wp-block-syntaxhighlighter-code \\&quot;wp-block-syntaxhighlighter-code\\&quot;\"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\n&#x5B;oracle@quiasma ~]$ sqlplus \/ as sysdba\n \nSQL*Plus: Release 18.0.0.0.0 - Production on Tue Apr 13 20:25:27 2021\nVersion 18.13.0.0.0\n \nCopyright (c) 1982, 2018, Oracle.  All rights reserved.\n \n \nConnected to:\nOracle Database 18c Enterprise Edition Release 18.0.0.0.0 - Production\nVersion 18.13.0.0.0\n \nSQL&gt; CREATE USER C##BRUNO2 IDENTIFIED BY oracle CONTAINER=ALL;\n \nUser created.\n \nSQL&gt; GRANT CREATE SESSION TO C##BRUNO2 CONTAINER=ALL;\n \nGrant succeeded.\n \nSQL&gt; col username format a30\nSQL&gt; SELECT DISTINCT USERNAME,COMMON FROM CDB_USERS WHERE COMMON=&#039;YES&#039; AND USERNAME LIKE &#039;%BRUNO2%&#039;;\n \nUSERNAME                       COM\n------------------------------ ---\nC##BRUNO2                      YES\n<\/pre><\/div>\n\n\n<p>Concedendo privil\u00e9gio na view v$datafile para todos os containers:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \\&quot;wp-block-syntaxhighlighter-code\\&quot;\"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nSQL&gt; GRANT SELECT ON SYS.V_$DATAFILE TO C##BRUNO2 CONTAINER=ALL;\n \nGrant succeeded.\n<\/pre><\/div>\n\n\n<p>Logado no root container com o usu\u00e1rio criado, percebemos que a consulta retornar\u00e1 apenas os datafiles do root container (que \u00e9 o current), e n\u00e3o de todos os PDBs:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \\&quot;wp-block-syntaxhighlighter-code\\&quot;\"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nSQL&gt; CONN C##BRUNO2\/oracle\nConnected.\nSQL&gt; SHOW USER;\nUSER is &quot;C##BRUNO2&quot;\nSQL&gt; SELECT name from v$datafile;\n \nNAME\n--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\/oracle\/dados\/TALAMO\/datafile\/o1_mf_system_j3w17w26_.dbf\n\/oracle\/dados\/TALAMO\/datafile\/o1_mf_sysaux_j3w1bkdm_.dbf\n\/oracle\/dados\/TALAMO\/datafile\/o1_mf_undotbs1_j3w1cyoh_.dbf\n\/oracle\/dados\/TALAMO\/datafile\/o1_mf_users_j3w1czy4_.dbf\n<\/pre><\/div>\n\n\n<p>Se quisermos ver os datafiles de algum outro PDB, precisaremos conectar no mesmo:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \\&quot;wp-block-syntaxhighlighter-code\\&quot;\"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nSQL&gt; CONN C##BRUNO2\/oracle@HIPOFISE1\nConnected.\nSQL&gt; SHOW USER;\nUSER is &quot;C##BRUNO2&quot;\nSQL&gt; SELECT name from v$datafile;\n \nNAME\n--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\/oracle\/dados\/TALAMO\/BFC37CDFCB3A0CF9E0536A00A8C0C9C5\/datafile\/o1_mf_system_j781yvm6_.dbf\n\/oracle\/dados\/TALAMO\/BFC37CDFCB3A0CF9E0536A00A8C0C9C5\/datafile\/o1_mf_sysaux_j781yvmc_.dbf\n\/oracle\/dados\/TALAMO\/BFC37CDFCB3A0CF9E0536A00A8C0C9C5\/datafile\/o1_mf_undotbs1_j781yvmc_.dbf\n\/oracle\/dados\/TALAMO\/BFC37CDFCB3A0CF9E0536A00A8C0C9C5\/datafile\/o1_mf_users_j7824z91_.dbf\n<\/pre><\/div>\n\n\n<p>O cerne deste recurso est\u00e1 aqui: poder alterar nosso usu\u00e1rio para que possa consultar os dados de todos os containers caso queira, ou apenas algu container em espec\u00edfico, utilizando o par\u00e2metro CONTAINER_DATA. Abaixo farei uma altera\u00e7\u00e3o em nossos usu\u00e1rio e definirei o valor deste par\u00e2metro para ALL, que significa que todos os containers (inclusive os criados posteriormente) ser\u00e3o contemplados:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \\&quot;wp-block-syntaxhighlighter-code\\&quot;\"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nSQL&gt; conn \/ as sysdba\nConnected.\nSQL&gt; SHOW CON_ID CON_NAME\n \nCON_ID\n------------------------------\n1\n \nCON_NAME\n------------------------------\nCDB$ROOT\nSQL&gt; ALTER USER C##BRUNO2 SET CONTAINER_DATA=ALL FOR V_$DATAFILE CONTAINER=CURRENT;\n \nUser altered.\n<\/pre><\/div>\n\n\n<p>Realizando teste:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \\&quot;wp-block-syntaxhighlighter-code\\&quot;\"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nSQL&gt; conn C##BRUNO2\/oracle@TALAMO\nConnected.\nSQL&gt; SHOW USER;\nUSER is &quot;C##BRUNO2&quot;\nSQL&gt; SELECT name from v$datafile;\n \nNAME\n--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\/oracle\/dados\/TALAMO\/datafile\/o1_mf_system_j3w17w26_.dbf\n\/oracle\/dados\/TALAMO\/datafile\/o1_mf_sysaux_j3w1bkdm_.dbf\n\/oracle\/dados\/TALAMO\/datafile\/o1_mf_undotbs1_j3w1cyoh_.dbf\n\/oracle\/dados\/TALAMO\/datafile\/o1_mf_system_j3w1q776_.dbf\n\/oracle\/dados\/TALAMO\/datafile\/o1_mf_sysaux_j3w1q76z_.dbf\n\/oracle\/dados\/TALAMO\/datafile\/o1_mf_users_j3w1czy4_.dbf\n\/oracle\/dados\/TALAMO\/datafile\/o1_mf_undotbs1_j3w1q779_.dbf\n\/oracle\/dados\/TALAMO\/BFC37CDFCB3A0CF9E0536A00A8C0C9C5\/datafile\/o1_mf_system_j781yvm6_.dbf\n\/oracle\/dados\/TALAMO\/BFC37CDFCB3A0CF9E0536A00A8C0C9C5\/datafile\/o1_mf_sysaux_j781yvmc_.dbf\n\/oracle\/dados\/TALAMO\/BFC37CDFCB3A0CF9E0536A00A8C0C9C5\/datafile\/o1_mf_undotbs1_j781yvmc_.dbf\n\/oracle\/dados\/TALAMO\/BFC37CDFCB3A0CF9E0536A00A8C0C9C5\/datafile\/o1_mf_users_j7824z91_.dbf\n\/oracle\/dados\/TALAMO\/BFE3BC783DEA324EE0536A00A8C0486E\/datafile\/o1_mf_system_j7d9759c_.dbf\n\/oracle\/dados\/TALAMO\/BFE3BC783DEA324EE0536A00A8C0486E\/datafile\/o1_mf_sysaux_j7d9759j_.dbf\n\/oracle\/dados\/TALAMO\/BFE3BC783DEA324EE0536A00A8C0486E\/datafile\/o1_mf_undotbs1_j7d9759k_.dbf\n \n14 rows selected.\n<\/pre><\/div>\n\n\n<p>Agora imaginemos que temos um common user que por algum motivo, n\u00e3o pode ter acesso \u00e0 um PDB em espec\u00edfico. Com este recurso, podemos configurar o acesso aos outros PDBs, exceto aquele que n\u00e3o desejamos. Vejamos os PDBs que possuo em meu laborat\u00f3rio:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \\&quot;wp-block-syntaxhighlighter-code\\&quot;\"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nSQL&gt; conn \/ as sysdba\nConnected.\nSQL&gt; COL NAME FOR A40\nSQL&gt; SELECT NAME,OPEN_MODE,GUID FROM V$PDBS;\n \nNAME                                     OPEN_MODE  GUID\n---------------------------------------- ---------- --------------------------------\nPDB$SEED                                 READ ONLY  BC8B772AA6A82204E0536B00A8C0CF6B\nHIPOFISE1                                READ WRITE BFC37CDFCB3A0CF9E0536A00A8C0C9C5\nHIPOFISE2                                READ WRITE BFE3BC783DEA324EE0536A00A8C0486E\n<\/pre><\/div>\n\n\n<p>Vamos simular que n\u00e3o queremos que nosso common user tenha acesso \u00e0 v$datafile do PDB HIPOFISE2. Podemos realizar a seguinte altera\u00e7\u00e3o:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \\&quot;wp-block-syntaxhighlighter-code\\&quot;\"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nSQL&gt; ALTER USER C##BRUNO2 SET CONTAINER_DATA=(CDB$ROOT, HIPOFISE1) FOR V_$DATAFILE CONTAINER=CURRENT;\n \nUser altered.\n<\/pre><\/div>\n\n\n<p>Percebemos que o usu\u00e1rio n\u00e3o consegue retornar as informa\u00e7\u00f5es do PDB HIPOFISE2:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \\&quot;wp-block-syntaxhighlighter-code\\&quot;\"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nSQL&gt; CONN C##BRUNO2\/oracle@TALAMO\nConnected.\nSQL&gt; COL NAME FOR A100\nSQL&gt; SELECT NAME FROM V$DATAFILE;\n \nNAME\n----------------------------------------------------------------------------------------------------\n\/oracle\/dados\/TALAMO\/datafile\/o1_mf_system_j3w17w26_.dbf\n\/oracle\/dados\/TALAMO\/datafile\/o1_mf_sysaux_j3w1bkdm_.dbf\n\/oracle\/dados\/TALAMO\/datafile\/o1_mf_undotbs1_j3w1cyoh_.dbf\n\/oracle\/dados\/TALAMO\/datafile\/o1_mf_users_j3w1czy4_.dbf\n\/oracle\/dados\/TALAMO\/BFC37CDFCB3A0CF9E0536A00A8C0C9C5\/datafile\/o1_mf_system_j781yvm6_.dbf\n\/oracle\/dados\/TALAMO\/BFC37CDFCB3A0CF9E0536A00A8C0C9C5\/datafile\/o1_mf_sysaux_j781yvmc_.dbf\n\/oracle\/dados\/TALAMO\/BFC37CDFCB3A0CF9E0536A00A8C0C9C5\/datafile\/o1_mf_undotbs1_j781yvmc_.dbf\n\/oracle\/dados\/TALAMO\/BFC37CDFCB3A0CF9E0536A00A8C0C9C5\/datafile\/o1_mf_users_j7824z91_.dbf\n \n8 rows selected.\n<\/pre><\/div>\n\n\n<p>Para finalizar, caso precisemos consultar as configura\u00e7\u00f5es a n\u00edvel de CONTAINER_DATA, podemos usar a query abaixo:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \\&quot;wp-block-syntaxhighlighter-code\\&quot;\"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\ncolumn username format a10 \ncolumn default_attr format a7 \ncolumn owner format a6 \ncolumn object_name format a11 \ncolumn all_containers format a3 \ncolumn container_name format a10 \ncolumn con_id format 999 \nset pages 100 \nset line 200 \nSELECT USERNAME, DEFAULT_ATTR, OWNER, OBJECT_NAME, ALL_CONTAINERS, CONTAINER_NAME, CON_ID \nFROM CDB_CONTAINER_DATA WHERE username NOT IN (&#039;GSMADMIN_INTERNAL&#039;, &#039;APPQOSSYS&#039;, &#039;DBSNMP&#039;) ORDER BY USERNAME;\n<\/pre><\/div>\n\n<div class=\"wp-block-syntaxhighlighter-code \\&quot;wp-block-syntaxhighlighter-code\\&quot;\"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nSQL&gt; CONN \/ AS SYSDBA\nConnected.\nSQL&gt; column username format a10\ncolumn default_attr format a7\ncolumn owner format a6\ncolumn object_name format a11\ncolumn all_containers format a3\ncolumn container_name format a10\ncolumn con_id format 999\nset pages 100\nset line 200\nSELECT USERNAME, DEFAULT_ATTR, OWNER, OBJECT_NAME, ALL_CONTAINERS, CONTAINER_NAME, CON_ID\nFROM CDB_CONTAINER_DATA WHERE username NOT IN (&#039;GSMADMIN_INTERNAL&#039;, &#039;APPQOSSYS&#039;, &#039;DBSNMP&#039;) ORDER BY USERNAME;SQL&gt; SQL&gt; SQL&gt; SQL&gt; SQL&gt; SQL&gt; SQL&gt; SQL&gt; SQL&gt;   2\n \nUSERNAME   DEFAULT OWNER  OBJECT_NAME ALL CONTAINER_ CON_ID\n---------- ------- ------ ----------- --- ---------- ------\nC##BRUNO2  N       SYS    V_$DATAFILE N   CDB$ROOT        1\nC##BRUNO2  N       SYS    V_$DATAFILE N   HIPOFISE1       1\nC##BRUNO2  Y                          Y                   1\nDBSFWUSER  Y                          Y                   1\nSYS        Y                          Y                   1\nSYSBACKUP  Y                          Y                   1\nSYSDG      Y                          Y                   1\nSYSRAC     Y                          Y                   1\nSYSTEM     Y                          Y                   1\n \n9 rows selected.\n<\/pre><\/div>\n\n\n<p>Obs: Este procedimento foi criado pelo senhor Ahmed Baraka (www.ahmedbaraka.com) e foi apenas reproduzido por mim em um laborat\u00f3rio pessoal para fins de aprendizado.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Quando fui pensar em reproduzir este artigo, confesso que criei muita confus\u00e3o com o recurso que tentarei demonstrar, e precisei assistir minhas aulas umas duas ou tr\u00eas vezes (do curso do Ahmed Baraka, link AQUI) , recorrer \u00e0 documenta\u00e7\u00e3o oficial da Oracle (link AQUI)e aos artigos do Tim Hall (link AQUI). Mas o bom disso [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[8],"tags":[],"class_list":["post-3788","post","type-post","status-publish","format-standard","hentry","category-multitenant"],"_links":{"self":[{"href":"https:\/\/swiv.com.br\/index.php\/wp-json\/wp\/v2\/posts\/3788","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/swiv.com.br\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/swiv.com.br\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/swiv.com.br\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/swiv.com.br\/index.php\/wp-json\/wp\/v2\/comments?post=3788"}],"version-history":[{"count":1,"href":"https:\/\/swiv.com.br\/index.php\/wp-json\/wp\/v2\/posts\/3788\/revisions"}],"predecessor-version":[{"id":9172,"href":"https:\/\/swiv.com.br\/index.php\/wp-json\/wp\/v2\/posts\/3788\/revisions\/9172"}],"wp:attachment":[{"href":"https:\/\/swiv.com.br\/index.php\/wp-json\/wp\/v2\/media?parent=3788"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/swiv.com.br\/index.php\/wp-json\/wp\/v2\/categories?post=3788"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/swiv.com.br\/index.php\/wp-json\/wp\/v2\/tags?post=3788"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}