{"id":4383,"date":"2025-03-20T13:00:54","date_gmt":"2025-03-20T16:00:54","guid":{"rendered":"https:\/\/powertuning.com.br\/?p=4383"},"modified":"2025-02-19T14:27:42","modified_gmt":"2025-02-19T17:27:42","slug":"oracle-grant-voce-conhece-a-dba_tab_privs-e-dba_tables","status":"publish","type":"post","link":"https:\/\/powertuning.com.br\/blog\/oracle-grant-voce-conhece-a-dba_tab_privs-e-dba_tables\/","title":{"rendered":"[Oracle] GRANT &#8211; Voc\u00ea conhece a DBA_TAB_PRIVS e DBA_TABLES?"},"content":{"rendered":"<p>Fala, pessoal! Tudo certo? Hoje vamos falar um pouco sobre\u00a0<strong>GRANT<\/strong>. Recentemente, recebi a tarefa de conceder um\u00a0<strong>GRANT<\/strong>\u00a0a um usu\u00e1rio espec\u00edfico, com a condi\u00e7\u00e3o de que ele tivesse permiss\u00e3o apenas para\u00a0<strong>SELECT<\/strong>\u00a0em todas as tabelas do banco de dados. Vou compartilhar o passo a passo do que fiz, para ajudar quem estiver passando por algo parecido ou tiver alguma d\u00favida.<\/p>\n<p>A primeira coisa a se fazer \u00e9 entender claramente o pedido do cliente, que solicitou que o usu\u00e1rio tivesse\u00a0<strong>somente<\/strong>\u00a0o\u00a0<strong>GRANT<\/strong>\u00a0de\u00a0<strong>SELECT<\/strong>. Sendo assim, \u00e9 fundamental verificar quais permiss\u00f5es o usu\u00e1rio j\u00e1 possui e em quais objetos. Para isso, podemos consultar a tabela\u00a0<strong>DBA_TAB_PRIVS<\/strong>, que lista todas as concess\u00f5es de permiss\u00f5es nos objetos para o usu\u00e1rio em quest\u00e3o. Vamos executar uma consulta nessa tabela para identificar se existe algum\u00a0<strong>GRANT<\/strong>\u00a0de\u00a0<strong>INSERT<\/strong>,\u00a0<strong>UPDATE<\/strong>\u00a0ou\u00a0<strong>DELETE<\/strong>\u00a0para esse usu\u00e1rio.<\/p>\n<p>Aqui est\u00e1 a query:<\/p>\n<p>SELECT &#8216;REVOKE INSERT ON &#8216; || OWNER || &#8216;.&#8217; || TABLE_NAME || &#8216; FROM CONSULTA\/&#8217; AS COMANDO<br \/>\nFROM DBA_TAB_PRIVS<br \/>\nWHERE GRANTEE = &#8216;NOME_DO_USUARIO&#8217;<br \/>\nAND PRIVILEGE = &#8216;INSERT&#8217;;<\/p>\n<div>\n<p>Na query acima, se n\u00e3o houver nenhum privil\u00e9gio de\u00a0<strong>INSERT<\/strong>, ser\u00e1 exibida a mensagem &#8220;NO ROWS SELECTED&#8221;. Caso contr\u00e1rio, o comando de\u00a0<strong>REVOKE<\/strong>\u00a0aparecer\u00e1. A consulta j\u00e1 est\u00e1 pronta, ent\u00e3o, se houver algum privil\u00e9gio de\u00a0<strong>INSERT<\/strong>, basta copiar e colar o comando gerado para revogar a permiss\u00e3o. Se voc\u00ea quiser verificar os privil\u00e9gios de\u00a0<strong>UPDATE<\/strong>\u00a0ou\u00a0<strong>DELETE<\/strong>, \u00e9 s\u00f3 substituir &#8220;INSERT&#8221; pelo privil\u00e9gio desejado.<\/p>\n<p>Agora, precisamos conceder a permiss\u00e3o de\u00a0<strong>SELECT<\/strong>\u00a0para o usu\u00e1rio em todas as tabelas do banco de dados. No\u00a0<strong>ORACLE<\/strong>, as permiss\u00f5es s\u00e3o aplicadas a cada objeto de forma individual, ou seja, uma por uma. Para simplificar esse processo, criei um\u00a0<strong>SQL din\u00e2mico<\/strong>, que gera o\u00a0<strong>GRANT<\/strong>\u00a0para cada objeto no banco de dados (lembrando que voc\u00ea precisa ter privil\u00e9gios de\u00a0<strong>DBA<\/strong>\u00a0para executar esse comando).<\/p>\n<p>Vamos utilizar a tabela\u00a0<strong>DBA_TABLES<\/strong>, que cont\u00e9m informa\u00e7\u00f5es sobre todas as tabelas do banco, independentemente de quem \u00e9 o propriet\u00e1rio ou o usu\u00e1rio que est\u00e1 acessando os dados.<\/p>\n<\/div>\n<p>&#8212; query na dba_tables<\/p>\n<p>SELECT &#8216;GRANT SELECT ON &#8216; || OWNER || &#8216;.&#8217; || TABLE_NAME || &#8216; TO NOME_DO_USUARIO;&#8217; AS COMANDO<br \/>\nFROM DBA_TABLES<br \/>\nWHERE OWNER NOT IN (&#8216;SYS&#8217;, &#8216;SYSTEM&#8217;);\u00a0 &#8212; Exclui schemas de sistema<\/p>\n<p>Agora \u00e9 s\u00f3 copiar e colar os comandos.<\/p>\n<p><strong>&#8212;\u00a0query para views\u00a0<\/strong><\/p>\n<p>SELECT &#8216;GRANT SELECT ON &#8216; || OWNER || &#8216;.&#8217; || VIEW_NAME || &#8216; TO NOME_DO_USUARIO;&#8217; AS<br \/>\nCOMANDO FROM DBA_VIEWS<br \/>\nWHERE OWNER NOT IN (&#8216;SYS&#8217;, &#8216;SYSTEM&#8217;);\u00a0 &#8212; Exclui schemas de sistema<\/p>\n<div><strong>&#8212; query para procedures<\/strong><\/p>\n<div>SELECT &#8216;GRANT EXECUTE ON &#8216; || OWNER || &#8216;.&#8217; || OBJECT_NAME || &#8216; TO NOME_DO_USUARIO;&#8217; AS COMANDO<\/div>\n<div>FROM DBA_OBJECTS<\/div>\n<div>WHERE OBJECT_TYPE = &#8216;PROCEDURE&#8217;<\/div>\n<div>\u00a0AND OWNER NOT IN (&#8216;SYS&#8217;, &#8216;SYSTEM&#8217;);\u00a0 &#8212; Exclui schemas de sistema<\/div>\n<\/div>\n<div><\/div>\n<div><strong>&#8212; query para functions<\/strong><\/div>\n<div><\/div>\n<div>\n<div>SELECT &#8216;GRANT EXECUTE ON &#8216; || OWNER || &#8216;.&#8217; || OBJECT_NAME || &#8216; TO CONSULTA;&#8217; AS COMANDO<\/div>\n<div>FROM DBA_OBJECTS<\/div>\n<div>WHERE OBJECT_TYPE = &#8216;FUNCTION&#8217;<\/div>\n<div>AND OWNER NOT IN (&#8216;SYS&#8217;, &#8216;SYSTEM&#8217;);\u00a0 &#8212; Exclui schemas de sistema<\/div>\n<\/div>\n<div><\/div>\n<p><strong>OBS:<\/strong>\u00a0Caso voc\u00ea queira salvar a sa\u00edda dos comandos em um arquivo\u00a0<strong>.txt<\/strong>\u00a0e depois rodar o script, basta usar o comando\u00a0<strong>spool<\/strong>\u00a0antes de executar a query.<\/p>\n<p>Exemplo:<\/p>\n<p>SQL&gt; spool saida_grant.txt<\/p>\n<p>SQL&gt; rode a query acima<\/p>\n<p>SQL&gt; spool off<\/p>\n<p>Agora, com o arquivo criado, voc\u00ea pode edit\u00e1-lo conforme necess\u00e1rio e, quando quiser executar, basta digitar:<\/p>\n<p>SQL&gt; @saida_grant.txt<\/p>\n<p>PRONTO!!<\/p>\n<p>Espero ter ajudado, at\u00e9 a pr\u00f3xima!!!!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Fala, pessoal! Tudo certo? Hoje vamos falar um pouco sobre\u00a0GRANT. Recentemente, recebi a tarefa de conceder um\u00a0GRANT\u00a0a um usu\u00e1rio espec\u00edfico, com a condi\u00e7\u00e3o de que ele tivesse permiss\u00e3o apenas para\u00a0SELECT\u00a0em todas as tabelas do banco de dados. Vou compartilhar o passo a passo do que fiz, para ajudar quem estiver passando por algo parecido ou&hellip; <br \/> <a class=\"read-more\" href=\"https:\/\/powertuning.com.br\/blog\/oracle-grant-voce-conhece-a-dba_tab_privs-e-dba_tables\/\">Leia mais<\/a><\/p>\n","protected":false},"author":23,"featured_media":4384,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"content-type":"","_exactmetrics_skip_tracking":false,"_exactmetrics_sitenote_active":false,"_exactmetrics_sitenote_note":"","_exactmetrics_sitenote_category":0,"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[176,70,63],"tags":[312,355,13,342,33,347,344,345,346,353,340,351,350,72,313,341,349,352,348,354,343,158],"class_list":["post-4383","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-banco-de-dados","category-oracle","category-sql-server","tag-administracao-de-banco-de-dados","tag-automacao-dba","tag-banco-de-dados","tag-controle-de-acesso","tag-dba","tag-dba_objects","tag-dba_tab_privs","tag-dba_tables","tag-dba_views","tag-funcoes-no-oracle","tag-grant","tag-grant-execute","tag-grant-select","tag-oracle","tag-oracle-database","tag-permissoes-no-oracle","tag-privilegios-de-usuario","tag-procedimentos-armazenados","tag-revoke","tag-scripts-sql","tag-seguranca-no-banco-de-dados","tag-sql"],"jetpack_featured_media_url":"https:\/\/powertuning.com.br\/blog\/wp-content\/uploads\/2025\/02\/POST-ORACLE-3.png","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/powertuning.com.br\/blog\/wp-json\/wp\/v2\/posts\/4383","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\/23"}],"replies":[{"embeddable":true,"href":"https:\/\/powertuning.com.br\/blog\/wp-json\/wp\/v2\/comments?post=4383"}],"version-history":[{"count":1,"href":"https:\/\/powertuning.com.br\/blog\/wp-json\/wp\/v2\/posts\/4383\/revisions"}],"predecessor-version":[{"id":4385,"href":"https:\/\/powertuning.com.br\/blog\/wp-json\/wp\/v2\/posts\/4383\/revisions\/4385"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/powertuning.com.br\/blog\/wp-json\/wp\/v2\/media\/4384"}],"wp:attachment":[{"href":"https:\/\/powertuning.com.br\/blog\/wp-json\/wp\/v2\/media?parent=4383"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/powertuning.com.br\/blog\/wp-json\/wp\/v2\/categories?post=4383"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/powertuning.com.br\/blog\/wp-json\/wp\/v2\/tags?post=4383"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}