{"id":8766,"date":"2026-09-01T09:04:32","date_gmt":"2026-09-01T12:04:32","guid":{"rendered":"https:\/\/powertuning.com.br\/blog\/?p=8766"},"modified":"2026-09-01T09:04:32","modified_gmt":"2026-09-01T12:04:32","slug":"de-sql-server-para-postgresql-03-login-user-role-quem-manda-em-que-e-por-que-nao-existe-um-sa-no-postgres","status":"publish","type":"post","link":"https:\/\/powertuning.com.br\/blog\/de-sql-server-para-postgresql-03-login-user-role-quem-manda-em-que-e-por-que-nao-existe-um-sa-no-postgres\/","title":{"rendered":"De SQL Server para PostgreSQL #03 &#8211; Login, user, role: quem manda em qu\u00ea, e por que n\u00e3o existe um &#8220;sa&#8221; no Postgres."},"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 separa login e user em duas camadas; o Postgres funde tudo em um \u00fanico conceito, a role \u2014 e essa fus\u00e3o muda a forma como voc\u00ea pensa superusu\u00e1rio, permiss\u00e3o padr\u00e3o e escopo de acesso.<\/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 e Renato Siqueira<\/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;\">Nos dois primeiros posts desta s\u00e9rie, tratamos da instala\u00e7\u00e3o e da hierarquia inst\u00e2ncia\/database\/schema. Resolvidos esses dois estranhamentos, o terceiro geralmente aparece na primeira reuni\u00e3o de seguran\u00e7a: algu\u00e9m pergunta &#8220;quem \u00e9 o <code style=\"background: #EEF2F8; padding: 2px 6px; border-radius: 4px; font-family: Consolas,Menlo,monospace; font-size: 14px; color: #0b2d5e;\">sa<\/code> do Postgres?&#8221; \u2014 e a resposta correta n\u00e3o \u00e9 um nome, \u00e9 uma mudan\u00e7a de modelo mental.<\/p>\n<p style=\"color: #33475b; font-size: 16px; line-height: 1.8; margin: 0 0 16px 0;\">No SQL Server, o controle de acesso \u00e9 constru\u00eddo em duas camadas distintas: <strong style=\"color: #0b2d5e;\">login<\/strong> (autentica\u00e7\u00e3o, n\u00edvel de inst\u00e2ncia) e <strong style=\"color: #0b2d5e;\">user<\/strong> (autoriza\u00e7\u00e3o, n\u00edvel de database), com um mapeamento expl\u00edcito entre os dois. No Postgres, essas duas camadas colapsam em um \u00fanico objeto: a <strong style=\"color: #0b2d5e;\">role<\/strong>. N\u00e3o existe separa\u00e7\u00e3o estrutural entre &#8220;quem se conecta&#8221; e &#8220;quem tem permiss\u00e3o dentro do banco&#8221;.<\/p>\n<p style=\"color: #33475b; font-size: 16px; line-height: 1.8; margin: 0 0 16px 0;\">Este post cobre essa diferen\u00e7a de raiz, compara o superusu\u00e1rio de cada banco (<code style=\"background: #EEF2F8; padding: 2px 6px; border-radius: 4px; font-family: Consolas,Menlo,monospace; font-size: 14px; color: #0b2d5e;\">sa<\/code> x <code style=\"background: #EEF2F8; padding: 2px 6px; border-radius: 4px; font-family: Consolas,Menlo,monospace; font-size: 14px; color: #0b2d5e;\">postgres<\/code>), e explica o que vem liberado por padr\u00e3o em cada instala\u00e7\u00e3o \u2014 incluindo uma mudan\u00e7a recente do Postgres que pegou muita gente de surpresa.<\/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 (2 camadas)<\/p>\n<div style=\"border: 1.5px dashed #0B2D5E; border-radius: 10px; padding: 16px 12px; text-align: left;\">\n<div style=\"background: #EAF1FC; border: 1.5px solid #0B2D5E; border-radius: 8px; padding: 12px 10px; text-align: center;\"><span style=\"display: block; color: #0b2d5e; font-size: 13px; font-weight: bold;\">N\u00edvel inst\u00e2ncia \u2014 LOGIN<\/span><br \/>\n<span style=\"display: block; color: #555555; font-size: 13px; margin-top: 7px;\">sa (sysadmin)<\/span><br \/>\n<span style=\"display: block; color: #555555; font-size: 13px;\">LoginApp, LoginETL&#8230;<\/span><br \/>\n<span style=\"display: block; color: #6b7a90; font-size: 11.5px; margin-top: 7px;\">Autentica no servidor<\/span><\/div>\n<p style=\"color: #0b2d5e; font-size: 12px; text-align: center; font-weight: bold; margin: 10px 0;\">\u2193 mapeamento<\/p>\n<div style=\"background: #EAF1FC; border: 1.5px solid #0B2D5E; border-radius: 8px; padding: 12px 10px; text-align: center;\"><span style=\"display: block; color: #0b2d5e; font-size: 13px; font-weight: bold;\">N\u00edvel database \u2014 USER<\/span><br \/>\n<span style=\"display: block; color: #555555; font-size: 13px; margin-top: 7px;\">dbo, user_app (por database)<\/span><br \/>\n<span style=\"display: block; color: #555555; font-size: 13px;\">db_owner, db_datareader&#8230;<\/span><br \/>\n<span style=\"display: block; color: #6b7a90; font-size: 11.5px; margin-top: 7px;\">Autoriza dentro de UM database<\/span><\/div>\n<p style=\"background: #FFF8DE; border: 1.5px solid #F5C800; border-radius: 15px; color: #0b2d5e; font-size: 12.5px; font-weight: bold; text-align: center; padding: 7px 10px; margin: 14px 0 0 0;\">1 login pode virar N users<\/p>\n<p style=\"color: #6b7a90; font-size: 11.5px; text-align: center; margin: 5px 0 0 0;\">um mapeamento por database<\/p>\n<\/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 (1 camada)<\/p>\n<div style=\"border: 1.5px dashed #B8860B; border-radius: 10px; padding: 16px 12px; text-align: left;\">\n<div style=\"background: #FBF3D3; border: 1.5px solid #C79A1E; border-radius: 8px; padding: 12px 10px; text-align: center;\"><span style=\"display: block; color: #b8860b; font-size: 13px; font-weight: bold;\">ROLE (n\u00edvel cluster, \u00fanico)<\/span><br \/>\n<span style=\"display: block; color: #555555; font-size: 13px; margin-top: 7px;\">postgres (superuser)<\/span><br \/>\n<span style=\"display: block; color: #555555; font-size: 13px;\">app_user (LOGIN)<\/span><br \/>\n<span style=\"display: block; color: #555555; font-size: 13px;\">grupo_leitura (NOLOGIN)<\/span><br \/>\n<span style=\"display: block; color: #8a6d1f; font-size: 11.5px; margin-top: 7px;\">Mesmo objeto autentica E autoriza<\/span><br \/>\n<span style=\"display: block; color: #8a6d1f; font-size: 11.5px;\">vis\u00edvel em todo o cluster<\/span><\/div>\n<p style=\"color: #b8860b; font-size: 12px; text-align: center; font-weight: bold; margin: 10px 0;\">\u2193 GRANT grupo_leitura TO app_user<\/p>\n<div style=\"background: #FBF3D3; border: 1.5px solid #C79A1E; border-radius: 8px; padding: 12px 10px; text-align: center;\"><span style=\"display: block; color: #b8860b; font-size: 13px;\">app_user herda de<\/span><br \/>\n<span style=\"display: block; color: #b8860b; font-size: 13px; font-weight: bold;\">grupo_leitura<\/span><\/div>\n<p style=\"background: #FFF8DE; border: 1.5px solid #F5C800; border-radius: 15px; color: #0b2d5e; font-size: 12.5px; font-weight: bold; text-align: center; padding: 7px 10px; margin: 14px 0 0 0;\">1 role, N databases<\/p>\n<p style=\"color: #6b7a90; font-size: 11.5px; text-align: center; margin: 5px 0 0 0;\">permiss\u00e3o \u00e9 dada database a database<\/p>\n<\/div>\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, login (autentica) e user (autoriza) s\u00e3o objetos diferentes, ligados por um mapeamento expl\u00edcito por database.<\/p>\n<p style=\"color: #777777; font-size: 14px; text-align: center; margin: 6px 0 0 0;\">No Postgres, a role faz as duas coisas ao mesmo tempo: existe uma vez no cluster e recebe permiss\u00f5es banco a banco.<\/p><figcaption style=\"font-size: 13px; color: #6b7a90; margin-top: 12px;\">Login + User (SQL Server) x Role unificado (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;\">No SQL Server, autentica\u00e7\u00e3o e autoriza\u00e7\u00e3o vivem em camadas separadas. Um <strong style=\"color: #0b2d5e;\">login<\/strong> existe no n\u00edvel da inst\u00e2ncia \u2014 pode ser autentica\u00e7\u00e3o do Windows ou autentica\u00e7\u00e3o SQL \u2014 e por si s\u00f3 n\u00e3o d\u00e1 acesso a nenhum dado. Para acessar um database espec\u00edfico, esse login precisa estar <strong style=\"color: #0b2d5e;\">mapeado<\/strong> a um <strong style=\"color: #0b2d5e;\">user<\/strong> dentro daquele database, e \u00e9 o user que recebe permiss\u00f5es sobre schemas, tabelas e procedures.<\/p>\n<p style=\"color: #33475b; font-size: 16px; line-height: 1.8; margin: 0 0 16px 0;\">Em cima disso, o SQL Server oferece pap\u00e9is prontos em dois n\u00edveis: <em>fixed server roles<\/em> (como <code style=\"background: #EEF2F8; padding: 2px 6px; border-radius: 4px; font-family: Consolas,Menlo,monospace; font-size: 14px; color: #0b2d5e;\">sysadmin<\/code>, <code style=\"background: #EEF2F8; padding: 2px 6px; border-radius: 4px; font-family: Consolas,Menlo,monospace; font-size: 14px; color: #0b2d5e;\">dbcreator<\/code>, <code style=\"background: #EEF2F8; padding: 2px 6px; border-radius: 4px; font-family: Consolas,Menlo,monospace; font-size: 14px; color: #0b2d5e;\">securityadmin<\/code>) e <em>fixed database roles<\/em> (<code style=\"background: #EEF2F8; padding: 2px 6px; border-radius: 4px; font-family: Consolas,Menlo,monospace; font-size: 14px; color: #0b2d5e;\">db_owner<\/code>, <code style=\"background: #EEF2F8; padding: 2px 6px; border-radius: 4px; font-family: Consolas,Menlo,monospace; font-size: 14px; color: #0b2d5e;\">db_datareader<\/code>, <code style=\"background: #EEF2F8; padding: 2px 6px; border-radius: 4px; font-family: Consolas,Menlo,monospace; font-size: 14px; color: #0b2d5e;\">db_datawriter<\/code>). No topo de tudo isso est\u00e1 o login <code style=\"background: #EEF2F8; padding: 2px 6px; border-radius: 4px; font-family: Consolas,Menlo,monospace; font-size: 14px; color: #0b2d5e;\">sa<\/code>, criado automaticamente na instala\u00e7\u00e3o, membro fixo e permanente do papel <code style=\"background: #EEF2F8; padding: 2px 6px; border-radius: 4px; font-family: Consolas,Menlo,monospace; font-size: 14px; color: #0b2d5e;\">sysadmin<\/code>.<\/p>\n<pre style=\"background: #0D1B40; color: #eaf1fc; 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;\"><code style=\"background: none; color: inherit; padding: 0; font-family: inherit;\"><span style=\"color: #8aa9ce;\">-- Criar login (n\u00edvel inst\u00e2ncia) e mapear para user (n\u00edvel database)<\/span>\r\nCREATE LOGIN login_app WITH PASSWORD = 'SenhaForte123!';\r\n\r\nUSE Vendas;\r\nCREATE USER user_app FOR LOGIN login_app;\r\nALTER ROLE db_datareader ADD MEMBER user_app;<\/code><\/pre>\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: role \u00e9 tudo<\/h2>\n<p style=\"color: #33475b; font-size: 16px; line-height: 1.8; margin: 0 0 16px 0;\">O Postgres n\u00e3o tem essa separa\u00e7\u00e3o em duas camadas. Existe um \u00fanico tipo de objeto, a <strong style=\"color: #0b2d5e;\">role<\/strong>, e o comando <code style=\"background: #EEF2F8; padding: 2px 6px; border-radius: 4px; font-family: Consolas,Menlo,monospace; font-size: 14px; color: #0b2d5e;\">CREATE USER<\/code> nada mais \u00e9 do que um apelido hist\u00f3rico para <code style=\"background: #EEF2F8; padding: 2px 6px; border-radius: 4px; font-family: Consolas,Menlo,monospace; font-size: 14px; color: #0b2d5e;\">CREATE ROLE ... WITH LOGIN<\/code>. Uma role pode se conectar (se tiver o atributo <code style=\"background: #EEF2F8; padding: 2px 6px; border-radius: 4px; font-family: Consolas,Menlo,monospace; font-size: 14px; color: #0b2d5e;\">LOGIN<\/code>) e, ao mesmo tempo, receber permiss\u00f5es \u2014 \u00e9 o pr\u00f3prio objeto de autentica\u00e7\u00e3o e de autoriza\u00e7\u00e3o.<\/p>\n<pre style=\"background: #0D1B40; color: #eaf1fc; 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;\"><code style=\"background: none; color: inherit; padding: 0; font-family: inherit;\"><span style=\"color: #8aa9ce;\">-- Estas duas linhas fazem exatamente a mesma coisa<\/span>\r\nCREATE USER app_user WITH PASSWORD 'SenhaForte123!';\r\nCREATE ROLE app_user WITH LOGIN PASSWORD 'SenhaForte123!';\r\n\r\n<span style=\"color: #8aa9ce;\">-- Role sem LOGIN funciona como um \"grupo\" de permiss\u00f5es, sem poder autenticar<\/span>\r\nCREATE ROLE grupo_leitura NOLOGIN;\r\nGRANT grupo_leitura TO app_user;<\/code><\/pre>\n<p style=\"color: #33475b; font-size: 16px; line-height: 1.8; margin: 0 0 16px 0;\">Outra consequ\u00eancia da fus\u00e3o: uma role <strong style=\"color: #0b2d5e;\">existe uma \u00fanica vez no cluster<\/strong>, n\u00e3o por database \u2014 diferente do user do SQL Server, que \u00e9 recriado (e pode ter permiss\u00f5es diferentes) em cada database. No Postgres, a mesma role <code style=\"background: #EEF2F8; padding: 2px 6px; border-radius: 4px; font-family: Consolas,Menlo,monospace; font-size: 14px; color: #0b2d5e;\">app_user<\/code> \u00e9 usada para se conectar em qualquer database do cluster, e as permiss\u00f5es s\u00e3o concedidas separadamente, database a database.<\/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;\">E o PUBLIC do Postgres n\u00e3o \u00e9 o mesmo PUBLIC do SQL Server.<\/strong> No SQL Server, <code style=\"background: #EEF2F8; padding: 2px 6px; border-radius: 4px; font-family: Consolas,Menlo,monospace; font-size: 14px; color: #0b2d5e;\">public<\/code> \u00e9 um papel de banco de dados real, ao qual todo user pertence automaticamente. No Postgres, <code style=\"background: #EEF2F8; padding: 2px 6px; border-radius: 4px; font-family: Consolas,Menlo,monospace; font-size: 14px; color: #0b2d5e;\">PUBLIC<\/code> n\u00e3o \u00e9 uma role de verdade \u2014 \u00e9 uma palavra-chave que significa &#8220;toda role existente, incluindo as que ainda v\u00e3o ser criadas&#8221;. <code style=\"background: #EEF2F8; padding: 2px 6px; border-radius: 4px; font-family: Consolas,Menlo,monospace; font-size: 14px; color: #0b2d5e;\">GRANT SELECT ON tabela TO PUBLIC<\/code> libera acesso para todo mundo, presente e futuro, e isso \u00e9 f\u00e1cil de conceder sem perceber a extens\u00e3o do efeito.<\/p>\n<\/div>\n<h2 style=\"color: #0b2d5e; font-size: 24px; margin: 38px 0 14px 0; padding-left: 14px; border-left: 4px solid #F5C800;\">sa x postgres: o superusu\u00e1rio<\/h2>\n<p style=\"color: #33475b; font-size: 16px; line-height: 1.8; margin: 0 0 16px 0;\">Os dois bancos criam um superusu\u00e1rio automaticamente na instala\u00e7\u00e3o, mas com naturezas ligeiramente diferentes. O <code style=\"background: #EEF2F8; padding: 2px 6px; border-radius: 4px; font-family: Consolas,Menlo,monospace; font-size: 14px; color: #0b2d5e;\">sa<\/code> \u00e9 um <strong style=\"color: #0b2d5e;\">login SQL<\/strong>, membro fixo do papel <code style=\"background: #EEF2F8; padding: 2px 6px; border-radius: 4px; font-family: Consolas,Menlo,monospace; font-size: 14px; color: #0b2d5e;\">sysadmin<\/code>; ele pode ser renomeado e, se a inst\u00e2ncia usa Windows Authentication, at\u00e9 desabilitado \u2014 boa pr\u00e1tica comum de hardening. O <code style=\"background: #EEF2F8; padding: 2px 6px; border-radius: 4px; font-family: Consolas,Menlo,monospace; font-size: 14px; color: #0b2d5e;\">postgres<\/code> \u00e9 uma <strong style=\"color: #0b2d5e;\">role<\/strong> criada pelo <code style=\"background: #EEF2F8; padding: 2px 6px; border-radius: 4px; font-family: Consolas,Menlo,monospace; font-size: 14px; color: #0b2d5e;\">initdb<\/code> com o atributo <code style=\"background: #EEF2F8; padding: 2px 6px; border-radius: 4px; font-family: Consolas,Menlo,monospace; font-size: 14px; color: #0b2d5e;\">SUPERUSER<\/code>, dono do database <code style=\"background: #EEF2F8; padding: 2px 6px; border-radius: 4px; font-family: Consolas,Menlo,monospace; font-size: 14px; color: #0b2d5e;\">postgres<\/code> e de todos os objetos do sistema \u2014 ele tamb\u00e9m pode ser renomeado, mas na pr\u00e1tica quase ningu\u00e9m faz isso, e ele n\u00e3o pode ficar sem nenhum superusu\u00e1rio no cluster.<\/p>\n<p style=\"color: #33475b; font-size: 16px; line-height: 1.8; margin: 0 0 16px 0;\">Uma diferen\u00e7a de comportamento importante: <code style=\"background: #EEF2F8; padding: 2px 6px; border-radius: 4px; font-family: Consolas,Menlo,monospace; font-size: 14px; color: #0b2d5e;\">SUPERUSER<\/code> no Postgres <strong style=\"color: #0b2d5e;\">ignora todas as checagens de permiss\u00e3o<\/strong>, sem exce\u00e7\u00e3o \u2014 equivalente ao <code style=\"background: #EEF2F8; padding: 2px 6px; border-radius: 4px; font-family: Consolas,Menlo,monospace; font-size: 14px; color: #0b2d5e;\">sysadmin<\/code>. Mas, diferente do SQL Server, o Postgres n\u00e3o tem uma hierarquia intermedi\u00e1ria t\u00e3o rica de pap\u00e9is fixos de servidor: em vez disso, oferece atributos independentes que se combinam, como <code style=\"background: #EEF2F8; padding: 2px 6px; border-radius: 4px; font-family: Consolas,Menlo,monospace; font-size: 14px; color: #0b2d5e;\">CREATEDB<\/code>, <code style=\"background: #EEF2F8; padding: 2px 6px; border-radius: 4px; font-family: Consolas,Menlo,monospace; font-size: 14px; color: #0b2d5e;\">CREATEROLE<\/code> e <code style=\"background: #EEF2F8; padding: 2px 6px; border-radius: 4px; font-family: Consolas,Menlo,monospace; font-size: 14px; color: #0b2d5e;\">REPLICATION<\/code>, permitindo dar poderes pontuais sem entregar superusu\u00e1rio completo.<\/p>\n<pre style=\"background: #0D1B40; color: #eaf1fc; 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;\"><code style=\"background: none; color: inherit; padding: 0; font-family: inherit;\"><span style=\"color: #8aa9ce;\">-- Poderes pontuais, sem entregar SUPERUSER completo<\/span>\r\nCREATE ROLE dba_operacional WITH LOGIN CREATEDB CREATEROLE PASSWORD 'SenhaForte123!';\r\n\r\n<span style=\"color: #8aa9ce;\">-- Ver atributos de um role<\/span>\r\n\\du dba_operacional<\/code><\/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;\">Pensando como DBA SQL Server:<\/strong> o h\u00e1bito de logar direto como <code style=\"background: #EEF2F8; padding: 2px 6px; border-radius: 4px; font-family: Consolas,Menlo,monospace; font-size: 14px; color: #0b2d5e;\">sa<\/code> no dia a dia j\u00e1 \u00e9 malvisto no mundo SQL Server \u2014 no Postgres essa recomenda\u00e7\u00e3o \u00e9 ainda mais forte. Como o <code style=\"background: #EEF2F8; padding: 2px 6px; border-radius: 4px; font-family: Consolas,Menlo,monospace; font-size: 14px; color: #0b2d5e;\">postgres<\/code> ignora toda checagem de permiss\u00e3o, um erro de digita\u00e7\u00e3o em um <code style=\"background: #EEF2F8; padding: 2px 6px; border-radius: 4px; font-family: Consolas,Menlo,monospace; font-size: 14px; color: #0b2d5e;\">DROP<\/code> ou <code style=\"background: #EEF2F8; padding: 2px 6px; border-radius: 4px; font-family: Consolas,Menlo,monospace; font-size: 14px; color: #0b2d5e;\">DELETE<\/code> n\u00e3o encontra nenhuma barreira no caminho. O padr\u00e3o recomendado \u00e9 reservar <code style=\"background: #EEF2F8; padding: 2px 6px; border-radius: 4px; font-family: Consolas,Menlo,monospace; font-size: 14px; color: #0b2d5e;\">postgres<\/code> para tarefas administrativas pontuais e criar roles com <code style=\"background: #EEF2F8; padding: 2px 6px; border-radius: 4px; font-family: Consolas,Menlo,monospace; font-size: 14px; color: #0b2d5e;\">OWNER<\/code> do database de aplica\u00e7\u00e3o para o uso do dia a dia.<\/p>\n<\/div>\n<h2 style=\"color: #0b2d5e; font-size: 24px; margin: 38px 0 14px 0; padding-left: 14px; border-left: 4px solid #F5C800;\">Permiss\u00f5es default: o que j\u00e1 vem liberado de f\u00e1brica<\/h2>\n<p style=\"color: #33475b; font-size: 16px; line-height: 1.8; margin: 0 0 16px 0;\">No SQL Server, o papel <code style=\"background: #EEF2F8; padding: 2px 6px; border-radius: 4px; font-family: Consolas,Menlo,monospace; font-size: 14px; color: #0b2d5e;\">public<\/code> de cada database vem com permiss\u00f5es m\u00ednimas por padr\u00e3o, e o user <code style=\"background: #EEF2F8; padding: 2px 6px; border-radius: 4px; font-family: Consolas,Menlo,monospace; font-size: 14px; color: #0b2d5e;\">guest<\/code> \u2014 que permitiria acesso sem login mapeado \u2014 vem com <strong style=\"color: #0b2d5e;\">REVOKE CONNECT<\/strong> por padr\u00e3o em databases novos. De modo geral, o padr\u00e3o de f\u00e1brica \u00e9 restritivo: quase nada funciona at\u00e9 que algu\u00e9m conceda.<\/p>\n<p style=\"color: #33475b; font-size: 16px; line-height: 1.8; margin: 0 0 16px 0;\">No <strong style=\"color: #0b2d5e;\">Postgres 18<\/strong>, o comportamento de f\u00e1brica no schema <code style=\"background: #EEF2F8; padding: 2px 6px; border-radius: 4px; font-family: Consolas,Menlo,monospace; font-size: 14px; color: #0b2d5e;\">public<\/code> de um database novo j\u00e1 \u00e9 restritivo: apenas o dono do schema (normalmente <code style=\"background: #EEF2F8; padding: 2px 6px; border-radius: 4px; font-family: Consolas,Menlo,monospace; font-size: 14px; color: #0b2d5e;\">postgres<\/code>) tem permiss\u00e3o de <code style=\"background: #EEF2F8; padding: 2px 6px; border-radius: 4px; font-family: Consolas,Menlo,monospace; font-size: 14px; color: #0b2d5e;\">CREATE<\/code> nele. Vale saber de onde isso veio, porque nem sempre foi assim: at\u00e9 a vers\u00e3o 14, todo database novo concedia <code style=\"background: #EEF2F8; padding: 2px 6px; border-radius: 4px; font-family: Consolas,Menlo,monospace; font-size: 14px; color: #0b2d5e;\">CREATE<\/code> e <code style=\"background: #EEF2F8; padding: 2px 6px; border-radius: 4px; font-family: Consolas,Menlo,monospace; font-size: 14px; color: #0b2d5e;\">USAGE<\/code> no schema <code style=\"background: #EEF2F8; padding: 2px 6px; border-radius: 4px; font-family: Consolas,Menlo,monospace; font-size: 14px; color: #0b2d5e;\">public<\/code> para <code style=\"background: #EEF2F8; padding: 2px 6px; border-radius: 4px; font-family: Consolas,Menlo,monospace; font-size: 14px; color: #0b2d5e;\">PUBLIC<\/code> \u2014 ou seja, qualquer role com permiss\u00e3o de conectar naquele database j\u00e1 podia criar tabelas no schema padr\u00e3o, sem nenhum GRANT expl\u00edcito. Esse comportamento liberal foi corrigido no <strong style=\"color: #0b2d5e;\">PostgreSQL 15<\/strong>, e \u00e9 a base restritiva que o Postgres 18 mant\u00e9m hoje.<\/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;\">Cluster antigo, ainda com o comportamento velho?<\/strong> A mudan\u00e7a introduzida no PG15 vale s\u00f3 para databases criados a partir dessa vers\u00e3o (porque herdam de <code style=\"background: #EEF2F8; padding: 2px 6px; border-radius: 4px; font-family: Consolas,Menlo,monospace; font-size: 14px; color: #0b2d5e;\">template1<\/code>, que j\u00e1 vem ajustado). Um database criado em vers\u00e3o anterior ao 15 e depois migrado\/atualizado \u2014 inclusive para o Postgres 18 atual \u2014 continua com o <code style=\"background: #EEF2F8; padding: 2px 6px; border-radius: 4px; font-family: Consolas,Menlo,monospace; font-size: 14px; color: #0b2d5e;\">GRANT<\/code> antigo em vigor, a menos que algu\u00e9m rode o <code style=\"background: #EEF2F8; padding: 2px 6px; border-radius: 4px; font-family: Consolas,Menlo,monospace; font-size: 14px; color: #0b2d5e;\">REVOKE<\/code> manualmente. Vale a pena checar isso explicitamente em qualquer ambiente que j\u00e1 existia antes do upgrade para a vers\u00e3o 15.<\/p>\n<\/div>\n<pre style=\"background: #0D1B40; color: #eaf1fc; 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;\"><code style=\"background: none; color: inherit; padding: 0; font-family: inherit;\"><span style=\"color: #8aa9ce;\">-- Fechar o comportamento antigo em um database criado antes do PG15<\/span>\r\n<span style=\"color: #8aa9ce;\">-- (databases criados em PG15+ j\u00e1 nascem assim, incluindo no Postgres 18)<\/span>\r\nREVOKE CREATE ON SCHEMA public FROM PUBLIC;\r\n\r\n<span style=\"color: #8aa9ce;\">-- Tamb\u00e9m vale revisar quem pode simplesmente se conectar ao database<\/span>\r\nREVOKE CONNECT ON DATABASE minha_base FROM PUBLIC;\r\nGRANT CONNECT ON DATABASE minha_base TO app_user, grupo_leitura;<\/code><\/pre>\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 role, dando acesso e ajustando permiss\u00f5es default<\/h2>\n<pre style=\"background: #0D1B40; color: #eaf1fc; 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;\"><code style=\"background: none; color: inherit; padding: 0; font-family: inherit;\"><span style=\"color: #8aa9ce;\">-- 1. Cria a role de aplica\u00e7\u00e3o, com senha e permiss\u00e3o de conectar<\/span>\r\nCREATE ROLE app_user WITH LOGIN PASSWORD 'SenhaForte123!';\r\nGRANT CONNECT ON DATABASE minha_base TO app_user;\r\n\r\n<span style=\"color: #8aa9ce;\">-- 2. D\u00e1 acesso ao schema e \u00e0s tabelas que j\u00e1 existem hoje<\/span>\r\nGRANT USAGE ON SCHEMA vendas TO app_user;\r\nGRANT SELECT, INSERT, UPDATE ON ALL TABLES IN SCHEMA vendas TO app_user;\r\n\r\n<span style=\"color: #8aa9ce;\">-- 3. Garante que TABELAS FUTURAS criadas nesse schema j\u00e1 saiam com o mesmo acesso<\/span>\r\n<span style=\"color: #8aa9ce;\">-- (equivalente funcional a n\u00e3o existir no SQL Server: l\u00e1, cada objeto novo<\/span>\r\n<span style=\"color: #8aa9ce;\">-- herda do db_datareader\/db_datawriter automaticamente por causa da role fixa)<\/span>\r\nALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA vendas\r\n  GRANT SELECT, INSERT, UPDATE ON TABLES TO app_user;<\/code><\/pre>\n<p style=\"color: #33475b; font-size: 16px; line-height: 1.8; margin: 0 0 16px 0;\">O passo 3 costuma ser o mais estranho para quem vem do SQL Server. L\u00e1, colocar um user em <code style=\"background: #EEF2F8; padding: 2px 6px; border-radius: 4px; font-family: Consolas,Menlo,monospace; font-size: 14px; color: #0b2d5e;\">db_datareader<\/code> j\u00e1 resolve leitura para objetos futuros, porque \u00e9 um papel de database inteiro. No Postgres, um <code style=\"background: #EEF2F8; padding: 2px 6px; border-radius: 4px; font-family: Consolas,Menlo,monospace; font-size: 14px; color: #0b2d5e;\">GRANT<\/code> comum vale s\u00f3 para os objetos que <strong style=\"color: #0b2d5e;\">j\u00e1 existem<\/strong> no momento em que ele \u00e9 executado \u2014 uma tabela criada depois n\u00e3o herda nada automaticamente, a menos que exista uma regra de <code style=\"background: #EEF2F8; padding: 2px 6px; border-radius: 4px; font-family: Consolas,Menlo,monospace; font-size: 14px; color: #0b2d5e;\">ALTER DEFAULT PRIVILEGES<\/code> configurada de antem\u00e3o, associada a quem vai criar os objetos novos.<\/p>\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;\">Autentica\u00e7\u00e3o<\/td>\n<td style=\"border-bottom: 1px solid #E1E8F2; padding: 10px 14px; text-align: left; vertical-align: top; color: #33475b;\">Login (n\u00edvel inst\u00e2ncia)<\/td>\n<td style=\"border-bottom: 1px solid #E1E8F2; padding: 10px 14px; text-align: left; vertical-align: top; color: #33475b;\">Role com atributo <code style=\"background: #EEF2F8; padding: 2px 6px; border-radius: 4px; font-family: Consolas,Menlo,monospace; font-size: 14px; color: #0b2d5e;\">LOGIN<\/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;\">Autoriza\u00e7\u00e3o<\/td>\n<td style=\"border-bottom: 1px solid #E1E8F2; padding: 10px 14px; text-align: left; vertical-align: top; color: #33475b;\">User (n\u00edvel database, mapeado ao login)<\/td>\n<td style=\"border-bottom: 1px solid #E1E8F2; padding: 10px 14px; text-align: left; vertical-align: top; color: #33475b;\">A pr\u00f3pria role, sem objeto separado<\/td>\n<\/tr>\n<tr>\n<td style=\"border-bottom: 1px solid #E1E8F2; padding: 10px 14px; text-align: left; vertical-align: top; color: #33475b;\">Escopo do objeto de acesso<\/td>\n<td style=\"border-bottom: 1px solid #E1E8F2; padding: 10px 14px; text-align: left; vertical-align: top; color: #33475b;\">Login: inst\u00e2ncia \/ User: por database<\/td>\n<td style=\"border-bottom: 1px solid #E1E8F2; padding: 10px 14px; text-align: left; vertical-align: top; color: #33475b;\">Role: cluster inteiro, uma vez s\u00f3<\/td>\n<\/tr>\n<tr>\n<td style=\"border-bottom: 1px solid #E1E8F2; padding: 10px 14px; text-align: left; vertical-align: top; color: #33475b;\">Superusu\u00e1rio 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;\">sa<\/code> (membro fixo de <code style=\"background: #EEF2F8; padding: 2px 6px; border-radius: 4px; font-family: Consolas,Menlo,monospace; font-size: 14px; color: #0b2d5e;\">sysadmin<\/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;\">postgres<\/code> (atributo <code style=\"background: #EEF2F8; padding: 2px 6px; border-radius: 4px; font-family: Consolas,Menlo,monospace; font-size: 14px; color: #0b2d5e;\">SUPERUSER<\/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;\">Pap\u00e9is prontos de poder parcial<\/td>\n<td style=\"border-bottom: 1px solid #E1E8F2; padding: 10px 14px; text-align: left; vertical-align: top; color: #33475b;\">Fixed server\/database roles (<code style=\"background: #EEF2F8; padding: 2px 6px; border-radius: 4px; font-family: Consolas,Menlo,monospace; font-size: 14px; color: #0b2d5e;\">dbcreator<\/code>, <code style=\"background: #EEF2F8; padding: 2px 6px; border-radius: 4px; font-family: Consolas,Menlo,monospace; font-size: 14px; color: #0b2d5e;\">db_owner<\/code>&#8230;)<\/td>\n<td style=\"border-bottom: 1px solid #E1E8F2; padding: 10px 14px; text-align: left; vertical-align: top; color: #33475b;\">Atributos combin\u00e1veis (<code style=\"background: #EEF2F8; padding: 2px 6px; border-radius: 4px; font-family: Consolas,Menlo,monospace; font-size: 14px; color: #0b2d5e;\">CREATEDB<\/code>, <code style=\"background: #EEF2F8; padding: 2px 6px; border-radius: 4px; font-family: Consolas,Menlo,monospace; font-size: 14px; color: #0b2d5e;\">CREATEROLE<\/code>&#8230;)<\/td>\n<\/tr>\n<tr>\n<td style=\"border-bottom: 1px solid #E1E8F2; padding: 10px 14px; text-align: left; vertical-align: top; color: #33475b;\">Grupo de permiss\u00f5es<\/td>\n<td style=\"border-bottom: 1px solid #E1E8F2; padding: 10px 14px; text-align: left; vertical-align: top; color: #33475b;\">Database role customizada + <code style=\"background: #EEF2F8; padding: 2px 6px; border-radius: 4px; font-family: Consolas,Menlo,monospace; font-size: 14px; color: #0b2d5e;\">ALTER ROLE ... ADD MEMBER<\/code><\/td>\n<td style=\"border-bottom: 1px solid #E1E8F2; padding: 10px 14px; text-align: left; vertical-align: top; color: #33475b;\">Role <code style=\"background: #EEF2F8; padding: 2px 6px; border-radius: 4px; font-family: Consolas,Menlo,monospace; font-size: 14px; color: #0b2d5e;\">NOLOGIN<\/code> + <code style=\"background: #EEF2F8; padding: 2px 6px; border-radius: 4px; font-family: Consolas,Menlo,monospace; font-size: 14px; color: #0b2d5e;\">GRANT role TO role<\/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;\">Permiss\u00e3o default em schema novo<\/td>\n<td style=\"border-bottom: 1px solid #E1E8F2; padding: 10px 14px; text-align: left; vertical-align: top; color: #33475b;\">Restritiva; <code style=\"background: #EEF2F8; padding: 2px 6px; border-radius: 4px; font-family: Consolas,Menlo,monospace; font-size: 14px; color: #0b2d5e;\">guest<\/code> com REVOKE CONNECT por padr\u00e3o<\/td>\n<td style=\"border-bottom: 1px solid #E1E8F2; padding: 10px 14px; text-align: left; vertical-align: top; color: #33475b;\">Restritiva a partir do PG15 (era liberal antes)<\/td>\n<\/tr>\n<tr>\n<td style=\"padding: 10px 14px; text-align: left; vertical-align: top; color: #33475b;\">Heran\u00e7a autom\u00e1tica em objetos futuros<\/td>\n<td style=\"padding: 10px 14px; text-align: left; vertical-align: top; color: #33475b;\">Sim, via papel de database (db_datareader etc.)<\/td>\n<td style=\"padding: 10px 14px; text-align: left; vertical-align: top; color: #33475b;\">N\u00e3o, exige <code style=\"background: #EEF2F8; padding: 2px 6px; border-radius: 4px; font-family: Consolas,Menlo,monospace; font-size: 14px; color: #0b2d5e;\">ALTER DEFAULT PRIVILEGES<\/code> expl\u00edcito<\/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;\">Achar que dar GRANT hoje protege as tabelas de amanh\u00e3.<\/strong> Sem uma regra de <code style=\"background: #EEF2F8; padding: 2px 6px; border-radius: 4px; font-family: Consolas,Menlo,monospace; font-size: 14px; color: #0b2d5e;\">ALTER DEFAULT PRIVILEGES<\/code>, cada tabela nova criada num schema nasce sem as permiss\u00f5es que voc\u00ea configurou para as tabelas antigas.<\/li>\n<li style=\"margin: 8px 0;\"><strong style=\"color: #0b2d5e;\">Rodar tudo como postgres, por h\u00e1bito de logar como sa.<\/strong> Sem checagem de permiss\u00e3o nenhuma no meio do caminho, um comando digitado errado alcan\u00e7a qualquer objeto do cluster.<\/li>\n<li style=\"margin: 8px 0;\"><strong style=\"color: #0b2d5e;\">Assumir que PUBLIC do Postgres \u00e9 um grupo control\u00e1vel como o public do SQL Server.<\/strong> Qualquer <code style=\"background: #EEF2F8; padding: 2px 6px; border-radius: 4px; font-family: Consolas,Menlo,monospace; font-size: 14px; color: #0b2d5e;\">GRANT ... TO PUBLIC<\/code> vale tamb\u00e9m para roles que ainda nem existem, o que \u00e9 f\u00e1cil de esquecer numa auditoria de seguran\u00e7a.<\/li>\n<li style=\"margin: 8px 0;\"><strong style=\"color: #0b2d5e;\">Herdar um cluster antigo, mesmo rodando Postgres 18, achando que j\u00e1 est\u00e1 com o padr\u00e3o seguro.<\/strong> Databases criados antes do PG15 mant\u00eam o <code style=\"background: #EEF2F8; padding: 2px 6px; border-radius: 4px; font-family: Consolas,Menlo,monospace; font-size: 14px; color: #0b2d5e;\">GRANT CREATE ON SCHEMA public TO PUBLIC<\/code> legado at\u00e9 algu\u00e9m revogar manualmente, mesmo depois de o cluster j\u00e1 ter sido atualizado para uma vers\u00e3o mais recente.<\/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, login e user s\u00e3o objetos distintos, ligados por mapeamento, e o superusu\u00e1rio <code style=\"background: #EEF2F8; padding: 2px 6px; border-radius: 4px; font-family: Consolas,Menlo,monospace; font-size: 14px; color: #0b2d5e;\">sa<\/code> \u00e9 um login com o papel <code style=\"background: #EEF2F8; padding: 2px 6px; border-radius: 4px; font-family: Consolas,Menlo,monospace; font-size: 14px; color: #0b2d5e;\">sysadmin<\/code>. No Postgres, os dois conceitos se fundem na role, um objeto \u00fanico que existe no cluster inteiro e que autentica e autoriza ao mesmo tempo; o superusu\u00e1rio <code style=\"background: #EEF2F8; padding: 2px 6px; border-radius: 4px; font-family: Consolas,Menlo,monospace; font-size: 14px; color: #0b2d5e;\">postgres<\/code> \u00e9 apenas uma role com o atributo <code style=\"background: #EEF2F8; padding: 2px 6px; border-radius: 4px; font-family: Consolas,Menlo,monospace; font-size: 14px; color: #0b2d5e;\">SUPERUSER<\/code>. Permiss\u00f5es default tamb\u00e9m mudam de filosofia: o SQL Server j\u00e1 nasce restritivo, enquanto o Postgres 18, como todo database criado a partir da vers\u00e3o 15, tamb\u00e9m nasce restritivo no schema <code style=\"background: #EEF2F8; padding: 2px 6px; border-radius: 4px; font-family: Consolas,Menlo,monospace; font-size: 14px; color: #0b2d5e;\">public<\/code> \u2014 vale conferir esse ponto em qualquer cluster mais antigo que j\u00e1 existia antes do upgrade, e lembrar que objetos futuros nunca herdam permiss\u00e3o sozinhos sem um <code style=\"background: #EEF2F8; padding: 2px 6px; border-radius: 4px; font-family: Consolas,Menlo,monospace; font-size: 14px; color: #0b2d5e;\">ALTER DEFAULT PRIVILEGES<\/code> configurado de antem\u00e3o.<\/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 separa login e user em duas camadas; o Postgres funde tudo em um \u00fanico conceito, a role \u2014 e essa fus\u00e3o muda a forma como voc\u00ea pensa superusu\u00e1rio, permiss\u00e3o padr\u00e3o e escopo de acesso. Francisco Porf\u00edrio e Renato Siqueira \u00b7 Time PostgreSQL da Power Tuning Nos dois primeiros posts desta s\u00e9rie, tratamos&hellip; <br \/> <a class=\"read-more\" href=\"https:\/\/powertuning.com.br\/blog\/de-sql-server-para-postgresql-03-login-user-role-quem-manda-em-que-e-por-que-nao-existe-um-sa-no-postgres\/\">Leia mais<\/a><\/p>\n","protected":false},"author":27,"featured_media":0,"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,63],"tags":[1499,1503,1506,1498,1504,1495,1492,1501,1502,125,1497,1505,1490,1500,1496,1491,1493,35,1489,1494],"class_list":["post-8766","post","type-post","status-publish","format-standard","hentry","category-banco-de-dados","category-postgresql","category-sql-server","tag-administracao-postgresql","tag-alter-default-privileges","tag-controle-de-acesso-postgresql","tag-dba-postgresql","tag-grant-postgresql","tag-login-sql-server","tag-permissoes-postgresql","tag-postgres-superuser","tag-postgres-vs-sa","tag-postgresql","tag-postgresql-para-dba","tag-postgresql-public","tag-postgresql-roles","tag-postgresql-superuser","tag-postgresql-vs-sql-server","tag-roles-no-postgresql","tag-seguranca-postgresql","tag-sql-server","tag-sql-server-para-postgresql","tag-usuarios-postgresql"],"jetpack_sharing_enabled":true,"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/powertuning.com.br\/blog\/wp-json\/wp\/v2\/posts\/8766","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=8766"}],"version-history":[{"count":1,"href":"https:\/\/powertuning.com.br\/blog\/wp-json\/wp\/v2\/posts\/8766\/revisions"}],"predecessor-version":[{"id":8770,"href":"https:\/\/powertuning.com.br\/blog\/wp-json\/wp\/v2\/posts\/8766\/revisions\/8770"}],"wp:attachment":[{"href":"https:\/\/powertuning.com.br\/blog\/wp-json\/wp\/v2\/media?parent=8766"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/powertuning.com.br\/blog\/wp-json\/wp\/v2\/categories?post=8766"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/powertuning.com.br\/blog\/wp-json\/wp\/v2\/tags?post=8766"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}