{"id":8739,"date":"2026-07-30T09:00:45","date_gmt":"2026-07-30T12:00:45","guid":{"rendered":"https:\/\/powertuning.com.br\/blog\/?p=8739"},"modified":"2026-07-31T14:01:35","modified_gmt":"2026-07-31T17:01:35","slug":"de-sql-server-para-postgresql-instancia-database-e-schema-onde-cada-coisa-mora","status":"publish","type":"post","link":"https:\/\/powertuning.com.br\/blog\/de-sql-server-para-postgresql-instancia-database-e-schema-onde-cada-coisa-mora\/","title":{"rendered":"De SQL Server para PostgreSQL #02 &#8211; Inst\u00e2ncia, database e schema. Onde cada coisa mora."},"content":{"rendered":"<p>&nbsp;<\/p>\n<div style=\"max-width: 860px; margin: 0 auto;\">\n<div style=\"background: linear-gradient(135deg,#081F42 0%,#0B2D5E 55%,#16437F 100%); border-radius: 14px; padding: 44px 40px 40px 40px; margin: 0 0 30px 0;\">\n<p style=\"color: #d6e2f5; font-size: 16px; line-height: 1.65; margin: 0;\">SQL Server e PostgreSQL organizam inst\u00e2ncia, database e schema de formas estruturalmente diferentes \u2014 e essa diferen\u00e7a muda completamente como uma query cruza dados entre bancos em cada um.<\/p>\n<p style=\"color: #9fb4d8; font-size: 14px; margin: 18px 0 0 0; padding-top: 16px; border-top: 1px solid rgba(255,255,255,0.15);\"><span style=\"color: #f5c800; font-weight: bold;\">Francisco Porf\u00edrio<\/span> \u00b7 Time PostgreSQL da Power Tuning<\/p>\n<\/div>\n<p style=\"color: #33475b; font-size: 16px; line-height: 1.8; margin: 0 0 16px 0;\"><a href=\"https:\/\/powertuning.com.br\/blog\/8690-2\/\" target=\"_blank\" rel=\"noopener\">Na primeira postagem desta s\u00e9rie<\/a>, falamos sobre o primeiro choque de quem sai do wizard do SQL Server no Windows para o <code style=\"background: #EEF2F8; padding: 2px 6px; border-radius: 4px; font-family: Consolas,Menlo,monospace; font-size: 14px; color: #0b2d5e;\">apt install<\/code>\/<code style=\"background: #EEF2F8; padding: 2px 6px; border-radius: 4px; font-family: Consolas,Menlo,monospace; font-size: 14px; color: #0b2d5e;\">initdb<\/code> do Linux. Resolvida a instala\u00e7\u00e3o, o segundo estranhamento normalmente aparece j\u00e1 no primeiro dia de uso, na primeira vez que algu\u00e9m tenta fazer um <code style=\"background: #EEF2F8; padding: 2px 6px; border-radius: 4px; font-family: Consolas,Menlo,monospace; font-size: 14px; color: #0b2d5e;\">JOIN<\/code> entre duas bases diferentes no mesmo servidor.<\/p>\n<p style=\"color: #33475b; font-size: 16px; line-height: 1.8; margin: 0 0 16px 0;\">No SQL Server, a resposta usa nomea\u00e7\u00e3o de tr\u00eas partes, <code style=\"background: #EEF2F8; padding: 2px 6px; border-radius: 4px; font-family: Consolas,Menlo,monospace; font-size: 14px; color: #0b2d5e;\">banco.schema.objeto<\/code>, dentro da mesma inst\u00e2ncia. No Postgres, a resposta segue outro caminho, porque a arquitetura \u00e9 diferente: cada database \u00e9 uma unidade isolada, com cat\u00e1logo e visibilidade de transa\u00e7\u00e3o pr\u00f3prios.<\/p>\n<p style=\"color: #33475b; font-size: 16px; line-height: 1.8; margin: 0 0 16px 0;\">Este post organiza a hierarquia inst\u00e2ncia \u2192 database \u2192 schema nos dois bancos, mostra onde cada coisa mora fisicamente em disco, e explica por que uma cross-database query segue caminhos diferentes em cada um \u2014 e o que isso muda na pr\u00e1tica, na hora de cruzar dados entre databases.<\/p>\n<figure style=\"margin: 28px 0; text-align: center;\">\n<table style=\"width: 100%; border-collapse: separate; border-spacing: 14px 0; margin: 0;\">\n<tbody>\n<tr>\n<td style=\"width: 50%; vertical-align: top; padding: 0;\">\n<p style=\"color: #0b2d5e; font-size: 18px; font-weight: bold; margin: 0 0 10px 0;\">SQL Server (Inst\u00e2ncia)<\/p>\n<div style=\"border: 1.5px dashed #0B2D5E; border-radius: 10px; padding: 16px 12px; text-align: left;\">\n<p style=\"color: #0b2d5e; font-size: 12px; text-align: center; margin: 0 0 12px 0;\">1 inst\u00e2ncia = 1 processo\/servi\u00e7o<\/p>\n<table style=\"width: 100%; border-collapse: separate; border-spacing: 8px 0;\">\n<tbody>\n<tr>\n<td style=\"width: 50%; background: #EAF1FC; border: 1.5px solid #0B2D5E; border-radius: 8px; padding: 10px 8px; text-align: center; vertical-align: top;\"><span style=\"display: block; color: #0b2d5e; font-size: 14px; font-weight: bold;\">BancoA<\/span><span style=\"display: block; color: #555555; font-size: 12px; margin-top: 4px;\">schema: dbo<\/span><span style=\"display: block; color: #555555; font-size: 12px;\">Clientes<\/span><\/td>\n<td style=\"width: 50%; background: #EAF1FC; border: 1.5px solid #0B2D5E; border-radius: 8px; padding: 10px 8px; text-align: center; vertical-align: top;\"><span style=\"display: block; color: #0b2d5e; font-size: 14px; font-weight: bold;\">BancoB<\/span><span style=\"display: block; color: #555555; font-size: 12px; margin-top: 4px;\">schema: dbo<\/span><span style=\"display: block; color: #555555; font-size: 12px;\">Pedidos<\/span><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p style=\"color: #0b2d5e; font-size: 12.5px; font-weight: bold; text-align: center; margin: 14px 0 6px 0;\">\u2194 Refer\u00eancia direta entre bancos<\/p>\n<p style=\"color: #555555; font-size: 11.5px; text-align: center; margin: 0 0 2px 0;\">BancoA.dbo.Clientes c<\/p>\n<p style=\"color: #555555; font-size: 11.5px; text-align: center; margin: 0 0 12px 0;\">JOIN BancoB.dbo.Pedidos p<\/p>\n<p style=\"background: #EAF1FC; border: 1.5px solid #0B2D5E; border-radius: 15px; color: #0b2d5e; font-size: 12.5px; text-align: center; padding: 7px 10px; margin: 0;\">Cat\u00e1logo compartilhado<\/p>\n<\/div>\n<div style=\"background: #EAF1FC; border: 1.5px solid #0B2D5E; border-radius: 8px; padding: 10px; margin: 14px auto 0 auto; max-width: 220px; text-align: center;\"><span style=\"display: block; color: #0b2d5e; font-size: 14px;\">1 conex\u00e3o<\/span><span style=\"display: block; color: #555555; font-size: 12px; margin-top: 2px;\">enxerga BancoA e BancoB<\/span><\/div>\n<\/td>\n<td style=\"width: 50%; vertical-align: top; padding: 0;\">\n<p style=\"color: #b8860b; font-size: 18px; font-weight: bold; margin: 0 0 10px 0;\">PostgreSQL (Cluster)<\/p>\n<div style=\"border: 1.5px dashed #B8860B; border-radius: 10px; padding: 16px 12px; text-align: left;\">\n<p style=\"color: #b8860b; font-size: 12px; text-align: center; margin: 0 0 12px 0;\">1 cluster = 1 processo\/servi\u00e7o<\/p>\n<table style=\"width: 100%; border-collapse: separate; border-spacing: 8px 0;\">\n<tbody>\n<tr>\n<td style=\"width: 50%; background: #FBF3D3; border: 1.5px solid #C79A1E; border-radius: 8px; padding: 10px 8px; text-align: center; vertical-align: top;\"><span style=\"display: block; color: #b8860b; font-size: 14px; font-weight: bold;\">bancoa<\/span><span style=\"display: block; color: #555555; font-size: 12px; margin-top: 4px;\">schema: public<\/span><span style=\"display: block; color: #555555; font-size: 12px;\">clientes<\/span><\/td>\n<td style=\"width: 50%; background: #FBF3D3; border: 1.5px solid #C79A1E; border-radius: 8px; padding: 10px 8px; text-align: center; vertical-align: top;\"><span style=\"display: block; color: #b8860b; font-size: 14px; font-weight: bold;\">bancob<\/span><span style=\"display: block; color: #555555; font-size: 12px; margin-top: 4px;\">schema: public<\/span><span style=\"display: block; color: #555555; font-size: 12px;\">pedidos<\/span><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p style=\"color: #8a6d1f; font-size: 15px; font-weight: bold; text-align: center; margin: 10px 0 4px 0;\">\u00d7<\/p>\n<p style=\"color: #555555; font-size: 12.5px; font-weight: bold; text-align: center; margin: 0 0 6px 0;\">Isto n\u00e3o roda no Postgres:<\/p>\n<p style=\"color: #999999; font-size: 11.5px; text-align: center; margin: 0 0 2px 0;\">bancoa.public.clientes c<\/p>\n<p style=\"color: #999999; font-size: 11.5px; text-align: center; margin: 0 0 12px 0;\">JOIN bancob.public.pedidos p<\/p>\n<p style=\"background: #FBF3D3; border: 1.5px solid #B8860B; border-radius: 17px; color: #b8860b; font-size: 12px; font-weight: bold; text-align: center; padding: 8px 10px; margin: 0;\">S\u00f3 \u00e9 poss\u00edvel via postgres_fdw<\/p>\n<\/div>\n<table style=\"width: 100%; border-collapse: separate; border-spacing: 8px 0; margin-top: 14px;\">\n<tbody>\n<tr>\n<td style=\"width: 50%; background: #FBF3D3; border: 1.5px solid #C79A1E; border-radius: 8px; padding: 10px 8px; text-align: center; vertical-align: top;\"><span style=\"display: block; color: #b8860b; font-size: 14px;\">Conex\u00e3o 1<\/span><span style=\"display: block; color: #555555; font-size: 12px; margin-top: 2px;\">s\u00f3 v\u00ea bancoa<\/span><\/td>\n<td style=\"width: 50%; background: #FBF3D3; border: 1.5px solid #C79A1E; border-radius: 8px; padding: 10px 8px; text-align: center; vertical-align: top;\"><span style=\"display: block; color: #b8860b; font-size: 14px;\">Conex\u00e3o 2<\/span><span style=\"display: block; color: #555555; font-size: 12px; margin-top: 2px;\">s\u00f3 v\u00ea bancob<\/span><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p style=\"color: #777777; font-size: 14px; text-align: center; margin: 20px 0 0 0;\">No SQL Server, todos os databases da inst\u00e2ncia s\u00e3o geridos pelo mesmo processo\/engine, que acessa o cat\u00e1logo de cada um simultaneamente \u2014 por isso permite refer\u00eancia direta entre eles.<\/p>\n<p style=\"color: #777777; font-size: 14px; text-align: center; margin: 6px 0 0 0;\">No Postgres, um JOIN direto entre bancoa e bancob n\u00e3o existe: \u00e9 preciso importar a tabela via postgres_fdw antes.<\/p><figcaption style=\"font-size: 13px; color: #6b7a90; margin-top: 12px;\">Hierarquia inst\u00e2ncia\/cluster \u2192 database \u2192 schema: SQL Server x PostgreSQL<\/figcaption><\/figure>\n<h2 style=\"color: #0b2d5e; font-size: 24px; margin: 38px 0 14px 0; padding-left: 14px; border-left: 4px solid #F5C800;\">Como o SQL Server te acostumou a pensar<\/h2>\n<p style=\"color: #33475b; font-size: 16px; line-height: 1.8; margin: 0 0 16px 0;\">Uma inst\u00e2ncia do SQL Server \u00e9 um \u00fanico processo (o servi\u00e7o <code style=\"background: #EEF2F8; padding: 2px 6px; border-radius: 4px; font-family: Consolas,Menlo,monospace; font-size: 14px; color: #0b2d5e;\">MSSQLSERVER<\/code> ou uma inst\u00e2ncia nomeada) que hospeda <strong style=\"color: #0b2d5e;\">v\u00e1rios databases<\/strong> ao mesmo tempo, todos vis\u00edveis pela mesma conex\u00e3o. Dentro de cada database existem um ou mais schemas (o padr\u00e3o sendo <code style=\"background: #EEF2F8; padding: 2px 6px; border-radius: 4px; font-family: Consolas,Menlo,monospace; font-size: 14px; color: #0b2d5e;\">dbo<\/code>), e dentro de cada schema, os objetos: tabelas, views, procedures.<\/p>\n<p style=\"color: #33475b; font-size: 16px; line-height: 1.8; margin: 0 0 16px 0;\">A nomea\u00e7\u00e3o de tr\u00eas partes deixa isso natural no dia a dia:<\/p>\n<pre style=\"background: #0D1B40; color: #ffffff; padding: 18px 22px; border-radius: 10px; font-family: Consolas,Menlo,monospace; font-size: 14px; line-height: 1.7; overflow-x: auto; margin: 0 0 18px 0;\"><span style=\"color: #000000;\"><code style=\"background: none; padding: 0px; font-family: inherit;\">-- Uma \u00fanica conex\u00e3o referenciando dois databases diferentes\r\nSELECT c.nome, p.valor\r\nFROM BancoA.dbo.Clientes c\r\nJOIN BancoB.dbo.Pedidos p ON p.cliente_id = c.id\r\nWHERE c.ativo = 1;<\/code><\/span><\/pre>\n<p style=\"color: #33475b; font-size: 16px; line-height: 1.8; margin: 0 0 16px 0;\">Isso funciona porque, dentro de uma inst\u00e2ncia no SQL Server, cada database mant\u00e9m seu pr\u00f3prio cat\u00e1logo de metadados \u2014 mas todos s\u00e3o geridos pelo mesmo processo (MSSQLSERVER), que tamb\u00e9m administra um gerenciador de locks\/transa\u00e7\u00f5es comum a todos eles. O <code style=\"background: #EEF2F8; padding: 2px 6px; border-radius: 4px; font-family: Consolas,Menlo,monospace; font-size: 14px; color: #0b2d5e;\">USE<\/code> apenas troca o database &#8220;padr\u00e3o&#8221; de contexto para nomes sem prefixo \u2014 mas qualquer objeto de qualquer outro database da mesma inst\u00e2ncia continua acess\u00edvel via nome completo, porque o engine consegue abrir e resolver o cat\u00e1logo daquele database durante a compila\u00e7\u00e3o da query, montando um \u00fanico plano de execu\u00e7\u00e3o, na mesma transa\u00e7\u00e3o.<\/p>\n<h2 style=\"color: #0b2d5e; font-size: 24px; margin: 38px 0 14px 0; padding-left: 14px; border-left: 4px solid #F5C800;\">A filosofia do Postgres: cada database \u00e9 um cofre isolado<\/h2>\n<p style=\"color: #33475b; font-size: 16px; line-height: 1.8; margin: 0 0 16px 0;\">Lembra do &#8220;cluster&#8221; que criamos no post anterior com o <code style=\"background: #EEF2F8; padding: 2px 6px; border-radius: 4px; font-family: Consolas,Menlo,monospace; font-size: 14px; color: #0b2d5e;\">initdb<\/code>? Esse \u00e9 o equivalente mais pr\u00f3ximo de uma inst\u00e2ncia: um \u00fanico processo <code style=\"background: #EEF2F8; padding: 2px 6px; border-radius: 4px; font-family: Consolas,Menlo,monospace; font-size: 14px; color: #0b2d5e;\">postgres<\/code>, ouvindo em uma porta, capaz de hospedar m\u00faltiplos databases. At\u00e9 aqui, parecido com o SQL Server.<\/p>\n<p style=\"color: #33475b; font-size: 16px; line-height: 1.8; margin: 0 0 16px 0;\">A diferen\u00e7a aparece na camada de baixo: no Postgres, <strong style=\"color: #0b2d5e;\">cada database tem seu pr\u00f3prio cat\u00e1logo de sistema<\/strong> (as tabelas internas que descrevem tabelas, colunas, \u00edndices, permiss\u00f5es etc.) e sua pr\u00f3pria visibilidade de transa\u00e7\u00f5es (MVCC). Fisicamente, cada database vive em um diret\u00f3rio separado dentro do cluster:<\/p>\n<pre style=\"background: #0D1B40; color: #ffffff; padding: 18px 22px; border-radius: 10px; font-family: Consolas,Menlo,monospace; font-size: 14px; line-height: 1.7; overflow-x: auto; margin: 0 0 18px 0;\"><span style=\"color: #000000;\"><code style=\"background: none; padding: 0px; font-family: inherit;\"># Cada subdiret\u00f3rio num\u00e9rico \u00e9 um database, identificado pelo OID\r\n\/var\/lib\/postgresql\/18\/main\/base\/16384\/   # bancoa\r\n\/var\/lib\/postgresql\/18\/main\/base\/16391\/   # bancob<\/code><\/span><\/pre>\n<p style=\"color: #33475b; font-size: 16px; line-height: 1.8; margin: 0 0 16px 0;\">E, consequ\u00eancia direta disso: <strong style=\"color: #0b2d5e;\">uma conex\u00e3o no Postgres se autentica em um \u00fanico database por vez<\/strong>. N\u00e3o existe um <code style=\"background: #EEF2F8; padding: 2px 6px; border-radius: 4px; font-family: Consolas,Menlo,monospace; font-size: 14px; color: #0b2d5e;\">USE outrobanco;<\/code> que troque o contexto dentro da mesma sess\u00e3o \u2014 trocar de database significa abrir uma nova conex\u00e3o. No <code style=\"background: #EEF2F8; padding: 2px 6px; border-radius: 4px; font-family: Consolas,Menlo,monospace; font-size: 14px; color: #0b2d5e;\">psql<\/code>, o comando mais pr\u00f3ximo disso \u00e9 <code style=\"background: #EEF2F8; padding: 2px 6px; border-radius: 4px; font-family: Consolas,Menlo,monospace; font-size: 14px; color: #0b2d5e;\">\\c<\/code> \u2014 mas por baixo dos panos ele fecha a conex\u00e3o atual e abre outra.<\/p>\n<pre style=\"background: #0D1B40; color: #ffffff; padding: 18px 22px; border-radius: 10px; font-family: Consolas,Menlo,monospace; font-size: 14px; line-height: 1.7; overflow-x: auto; margin: 0 0 18px 0;\"><span style=\"color: #000000;\"><code style=\"background: none; padding: 0px; font-family: inherit;\">postgres=# \\c bancoa\r\nYou are now connected to database \"bancoa\" as user \"postgres\".\r\n-- \\c n\u00e3o \"troca de contexto\": \u00e9 uma reconex\u00e3o de verdade<\/code><\/span><\/pre>\n<div style=\"background: #FFF8DE; border-left: 6px solid #F5C800; border-radius: 0 10px 10px 0; padding: 18px 22px; margin: 22px 0;\">\n<p style=\"color: #0b2d5e; font-size: 15px; line-height: 1.7; margin: 0;\"><strong style=\"color: #0b2d5e;\">E se eu tentar mesmo assim?<\/strong> O Postgres nem deixa passar pelo parser. Tentar referenciar um database no nome do objeto retorna um erro bem direto ao ponto: <code style=\"background: #EEF2F8; padding: 2px 6px; border-radius: 4px; font-family: Consolas,Menlo,monospace; font-size: 14px; color: #0b2d5e;\">ERROR: cross-database references are not implemented<\/code>. N\u00e3o \u00e9 uma permiss\u00e3o faltando, \u00e9 a arquitetura dizendo que aquele caminho n\u00e3o existe.<\/p>\n<\/div>\n<h2 style=\"color: #0b2d5e; font-size: 24px; margin: 38px 0 14px 0; padding-left: 14px; border-left: 4px solid #F5C800;\">Onde entra o schema<\/h2>\n<p style=\"color: #33475b; font-size: 16px; line-height: 1.8; margin: 0 0 16px 0;\">Dentro de cada database, o Postgres tamb\u00e9m organiza objetos em schemas \u2014 o conceito em si \u00e9 id\u00eantico ao do SQL Server. A diferen\u00e7a \u00e9 s\u00f3 o nome do padr\u00e3o: em vez de <code style=\"background: #EEF2F8; padding: 2px 6px; border-radius: 4px; font-family: Consolas,Menlo,monospace; font-size: 14px; color: #0b2d5e;\">dbo<\/code>, todo database novo j\u00e1 nasce com um schema chamado <code style=\"background: #EEF2F8; padding: 2px 6px; border-radius: 4px; font-family: Consolas,Menlo,monospace; font-size: 14px; color: #0b2d5e;\">public<\/code>.<\/p>\n<p style=\"color: #33475b; font-size: 16px; line-height: 1.8; margin: 0 0 16px 0;\">A nomea\u00e7\u00e3o de objetos no Postgres \u00e9, portanto, de <strong style=\"color: #0b2d5e;\">duas partes<\/strong>, n\u00e3o tr\u00eas: <code style=\"background: #EEF2F8; padding: 2px 6px; border-radius: 4px; font-family: Consolas,Menlo,monospace; font-size: 14px; color: #0b2d5e;\">schema.objeto<\/code>. O database nunca entra no nome, porque ele j\u00e1 est\u00e1 impl\u00edcito na conex\u00e3o atual:<\/p>\n<pre style=\"background: #0D1B40; color: #ffffff; padding: 18px 22px; border-radius: 10px; font-family: Consolas,Menlo,monospace; font-size: 14px; line-height: 1.7; overflow-x: auto; margin: 0 0 18px 0;\"><span style=\"color: #000000;\"><code style=\"background: none; padding: 0px; font-family: inherit;\">-- Funciona: schema.objeto, dentro do database j\u00e1 conectado\r\nSELECT * FROM public.clientes;\r\n\r\n-- Tamb\u00e9m funciona, dois schemas do MESMO database\r\nSELECT c.nome, v.total\r\nFROM vendas.clientes c\r\nJOIN financeiro.vendas v ON v.cliente_id = c.id;\r\n\r\n-- N\u00c3O funciona: bancoa e bancob s\u00e3o databases diferentes\r\nSELECT * FROM bancoa.public.clientes c\r\nJOIN bancob.public.pedidos p ON p.cliente_id = c.id;\r\n-- ERROR: cross-database references are not implemented<\/code><\/span><\/pre>\n<p style=\"color: #33475b; font-size: 16px; line-height: 1.8; margin: 0 0 16px 0;\">Repare que cruzar <strong style=\"color: #0b2d5e;\">schemas diferentes do mesmo database<\/strong> funciona sem nenhuma restri\u00e7\u00e3o especial \u2014 o limite \u00e9 sempre o database, nunca o schema.<\/p>\n<h2 style=\"color: #0b2d5e; font-size: 24px; margin: 38px 0 14px 0; padding-left: 14px; border-left: 4px solid #F5C800;\">Passo a passo: criando database e schema no Postgres<\/h2>\n<pre style=\"background: #0D1B40; color: #ffffff; padding: 18px 22px; border-radius: 10px; font-family: Consolas,Menlo,monospace; font-size: 14px; line-height: 1.7; overflow-x: auto; margin: 0 0 18px 0;\"><span style=\"color: #000000;\"><code style=\"background: none; padding: 0px; font-family: inherit;\"># Cria um database novo (equivalente a CREATE DATABASE no SSMS)\r\nsudo -u postgres createdb bancoa\r\n\r\n# Conecta nele\r\nsudo -u postgres psql -d bancoa<\/code><\/span><\/pre>\n<pre style=\"background: #0D1B40; color: #ffffff; padding: 18px 22px; border-radius: 10px; font-family: Consolas,Menlo,monospace; font-size: 14px; line-height: 1.7; overflow-x: auto; margin: 0 0 18px 0;\"><span style=\"color: #000000;\"><code style=\"background: none; padding: 0px; font-family: inherit;\">-- Dentro do psql, j\u00e1 conectado em \"bancoa\"\r\n\r\n-- Cria um schema adicional (equivalente a CREATE SCHEMA no SQL Server)\r\nCREATE SCHEMA vendas;\r\n\r\n-- Define em que ordem os schemas s\u00e3o pesquisados quando o nome vem sem prefixo\r\nSET search_path TO vendas, public;\r\n\r\n-- Comandos de explora\u00e7\u00e3o no psql\r\n\\l          -- lista os databases do cluster\r\n\\c bancoa   -- conecta em outro database (na pr\u00e1tica, reconecta)\r\n\\dn         -- lista os schemas do database atual\r\n\\dt vendas.* -- lista as tabelas de um schema espec\u00edfico<\/code><\/span><\/pre>\n<p style=\"color: #33475b; font-size: 16px; line-height: 1.8; margin: 0 0 16px 0;\">O <code style=\"background: #EEF2F8; padding: 2px 6px; border-radius: 4px; font-family: Consolas,Menlo,monospace; font-size: 14px; color: #0b2d5e;\">search_path<\/code> \u00e9 o equivalente funcional do schema padr\u00e3o do usu\u00e1rio no SQL Server: define em qual schema o Postgres procura um objeto quando voc\u00ea n\u00e3o escreve o prefixo. Sem configurar nada, o padr\u00e3o de f\u00e1brica j\u00e1 inclui <code style=\"background: #EEF2F8; padding: 2px 6px; border-radius: 4px; font-family: Consolas,Menlo,monospace; font-size: 14px; color: #0b2d5e;\">public<\/code>.<\/p>\n<div style=\"background: #FFF8DE; border-left: 6px solid #F5C800; border-radius: 0 10px 10px 0; padding: 18px 22px; margin: 22px 0;\">\n<p style=\"color: #0b2d5e; font-size: 15px; line-height: 1.7; margin: 0;\"><strong style=\"color: #0b2d5e;\">De onde vem um database novo?<\/strong> Assim como o SQL Server usa o database <code style=\"background: #EEF2F8; padding: 2px 6px; border-radius: 4px; font-family: Consolas,Menlo,monospace; font-size: 14px; color: #0b2d5e;\">model<\/code> como molde para todo database criado, o Postgres clona o database <code style=\"background: #EEF2F8; padding: 2px 6px; border-radius: 4px; font-family: Consolas,Menlo,monospace; font-size: 14px; color: #0b2d5e;\">template1<\/code> por padr\u00e3o em todo <code style=\"background: #EEF2F8; padding: 2px 6px; border-radius: 4px; font-family: Consolas,Menlo,monospace; font-size: 14px; color: #0b2d5e;\">CREATE DATABASE<\/code>\/<code style=\"background: #EEF2F8; padding: 2px 6px; border-radius: 4px; font-family: Consolas,Menlo,monospace; font-size: 14px; color: #0b2d5e;\">createdb<\/code>. Alterar algo em <code style=\"background: #EEF2F8; padding: 2px 6px; border-radius: 4px; font-family: Consolas,Menlo,monospace; font-size: 14px; color: #0b2d5e;\">template1<\/code> (uma extens\u00e3o, uma fun\u00e7\u00e3o utilit\u00e1ria) propaga para todo database novo criado depois. J\u00e1 <code style=\"background: #EEF2F8; padding: 2px 6px; border-radius: 4px; font-family: Consolas,Menlo,monospace; font-size: 14px; color: #0b2d5e;\">template0<\/code> \u00e9 um molde &#8220;de f\u00e1brica&#8221;, intocado, usado para restaurar dumps com encoding\/collation diferentes do padr\u00e3o do cluster.<\/p>\n<\/div>\n<h2 style=\"color: #0b2d5e; font-size: 24px; margin: 38px 0 14px 0; padding-left: 14px; border-left: 4px solid #F5C800;\">Por que cross-database query segue caminhos diferentes em cada banco<\/h2>\n<p style=\"color: #33475b; font-size: 16px; line-height: 1.8; margin: 0 0 16px 0;\">\u00c9 uma decis\u00e3o de arquitetura presente desde as origens do Postgres: cada database \u00e9 uma unidade de isolamento completa, com cat\u00e1logo pr\u00f3prio, controle de acesso pr\u00f3prio e visibilidade de transa\u00e7\u00e3o pr\u00f3pria. N\u00e3o existe join de execu\u00e7\u00e3o \u00fanica entre databases dentro do motor \u2014 qualquer cruzamento passa por uma camada expl\u00edcita.<\/p>\n<p style=\"color: #33475b; font-size: 16px; line-height: 1.8; margin: 0 0 16px 0;\">Quando voc\u00ea realmente precisa cruzar dados entre databases no mesmo cluster (ou at\u00e9 em servidores diferentes), as sa\u00eddas comuns s\u00e3o:<\/p>\n<ul style=\"margin: 0 0 18px 22px; padding: 0; color: #33475b; font-size: 16px; line-height: 1.8;\">\n<li style=\"margin: 8px 0;\"><strong style=\"color: #0b2d5e;\">postgres_fdw<\/strong> \u2014 a op\u00e7\u00e3o mais robusta e recomendada hoje em dia. Cria &#8220;tabelas estrangeiras&#8221; que apontam para tabelas em outro database (mesmo servidor ou remoto), permitindo us\u00e1-las quase como locais, inclusive com algum push-down de filtros para performance. \u00c9 o equivalente conceitual do Linked Server, explicado no quadro abaixo.<\/li>\n<li style=\"margin: 8px 0;\"><strong style=\"color: #0b2d5e;\">dblink<\/strong> \u2014 extens\u00e3o mais antiga, baseada em fun\u00e7\u00f5es que executam queries em outro database e retornam o resultado. Mais simples de usar pontualmente, por\u00e9m sem otimiza\u00e7\u00f5es que o <code style=\"background: #EEF2F8; padding: 2px 6px; border-radius: 4px; font-family: Consolas,Menlo,monospace; font-size: 14px; color: #0b2d5e;\">postgres_fdw<\/code> oferece.<\/li>\n<li style=\"margin: 8px 0;\"><strong style=\"color: #0b2d5e;\">Join em n\u00edvel de aplica\u00e7\u00e3o<\/strong> \u2014 abrir duas conex\u00f5es, buscar os dados de cada lado, e cruzar em mem\u00f3ria na aplica\u00e7\u00e3o. Mais trabalho, mas evita acoplar bancos logicamente separados.<\/li>\n<li style=\"margin: 8px 0;\"><strong style=\"color: #0b2d5e;\">Repensar a separa\u00e7\u00e3o em databases<\/strong> \u2014 se dois &#8220;bancos&#8221; precisam de JOINs frequentes entre si, muitas vezes o desenho correto no Postgres \u00e9 <em>um \u00fanico database com m\u00faltiplos schemas<\/em>, j\u00e1 que cruzar schemas do mesmo database n\u00e3o tem nenhuma restri\u00e7\u00e3o.<\/li>\n<\/ul>\n<div style=\"background: #FFF8DE; border-left: 6px solid #F5C800; border-radius: 0 10px 10px 0; padding: 18px 22px; margin: 22px 0;\">\n<p style=\"color: #0b2d5e; font-size: 15px; line-height: 1.7; margin: 0;\"><strong style=\"color: #0b2d5e;\">Pensando como DBA SQL Server:<\/strong> a analogia mais pr\u00f3xima de um <code style=\"background: #EEF2F8; padding: 2px 6px; border-radius: 4px; font-family: Consolas,Menlo,monospace; font-size: 14px; color: #0b2d5e;\">postgres_fdw<\/code> \u00e9 o <strong style=\"color: #0b2d5e;\">Linked Server<\/strong>. Os dois resolvem o mesmo problema \u2014 enxergar objetos de outro banco como se fossem locais \u2014 e os dois t\u00eam o mesmo tipo de pegadinha: parecem transparentes na sintaxe, mas por baixo geram uma conex\u00e3o separada, com custo de rede\/serializa\u00e7\u00e3o e comportamento transacional pr\u00f3prio (nada de <code style=\"background: #EEF2F8; padding: 2px 6px; border-radius: 4px; font-family: Consolas,Menlo,monospace; font-size: 14px; color: #0b2d5e;\">BEGIN TRAN<\/code> cobrindo os dois lados de gra\u00e7a). A diferen\u00e7a pr\u00e1tica est\u00e1 no grau de exposi\u00e7\u00e3o: um Linked Server, uma vez criado, exp\u00f5e o cat\u00e1logo inteiro do servidor remoto automaticamente; o <code style=\"background: #EEF2F8; padding: 2px 6px; border-radius: 4px; font-family: Consolas,Menlo,monospace; font-size: 14px; color: #0b2d5e;\">postgres_fdw<\/code> \u00e9 mais granular \u2014 voc\u00ea importa explicitamente, tabela por tabela ou schema por schema, via <code style=\"background: #EEF2F8; padding: 2px 6px; border-radius: 4px; font-family: Consolas,Menlo,monospace; font-size: 14px; color: #0b2d5e;\">IMPORT FOREIGN SCHEMA<\/code>\/<code style=\"background: #EEF2F8; padding: 2px 6px; border-radius: 4px; font-family: Consolas,Menlo,monospace; font-size: 14px; color: #0b2d5e;\">CREATE FOREIGN TABLE<\/code>, o que tende a deixar a superf\u00edcie de acesso mais controlada.<\/p>\n<\/div>\n<div style=\"background: #FFF8DE; border-left: 6px solid #F5C800; border-radius: 0 10px 10px 0; padding: 18px 22px; margin: 22px 0;\">\n<p style=\"color: #0b2d5e; font-size: 15px; line-height: 1.7; margin: 0;\"><strong style=\"color: #0b2d5e;\">Quer custo zero? Use schemas, n\u00e3o databases.<\/strong> No Postgres, um JOIN entre schemas do mesmo database \u00e9 nativo, sem nenhuma camada extra \u2014 o planejador enxerga as duas tabelas normalmente e otimiza como qualquer outro JOIN. J\u00e1 um JOIN entre databases diferentes sempre passa por <code style=\"background: #EEF2F8; padding: 2px 6px; border-radius: 4px; font-family: Consolas,Menlo,monospace; font-size: 14px; color: #0b2d5e;\">postgres_fdw<\/code>\/<code style=\"background: #EEF2F8; padding: 2px 6px; border-radius: 4px; font-family: Consolas,Menlo,monospace; font-size: 14px; color: #0b2d5e;\">dblink<\/code>, mesmo que os dois databases estejam no mesmo cluster, na mesma m\u00e1quina f\u00edsica \u2014 e essa camada tem custo real: serializa\u00e7\u00e3o dos dados, tr\u00e1fego de rede\/loopback e, em geral, menos otimiza\u00e7\u00f5es de plano do que um JOIN nativo. Se o objetivo \u00e9 evitar esse custo, a resposta arquitetural correta \u00e9 <strong style=\"color: #0b2d5e;\">databases diferentes viram schemas diferentes dentro de um \u00fanico database<\/strong>.<\/p>\n<\/div>\n<pre style=\"background: #0D1B40; color: #ffffff; padding: 18px 22px; border-radius: 10px; font-family: Consolas,Menlo,monospace; font-size: 14px; line-height: 1.7; overflow-x: auto; margin: 0 0 18px 0;\"><span style=\"color: #000000;\"><code style=\"background: none; padding: 0px; font-family: inherit;\">-- Exemplo m\u00ednimo de postgres_fdw, executado dentro de \"bancoa\"\r\n-- para enxergar uma tabela que vive em \"bancob\"\r\n\r\nCREATE EXTENSION IF NOT EXISTS postgres_fdw;\r\n\r\nCREATE SERVER bancob_srv\r\n  FOREIGN DATA WRAPPER postgres_fdw\r\n  OPTIONS (host 'localhost', dbname 'bancob', port '5432');\r\n\r\nCREATE USER MAPPING FOR CURRENT_USER\r\n  SERVER bancob_srv\r\n  OPTIONS (user 'postgres', password 'senha_segura');\r\n\r\nIMPORT FOREIGN SCHEMA public\r\n  LIMIT TO (pedidos)\r\n  FROM SERVER bancob_srv\r\n  INTO public;\r\n\r\n-- Agora \"pedidos\" existe como tabela estrangeira em bancoa, e o JOIN funciona\r\nSELECT c.nome, p.valor\r\nFROM clientes c\r\nJOIN pedidos p ON p.cliente_id = c.id;<\/code><\/span><\/pre>\n<hr style=\"border: none; border-top: 1px solid #E1E8F2; margin: 40px 0;\" \/>\n<h2 style=\"color: #0b2d5e; font-size: 24px; margin: 38px 0 14px 0; padding-left: 14px; border-left: 4px solid #F5C800;\">Comparativo lado a lado<\/h2>\n<table style=\"width: 100%; border-collapse: collapse; margin: 0 0 22px 0; font-size: 14.5px;\">\n<tbody>\n<tr>\n<td style=\"background: #0B2D5E; color: #ffffff; font-weight: bold; padding: 11px 14px; text-align: left; vertical-align: top;\">Conceito<\/td>\n<td style=\"background: #0B2D5E; color: #ffffff; font-weight: bold; padding: 11px 14px; text-align: left; vertical-align: top;\">SQL Server<\/td>\n<td style=\"background: #0B2D5E; color: #ffffff; font-weight: bold; padding: 11px 14px; text-align: left; vertical-align: top;\">PostgreSQL<\/td>\n<\/tr>\n<tr>\n<td style=\"border-bottom: 1px solid #E1E8F2; padding: 10px 14px; text-align: left; vertical-align: top; color: #33475b;\">N\u00edvel mais alto<\/td>\n<td style=\"border-bottom: 1px solid #E1E8F2; padding: 10px 14px; text-align: left; vertical-align: top; color: #33475b;\">Inst\u00e2ncia<\/td>\n<td style=\"border-bottom: 1px solid #E1E8F2; padding: 10px 14px; text-align: left; vertical-align: top; color: #33475b;\">Cluster (criado pelo <code style=\"background: #EEF2F8; padding: 2px 6px; border-radius: 4px; font-family: Consolas,Menlo,monospace; font-size: 14px; color: #0b2d5e;\">initdb<\/code>)<\/td>\n<\/tr>\n<tr>\n<td style=\"border-bottom: 1px solid #E1E8F2; padding: 10px 14px; text-align: left; vertical-align: top; color: #33475b;\">Schema padr\u00e3o<\/td>\n<td style=\"border-bottom: 1px solid #E1E8F2; padding: 10px 14px; text-align: left; vertical-align: top; color: #33475b;\"><code style=\"background: #EEF2F8; padding: 2px 6px; border-radius: 4px; font-family: Consolas,Menlo,monospace; font-size: 14px; color: #0b2d5e;\">dbo<\/code><\/td>\n<td style=\"border-bottom: 1px solid #E1E8F2; padding: 10px 14px; text-align: left; vertical-align: top; color: #33475b;\"><code style=\"background: #EEF2F8; padding: 2px 6px; border-radius: 4px; font-family: Consolas,Menlo,monospace; font-size: 14px; color: #0b2d5e;\">public<\/code><\/td>\n<\/tr>\n<tr>\n<td style=\"border-bottom: 1px solid #E1E8F2; padding: 10px 14px; text-align: left; vertical-align: top; color: #33475b;\">Database molde para novos databases<\/td>\n<td style=\"border-bottom: 1px solid #E1E8F2; padding: 10px 14px; text-align: left; vertical-align: top; color: #33475b;\"><code style=\"background: #EEF2F8; padding: 2px 6px; border-radius: 4px; font-family: Consolas,Menlo,monospace; font-size: 14px; color: #0b2d5e;\">model<\/code><\/td>\n<td style=\"border-bottom: 1px solid #E1E8F2; padding: 10px 14px; text-align: left; vertical-align: top; color: #33475b;\"><code style=\"background: #EEF2F8; padding: 2px 6px; border-radius: 4px; font-family: Consolas,Menlo,monospace; font-size: 14px; color: #0b2d5e;\">template1<\/code><\/td>\n<\/tr>\n<tr>\n<td style=\"border-bottom: 1px solid #E1E8F2; padding: 10px 14px; text-align: left; vertical-align: top; color: #33475b;\">Nomea\u00e7\u00e3o completa de objeto<\/td>\n<td style=\"border-bottom: 1px solid #E1E8F2; padding: 10px 14px; text-align: left; vertical-align: top; color: #33475b;\">3 partes: <code style=\"background: #EEF2F8; padding: 2px 6px; border-radius: 4px; font-family: Consolas,Menlo,monospace; font-size: 14px; color: #0b2d5e;\">banco.schema.objeto<\/code><\/td>\n<td style=\"border-bottom: 1px solid #E1E8F2; padding: 10px 14px; text-align: left; vertical-align: top; color: #33475b;\">2 partes: <code style=\"background: #EEF2F8; padding: 2px 6px; border-radius: 4px; font-family: Consolas,Menlo,monospace; font-size: 14px; color: #0b2d5e;\">schema.objeto<\/code><\/td>\n<\/tr>\n<tr>\n<td style=\"border-bottom: 1px solid #E1E8F2; padding: 10px 14px; text-align: left; vertical-align: top; color: #33475b;\">Trocar de database na mesma sess\u00e3o<\/td>\n<td style=\"border-bottom: 1px solid #E1E8F2; padding: 10px 14px; text-align: left; vertical-align: top; color: #33475b;\"><code style=\"background: #EEF2F8; padding: 2px 6px; border-radius: 4px; font-family: Consolas,Menlo,monospace; font-size: 14px; color: #0b2d5e;\">USE outrobanco;<\/code><\/td>\n<td style=\"border-bottom: 1px solid #E1E8F2; padding: 10px 14px; text-align: left; vertical-align: top; color: #33475b;\">N\u00e3o existe \u2014 requer nova conex\u00e3o (<code style=\"background: #EEF2F8; padding: 2px 6px; border-radius: 4px; font-family: Consolas,Menlo,monospace; font-size: 14px; color: #0b2d5e;\">\\c<\/code> no psql)<\/td>\n<\/tr>\n<tr>\n<td style=\"border-bottom: 1px solid #E1E8F2; padding: 10px 14px; text-align: left; vertical-align: top; color: #33475b;\">JOIN entre databases da mesma inst\u00e2ncia<\/td>\n<td style=\"border-bottom: 1px solid #E1E8F2; padding: 10px 14px; text-align: left; vertical-align: top; color: #33475b;\">Refer\u00eancia direta via cat\u00e1logo compartilhado<\/td>\n<td style=\"border-bottom: 1px solid #E1E8F2; padding: 10px 14px; text-align: left; vertical-align: top; color: #33475b;\">Via camada expl\u00edcita: <code style=\"background: #EEF2F8; padding: 2px 6px; border-radius: 4px; font-family: Consolas,Menlo,monospace; font-size: 14px; color: #0b2d5e;\">postgres_fdw<\/code>\/<code style=\"background: #EEF2F8; padding: 2px 6px; border-radius: 4px; font-family: Consolas,Menlo,monospace; font-size: 14px; color: #0b2d5e;\">dblink<\/code><\/td>\n<\/tr>\n<tr>\n<td style=\"border-bottom: 1px solid #E1E8F2; padding: 10px 14px; text-align: left; vertical-align: top; color: #33475b;\">JOIN entre schemas do mesmo database<\/td>\n<td style=\"border-bottom: 1px solid #E1E8F2; padding: 10px 14px; text-align: left; vertical-align: top; color: #33475b;\">Refer\u00eancia direta<\/td>\n<td style=\"border-bottom: 1px solid #E1E8F2; padding: 10px 14px; text-align: left; vertical-align: top; color: #33475b;\">Refer\u00eancia direta<\/td>\n<\/tr>\n<tr>\n<td style=\"border-bottom: 1px solid #E1E8F2; padding: 10px 14px; text-align: left; vertical-align: top; color: #33475b;\">Cat\u00e1logo de metadados<\/td>\n<td style=\"border-bottom: 1px solid #E1E8F2; padding: 10px 14px; text-align: left; vertical-align: top; color: #33475b;\">Isolado por database, mas acess\u00edvel pelo mesmo processo\/engine da inst\u00e2ncia<\/td>\n<td style=\"border-bottom: 1px solid #E1E8F2; padding: 10px 14px; text-align: left; vertical-align: top; color: #33475b;\">Isolado por database, e acess\u00edvel s\u00f3 pela conex\u00e3o daquele database<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h2 style=\"color: #0b2d5e; font-size: 24px; margin: 38px 0 14px 0; padding-left: 14px; border-left: 4px solid #F5C800;\">Erros comuns de quem vem do SQL Server<\/h2>\n<ul style=\"margin: 0 0 18px 22px; padding: 0; color: #33475b; font-size: 16px; line-height: 1.8;\">\n<li style=\"margin: 8px 0;\"><strong style=\"color: #0b2d5e;\">Escrever nome de tr\u00eas partes por h\u00e1bito.<\/strong> <code style=\"background: #EEF2F8; padding: 2px 6px; border-radius: 4px; font-family: Consolas,Menlo,monospace; font-size: 14px; color: #0b2d5e;\">bancoa.public.clientes<\/code> s\u00f3 funciona se <code style=\"background: #EEF2F8; padding: 2px 6px; border-radius: 4px; font-family: Consolas,Menlo,monospace; font-size: 14px; color: #0b2d5e;\">bancoa<\/code> for o pr\u00f3prio database da conex\u00e3o atual \u2014 o Postgres aceita o prefixo, mas ele precisa &#8220;bater&#8221; com o database conectado, n\u00e3o pode apontar para outro.<\/li>\n<li style=\"margin: 8px 0;\"><strong style=\"color: #0b2d5e;\">Achar que <code style=\"background: #EEF2F8; padding: 2px 6px; border-radius: 4px; font-family: Consolas,Menlo,monospace; font-size: 14px; color: #0b2d5e;\">\\c<\/code> \u00e9 igual a um <code style=\"background: #EEF2F8; padding: 2px 6px; border-radius: 4px; font-family: Consolas,Menlo,monospace; font-size: 14px; color: #0b2d5e;\">USE<\/code>.<\/strong> \u00c9 uma reconex\u00e3o de verdade: fecha a sess\u00e3o TCP atual e abre outra, o que tamb\u00e9m derruba qualquer estado de sess\u00e3o (vari\u00e1veis tempor\u00e1rias, tabelas temp, transa\u00e7\u00e3o em aberto).<\/li>\n<li style=\"margin: 8px 0;\"><strong style=\"color: #0b2d5e;\">Modelar um database por cliente\/tenant achando que vai poder cruzar dados facilmente depois.<\/strong> Se o plano \u00e9 multi-tenant com necessidade de relat\u00f3rios cruzando tenants, schemas separados dentro de um \u00fanico database costumam ser um desenho mais simples de manter no Postgres do que databases separados.<\/li>\n<li style=\"margin: 8px 0;\"><strong style=\"color: #0b2d5e;\">Esperar que uma transa\u00e7\u00e3o cubra os dois lados de um <code style=\"background: #EEF2F8; padding: 2px 6px; border-radius: 4px; font-family: Consolas,Menlo,monospace; font-size: 14px; color: #0b2d5e;\">dblink<\/code>\/<code style=\"background: #EEF2F8; padding: 2px 6px; border-radius: 4px; font-family: Consolas,Menlo,monospace; font-size: 14px; color: #0b2d5e;\">postgres_fdw<\/code>.<\/strong> S\u00e3o conex\u00f5es distintas por baixo dos panos; garantias de atomicidade entre os dois databases exigem cuidado extra (two-phase commit manual, ou aceitar consist\u00eancia eventual), al\u00e9m de compreender a adi\u00e7\u00e3o do custo de rede a opera\u00e7\u00e3o.<\/li>\n<\/ul>\n<h2 style=\"color: #0b2d5e; font-size: 24px; margin: 38px 0 14px 0; padding-left: 14px; border-left: 4px solid #F5C800;\">Resumo<\/h2>\n<p style=\"color: #33475b; font-size: 16px; line-height: 1.8; margin: 0 0 16px 0;\">No SQL Server, todos os databases da inst\u00e2ncia s\u00e3o servidos pelo mesmo processo\/engine, que tem acesso simult\u00e2neo ao cat\u00e1logo pr\u00f3prio de cada um \u2014 por isso permite refer\u00eancia direta entre eles no mesmo plano de execu\u00e7\u00e3o. No Postgres, o cluster hospeda v\u00e1rios databases, mas cada um mant\u00e9m cat\u00e1logo e visibilidade de transa\u00e7\u00e3o pr\u00f3prios, e cada conex\u00e3o fica associada a um \u00fanico database. Schemas continuam sendo o n\u00edvel de organiza\u00e7\u00e3o dentro do database, sem nenhuma restri\u00e7\u00e3o extra entre si. Quando o cruzamento entre databases no Postgres \u00e9 realmente necess\u00e1rio, <code style=\"background: #EEF2F8; padding: 2px 6px; border-radius: 4px; font-family: Consolas,Menlo,monospace; font-size: 14px; color: #0b2d5e;\">postgres_fdw<\/code> \u00e9 a ponte mais robusta dispon\u00edvel hoje \u2014 e muitas vezes a pergunta certa \u00e9 se aqueles &#8220;dois bancos&#8221; n\u00e3o deveriam, desde o in\u00edcio, ser dois schemas de um \u00fanico database.<\/p>\n<div style=\"background: linear-gradient(135deg,#0B2D5E 0%,#16437F 100%); border-radius: 14px; padding: 30px 32px; margin: 34px 0 10px 0;\">\n<p style=\"color: #ffffff; font-size: 19px; font-weight: bold; line-height: 1.5; margin: 0 0 8px 0;\">Tem PostgreSQL em produ\u00e7\u00e3o na sua empresa?<\/p>\n<p style=\"color: #d6e2f5; font-size: 15px; line-height: 1.7; margin: 0 0 18px 0;\">Fa\u00e7a o Power PostgreSQL Check-up: uma avalia\u00e7\u00e3o gratuita de performance, backup, seguran\u00e7a e alta disponibilidade, feita pelos nossos especialistas. Sem custo e sem compromisso.<\/p>\n<p><a style=\"display: inline-block; background: #F5C800; color: #0b2d5e; font-weight: bold; font-size: 16px; padding: 13px 26px; border-radius: 8px; text-decoration: none;\" href=\"https:\/\/powertuning.com.br\/blog\/postgresql-lento-sem-monitoramento-ou-com-risco-de-falha-oferecemos-um-check-up-gratuito-para-o-seu-ambiente\/\" target=\"_blank\" rel=\"noopener\">Quero meu check-up gratuito<\/a><\/p>\n<\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>&nbsp; SQL Server e PostgreSQL organizam inst\u00e2ncia, database e schema de formas estruturalmente diferentes \u2014 e essa diferen\u00e7a muda completamente como uma query cruza dados entre bancos em cada um. Francisco Porf\u00edrio \u00b7 Time PostgreSQL da Power Tuning Na primeira postagem desta s\u00e9rie, falamos sobre o primeiro choque de quem sai do wizard do SQL&hellip; <br \/> <a class=\"read-more\" href=\"https:\/\/powertuning.com.br\/blog\/de-sql-server-para-postgresql-instancia-database-e-schema-onde-cada-coisa-mora\/\">Leia mais<\/a><\/p>\n","protected":false},"author":27,"featured_media":8742,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"content-type":"","_exactmetrics_skip_tracking":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_feature_clip_id":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_post_was_ever_published":false,"_members_access_role":[],"_members_access_error":""},"categories":[176,124],"tags":[1450,1448,1452,1451,1446,1445,1449,1447],"class_list":["post-8739","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-banco-de-dados","category-postgresql","tag-arquitetura-sql-server-vs-postgresql","tag-catalogo-de-metadados","tag-cross-database-query","tag-dba-sql-server-para-postgresql","tag-dblink","tag-instancia-database-schema-postgresql","tag-join-entre-databases","tag-multi-tenant-schema-postgresql"],"jetpack_featured_media_url":"https:\/\/powertuning.com.br\/blog\/wp-content\/uploads\/2026\/07\/Artigo_2.png","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/powertuning.com.br\/blog\/wp-json\/wp\/v2\/posts\/8739","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/powertuning.com.br\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/powertuning.com.br\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/powertuning.com.br\/blog\/wp-json\/wp\/v2\/users\/27"}],"replies":[{"embeddable":true,"href":"https:\/\/powertuning.com.br\/blog\/wp-json\/wp\/v2\/comments?post=8739"}],"version-history":[{"count":6,"href":"https:\/\/powertuning.com.br\/blog\/wp-json\/wp\/v2\/posts\/8739\/revisions"}],"predecessor-version":[{"id":8753,"href":"https:\/\/powertuning.com.br\/blog\/wp-json\/wp\/v2\/posts\/8739\/revisions\/8753"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/powertuning.com.br\/blog\/wp-json\/wp\/v2\/media\/8742"}],"wp:attachment":[{"href":"https:\/\/powertuning.com.br\/blog\/wp-json\/wp\/v2\/media?parent=8739"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/powertuning.com.br\/blog\/wp-json\/wp\/v2\/categories?post=8739"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/powertuning.com.br\/blog\/wp-json\/wp\/v2\/tags?post=8739"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}