{"id":5471,"date":"2021-06-18T07:34:04","date_gmt":"2021-06-18T07:34:04","guid":{"rendered":"https:\/\/swiv.com.br\/changing-the-data-owned-by-common-users-in-multiple-pdbs\/"},"modified":"2026-05-27T20:02:31","modified_gmt":"2026-05-27T19:02:31","slug":"changing-the-data-owned-by-common-users-in-multiple-pdbs","status":"publish","type":"post","link":"https:\/\/swiv.com.br\/index.php\/2021\/06\/18\/changing-the-data-owned-by-common-users-in-multiple-pdbs\/","title":{"rendered":"Changing the data owned by common users in multiple PDBs"},"content":{"rendered":"\n<p>Temos na arquitetura Multitenant a op\u00e7\u00e3o de utilizar a cl\u00e1usula CONTAINERS tamb\u00e9m em DMLs, permitindo assim que manipulemos dados de m\u00faltiplos PDBs. Neste artigo vamos explorar alguns exemplos de uso, onde os objetos pertecem a um Common User.<\/p>\n\n\n\n<p>Coletando informa\u00e7\u00f5es do ambiente de testes:<\/p>\n\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 Thu Jun 17 05:57:14 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; SELECT NAME,OPEN_MODE,CDB FROM V$DATABASE;\n \nNAME      OPEN_MODE            CDB\n--------- -------------------- ---\nASWAN     READ WRITE           YES\n \nSQL&gt; SHOW PDBS;\n \n    CON_ID CON_NAME                       OPEN MODE  RESTRICTED\n---------- ------------------------------ ---------- ----------\n         2 PDB$SEED                       READ ONLY  NO\n         3 HIPOFISE2                      READ WRITE NO\n         4 HIPOFISE1                      READ WRITE NO\nSQL&gt; CONN C##LUXOR\/oracle\nConnected.\nSQL&gt; SELECT * FROM CONTAINERS(LOGIN_AUDIT);\n \n RECORD_ID DB    USER_ LOGIN_TIM LOGOFF_TI     CON_ID\n---------- ----- ----- --------- --------- ----------\n        12 PDB2  USER4 12-JUN-21 12-JUN-21          3\n        22 PDB2  USER5 12-JUN-21 12-JUN-21          3\n        32 PDB2  USER4 12-JUN-21 12-JUN-21          3\n        11 PDB1  USER1 13-JUN-21 13-JUN-21          4\n        21 PDB1  USER2 13-JUN-21 13-JUN-21          4\n        31 PDB1  USER3 13-JUN-21 13-JUN-21          4\n \n6 rows selected.\n<\/pre><\/div>\n\n\n<p>Conectado com o Common User &#8220;C##LUXOR&#8221; no CDB$ROOT, vamos realizar um insert na tabela apenas no PDB HIPOFISE1 (CON_ID 4):<\/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; SHOW USER;\nUSER is &quot;C##LUXOR&quot;\nSQL&gt; ALTER SESSION SET NLS_DATE_FORMAT=&#039;DD-MM-RR HH24:MI&#039;;\n \nSession altered.\n \nSQL&gt; INSERT INTO CONTAINERS(LOGIN_AUDIT) (CON_ID, RECORD_ID, DB, USER_ID, LOGIN_TIME, LOGOFF_TIME) VALUES (4,41,&#039;PDB1&#039;,&#039;USER4&#039;, SYSDATE-2.5, SYSDATE-2.4);\n \n1 row created.\n \nSQL&gt; COMMIT;\n \nCommit complete.\n \nSQL&gt; SELECT * FROM CONTAINERS(LOGIN_AUDIT);\n \n RECORD_ID DB    USER_ LOGIN_TIME     LOGOFF_TIME        CON_ID\n---------- ----- ----- -------------- -------------- ----------\n        12 PDB2  USER4 12-06-21 16:47 12-06-21 19:11          3\n        22 PDB2  USER5 12-06-21 14:23 12-06-21 16:47          3\n        32 PDB2  USER4 12-06-21 11:59 12-06-21 16:47          3\n        41 PDB1  USER4 14-06-21 18:01 14-06-21 20:25          4\n        11 PDB1  USER1 13-06-21 16:46 13-06-21 19:10          4\n        21 PDB1  USER2 13-06-21 14:22 13-06-21 16:46          4\n        31 PDB1  USER3 13-06-21 11:58 13-06-21 16:46          4\n \n7 rows selected.\n \nSQL&gt; conn C##LUXOR\/oracle\nConnected.\nSQL&gt; SELECT * FROM CONTAINERS(LOGIN_AUDIT) WHERE CON$NAME IN (&#039;HIPOFISE1&#039;) AND RECORD_ID=41;\n \n RECORD_ID DB    USER_ LOGIN_TIM LOGOFF_TI     CON_ID\n---------- ----- ----- --------- --------- ----------\n        41 PDB1  USER4 14-JUN-21 14-JUN-21          4\n<\/pre><\/div>\n\n\n<p>Realizando opera\u00e7\u00e3o de UPDATE tamb\u00e9m usando o recurso de filtro por PDB:<\/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; UPDATE CONTAINERS(LOGIN_AUDIT) SET USER_ID=&#039;TESTE&#039; WHERE CON_ID=4 AND RECORD_ID=41;\n \n1 row updated.\n \nSQL&gt; COMMIT;\n \nCommit complete.\n \nSQL&gt; SELECT * FROM CONTAINERS(LOGIN_AUDIT) WHERE CON$NAME IN (&#039;HIPOFISE1&#039;) AND RECORD_ID=41;\n \n RECORD_ID DB    USER_ LOGIN_TIM LOGOFF_TI     CON_ID\n---------- ----- ----- --------- --------- ----------\n        41 PDB1  TESTE 14-JUN-21 14-JUN-21          4\n<\/pre><\/div>\n\n\n<p>Por fim, realizando o delete desse registro:<\/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; DELETE CONTAINERS(LOGIN_AUDIT) WHERE CON_ID=4 AND RECORD_ID=41;\n \n1 row deleted.\n \nSQL&gt; COMMIT;\n \nCommit complete.\n \nSQL&gt; SELECT * FROM CONTAINERS(LOGIN_AUDIT) WHERE CON$NAME IN (&#039;HIPOFISE1&#039;) AND RECORD_ID=41;\n \nno rows selected\n<\/pre><\/div>\n\n<p>A \u00fanica coisa interessante \u00e9 que, na documenta\u00e7\u00e3o da Oracle, podemos realizar um DML que altere dados de v\u00e1rios PDBs ao mesmo tempo, ou seja, usando o mesmo comando (link <a href=\"https:\/\/docs.oracle.com\/en\/database\/oracle\/oracle-database\/12.2\/cncpt\/overview-of-the-multitenant-architecture.html\" target=\"\\&quot;_blank\\&quot;\" rel=\"\\&quot;noreferrer noopener\" noopener=\"\">AQUI<\/a>):<\/p>\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" src=\"https:\/\/swiv.com.br\/wp-content\/uploads\/2022\/07\/image-38.png\" alt=\"\" class=\"wp-image-7568\"\/><\/figure>\n\n\n\n<p>Por\u00e9m, na pr\u00e1tica, isso n\u00e3o \u00e9 poss\u00edvel (a\u00ed n\u00e3o \u00e9 poss\u00edvel saber se \u00e9 um Bug do RDMS ou da pr\u00f3pria documenta\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; UPDATE CONTAINERS(LOGIN_AUDIT) SET USER_ID=&#039;TESTE&#039; WHERE CON_ID in (3,4);\nUPDATE CONTAINERS(LOGIN_AUDIT) SET USER_ID=&#039;TESTE&#039; WHERE CON_ID in (3,4)\n                  *\nERROR at line 1:\nORA-65319: DML on CONTAINERS() specified an unsupported CON_ID predicate\n \nSQL&gt; DELETE CONTAINERS(LOGIN_AUDIT) WHERE CON_ID in (3,4);\nDELETE CONTAINERS(LOGIN_AUDIT) WHERE CON_ID in (3,4)\n                  *\nERROR at line 1:\nORA-65319: DML on CONTAINERS() specified an unsupported CON_ID predicate\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>Temos na arquitetura Multitenant a op\u00e7\u00e3o de utilizar a cl\u00e1usula CONTAINERS tamb\u00e9m em DMLs, permitindo assim que manipulemos dados de m\u00faltiplos PDBs. Neste artigo vamos explorar alguns exemplos de uso, onde os objetos pertecem a um Common User. Coletando informa\u00e7\u00f5es do ambiente de testes: Conectado com o Common User &#8220;C##LUXOR&#8221; no CDB$ROOT, vamos realizar um [&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-5471","post","type-post","status-publish","format-standard","hentry","category-multitenant"],"_links":{"self":[{"href":"https:\/\/swiv.com.br\/index.php\/wp-json\/wp\/v2\/posts\/5471","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=5471"}],"version-history":[{"count":1,"href":"https:\/\/swiv.com.br\/index.php\/wp-json\/wp\/v2\/posts\/5471\/revisions"}],"predecessor-version":[{"id":9100,"href":"https:\/\/swiv.com.br\/index.php\/wp-json\/wp\/v2\/posts\/5471\/revisions\/9100"}],"wp:attachment":[{"href":"https:\/\/swiv.com.br\/index.php\/wp-json\/wp\/v2\/media?parent=5471"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/swiv.com.br\/index.php\/wp-json\/wp\/v2\/categories?post=5471"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/swiv.com.br\/index.php\/wp-json\/wp\/v2\/tags?post=5471"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}