AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 172783
Accepted
santios
santios
Asked: 2017-05-05 18:41:00 +0800 CST2017-05-05 18:41:00 +0800 CST 2017-05-05 18:41:00 +0800 CST

Em que ordem o PostgreSQL verifica as permissões dos objetos?

  • 772

Dada uma função de banco de dados, user1, uma função something()definida como um procedimento armazenado e uma exibição criada como:

CREATE VIEW view1 AS select * from something()

E, dadas essas permissões:

REVOKE ALL ON FUNCTION something FROM user1
REVOKE SELECT ON view1 FROM user1

Quando executo SELECT * FROM view1, recebo um erro permission denied for function something().

Minha pergunta é, se eu revogar as permissões de seleção na exibição, por que a função é chamada? Esperava receber algo como:

permission denied for relation view1

Obrigada!

postgresql permissions
  • 1 1 respostas
  • 523 Views

1 respostas

  • Voted
  1. Best Answer
    Luciano Andress Martini
    2018-03-16T04:18:12+08:002018-03-16T04:18:12+08:00

    O problema nesse caso não é exatamente a ordem de permissão, mas a ordem de execução.

    Em resumo, para PostgreSQL:

    1- Views que estão acessando tabelas irão sobrescrever a permissão de tabelas

    2- Views acessando funções, será necessário avaliar todas as funções, antes de serem verificadas - então as funções devem ser executadas antes de acessar a view, mesmo que a view não possua permissões select...

    Como podemos provar isso?

    No postgresql, as views são capazes de lhe dar permissões para fazer um select em uma tabela, mesmo que o usuário não tenha essas permissões.

    Por exemplo:

    create view view2 as select * from table1;
    revoke all on table1 from user1;
    grant select on view2 to user1; 
    

    Faça login como usuário 1:

    select * from table1 (permission denied) 
    select * from view2 (sucess - the query executes)
    

    No caso, o usuário poderá selecionar view2 mesmo não tendo permissão para selecionar a tabela.

    Mas e se fizermos a mesma coisa com uma função ? O comportamento NÃO é o mesmo. Vamos criar uma função que espere 5 segundos antes de retornar 1 (para que possamos depurar se o postgresql estiver executando a função toda vez que chamamos a view)

    CREATE OR REPLACE FUNCTION something() RETURNS integer
    AS 'select 1 from pg_sleep(5);'
    LANGUAGE SQL
    IMMUTABLE
    RETURNS NULL ON NULL INPUT; --this function will delay 5 seconds
    
    create view view1 as select * from something();
    revoke all on function something() from user1;
    grant select on view1 to user1; 
    

    Faça login como usuário 1:

    select * from something(); (permission denied for something) 
    select * from view1 (permission denied for something )
    

    A permissão para fazer select na view não substitui a permissão da função, e pior ainda se revogarmos as permissões da view1, a mensagem ainda mostra que o postgresql parou nossa consulta por causa da função, não importa qual seja a permissão da view.. (isso é exatamente o que está acontecendo na pergunta)

    Mas a função está realmente sendo verificada primeiro? Se dermos as permissões 'all' para a função, mas revogarmos a permissão de visualização...

    grant all on function something to user1; 
    revoke all on view1 from user1; 
    select * from view1;
    Delayed 5 seconds... (the function executed!) 
    Permission denied for select on view1
    

    Como você vê, postgresql ESPERA 5 SEGUNDOS antes de dizer que não temos permissão para exibir a exibição , mostrando que a função "something()" é executada. Portanto, o retorno de dados da função deve existir antes da verificação da visualização.

    Então agora com esses testes, agora sabemos que o PostgreSQL precisava primeiro avaliar todas as funções antes de continuar nossa consulta, é como se a consulta ainda não existisse até que todas as funções envolvidas fossem totalmente concluídas, então a visão não pode ser resolvida para o postgresql saber se temos ou não permissão para selecioná-lo.

    Acho que isso responde sua pergunta nos termos de "ordem de permissão", mas por que o postgresql precisa avaliar todas as funções antes de continuar, isso é outra pergunta ...

    • 3

relate perguntas

  • Posso ativar o PITR depois que o banco de dados foi usado

  • Práticas recomendadas para executar a replicação atrasada do deslocamento de tempo

  • Os procedimentos armazenados impedem a injeção de SQL?

  • Sequências Biológicas do UniProt no PostgreSQL

  • Qual é a diferença entre a replicação do PostgreSQL 9.0 e o Slony-I?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve