{"id":5486,"date":"2021-06-18T08:04:07","date_gmt":"2021-06-18T08:04:07","guid":{"rendered":"https:\/\/swiv.com.br\/specifying-the-default-container-target\/"},"modified":"2026-05-27T20:02:31","modified_gmt":"2026-05-27T19:02:31","slug":"specifying-the-default-container-target","status":"publish","type":"post","link":"https:\/\/swiv.com.br\/index.php\/2021\/06\/18\/specifying-the-default-container-target\/","title":{"rendered":"Specifying the Default Container Target"},"content":{"rendered":"\n<p>Com o par\u00e2metro &#8220;CONTAINERS_DEFAULT_TARGET&#8221; conseguimos definir o valor padr\u00e3o de container que podemos nos usufruir ao rodar comandos de DML, conforme este artigo reproduzir\u00e1.<\/p>\n\n\n\n<p>Fazendo reconhecimento do ambiente de laborat\u00f3rio usado:<\/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 20:45:37 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\n<\/pre><\/div>\n\n\n<p>Ao consultar qual \u00e9 o valor atual do par\u00e2metro, vemos que o mesmo est\u00e1 vazio, o que significa que, ao rodar algum comando, o container padr\u00e3o adotado ser\u00e1 o current container:<\/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; SELECT PROPERTY_VALUE FROM DATABASE_PROPERTIES WHERE PROPERTY_NAME=&#039;CONTAINERS_DEFAULT_TARGET&#039;;\n \nno rows selected\n<\/pre><\/div>\n\n\n<p>Dito isto, vamos validar se a parte pr\u00e1tica acompanha a te\u00f3rica. Abaixo segue uma tabela que existe em 3 containers (CDB$ROOT, HIPOFISE1 e 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##LUXOR\/oracle\nConnected.\nSQL&gt; SELECT * FROM CONTAINERS(LOGIN_AUDIT);\n \n RECORD_ID DB    USER_ LOGIN_TIM LOGOFF_TI     CON_ID\n---------- ----- ----- --------- --------- ----------\n        66 ROOT  BSS   15-JUN-21 15-JUN-21          1\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 \n7 rows selected.\n<\/pre><\/div>\n\n\n<p>Mudando sess\u00e3o para o PDB HIPOFISE1 e realizando um UPDATE sem mencionar o container (para que o current seja considerado e usado):<\/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 SESSION SET CONTAINER=HIPOFISE1;\n \nSession altered.\n \nSQL&gt; UPDATE CONTAINERS(LOGIN_AUDIT) SET USER_ID=&#039;XXX&#039;;\n \n3 rows updated.\n \nSQL&gt; SELECT USER_ID FROM LOGIN_AUDIT;\n \nUSER_\n-----\nXXX\nXXX\nXXX\n \nSQL&gt; SELECT * FROM CONTAINERS(LOGIN_AUDIT);\n \n RECORD_ID DB    USER_ LOGIN_TIM LOGOFF_TI     CON_ID\n---------- ----- ----- --------- --------- ----------\n        11 PDB1  XXX   13-JUN-21 13-JUN-21          4\n        21 PDB1  XXX   13-JUN-21 13-JUN-21          4\n        31 PDB1  XXX   13-JUN-21 13-JUN-21          4\n \nSQL&gt; ROLLBACK;\n \nRollback complete.\n \nSQL&gt; SELECT USER_ID FROM LOGIN_AUDIT;\n \nUSER_\n-----\nUSER1\nUSER2\nUSER3\n<\/pre><\/div>\n\n\n<p>Agora vamos definir o valor do PDB que ser\u00e1 considerado como padr\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; conn \/ as sysdba\nConnected.\nSQL&gt; ALTER DATABASE CONTAINERS DEFAULT TARGET = (HIPOFISE2);\n \nDatabase altered.\n<\/pre><\/div>\n\n\n<p>Podemos perceber que o preenchimento acontece com o DBID, e n\u00e3o o nome do 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; SELECT PROPERTY_VALUE FROM DATABASE_PROPERTIES WHERE PROPERTY_NAME=&#039;CONTAINERS_DEFAULT_TARGET&#039;;\n \nPROPERTY_VALUE\n--------------------------------------------------------------------------------\n1961048788\n \nSQL&gt; SELECT NAME, DBID, CON_UID FROM V$PDBS WHERE NAME=&#039;HIPOFISE2&#039;;\n \nNAME\n--------------------------------------------------------------------------------\n      DBID    CON_UID\n---------- ----------\nHIPOFISE2\n1961048788 1961048788\n<\/pre><\/div>\n\n\n<p>Agora faremos a DML sem informar o PDB, para validar que o HIPOFISE2 foi utilizado com sucesso:<\/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;XXX&#039;;\n \n3 rows updated.\n \nSQL&gt; COMMIT;\n \nCommit complete.\n \nSQL&gt; SELECT USER_ID FROM LOGIN_AUDIT;\n \nUSER_\n-----\nBSS\n \nSQL&gt; SELECT USER_ID FROM CONTAINERS(LOGIN_AUDIT) WHERE CON_ID=3;\n \nUSER_\n-----\nXXX\nXXX\nXXX\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>Com o par\u00e2metro &#8220;CONTAINERS_DEFAULT_TARGET&#8221; conseguimos definir o valor padr\u00e3o de container que podemos nos usufruir ao rodar comandos de DML, conforme este artigo reproduzir\u00e1. Fazendo reconhecimento do ambiente de laborat\u00f3rio usado: Ao consultar qual \u00e9 o valor atual do par\u00e2metro, vemos que o mesmo est\u00e1 vazio, o que significa que, ao rodar algum comando, o [&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-5486","post","type-post","status-publish","format-standard","hentry","category-multitenant"],"_links":{"self":[{"href":"https:\/\/swiv.com.br\/index.php\/wp-json\/wp\/v2\/posts\/5486","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=5486"}],"version-history":[{"count":1,"href":"https:\/\/swiv.com.br\/index.php\/wp-json\/wp\/v2\/posts\/5486\/revisions"}],"predecessor-version":[{"id":9099,"href":"https:\/\/swiv.com.br\/index.php\/wp-json\/wp\/v2\/posts\/5486\/revisions\/9099"}],"wp:attachment":[{"href":"https:\/\/swiv.com.br\/index.php\/wp-json\/wp\/v2\/media?parent=5486"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/swiv.com.br\/index.php\/wp-json\/wp\/v2\/categories?post=5486"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/swiv.com.br\/index.php\/wp-json\/wp\/v2\/tags?post=5486"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}