Privilégios de controle de acesso granular

Nesta página, descrevemos os privilégios que podem ser concedidos a um papel de banco de dados para com controle de acesso refinado.

Para saber mais sobre papéis de banco de dados e controle de acesso detalhado, consulte Sobre o controle de acesso detalhado.

A tabela a seguir mostra os privilégios de controle de acesso refinado e os objetos de banco de dados em que eles podem ser concedidos.

SELECT INSERT ATUALIZAR EXCLUIR EXECUTE USO
Esquema
Tabela
Coluna
Ver
Fluxo de alterações
Função de leitura do fluxo de alterações
Sequência
Modelo

As seções a seguir fornecem detalhes sobre cada privilégio.

SELECT

Permite que o papel leia ou consulte uma tabela, visualização, fluxo de alterações, sequência ou modelo.

  • Se uma lista de colunas for especificada para uma tabela, o privilégio será válido apenas para essas colunas. Se nenhuma lista de colunas for especificada, o privilégio será válido em todas as colunas da tabela, incluindo as colunas adicionadas posteriormente. Uma lista de colunas não é permitido para uma visualização.

  • O Spanner dá suporte às visualizações de direitos do invocador e aos visualizações de direitos autorais. Para mais informações, consulte Sobre as visualizações.

    Se você criar uma visualização com os direitos do invocador, para consultá-la, o banco de dados função ou usuário precisa do privilégio SELECT na visualização e também a SELECT privilégio nos objetos subjacentes mencionados na visualização. Por exemplo: suponha que a visualização SingerNames seja criada na tabela Singers.

    CREATE VIEW SingerNames SQL SECURITY INVOKER AS
      SELECT Singers.SingerId, Singers.FirstName, Singers.LastName FROM Singers;
    

    Suponha que o papel do banco de dados myRole execute a consulta SELECT * FROM SingerNames. O papel precisa ter o privilégio SELECT na visualização e precisa ter o privilégio SELECT nas três colunas referenciadas ou toda a tabela Singers.

    Se você criar uma visualização com direitos de definição, para consultar a visualização, o usuário ou a função do banco de dados só precisa do privilégio SELECT na visualização. Por exemplo: suponha que a visualização AlbumsBudget seja criada na tabela Albums.

    CREATE VIEW AlbumsBudget SQL SECURITY DEFINER AS
      SELECT Albums.Id, Albums.AlbumTitle, MarketingBudget FROM Albums;
    

    Suponha que o papel do banco de dados Analyst execute a consulta SELECT * FROM AlbumsBudget. O papel só precisa do privilégio SELECT na visualização. Ele não precisa do privilégio SELECT nas três colunas referenciadas ou na tabela Albums.

  • Depois de conceder SELECT em um subconjunto de colunas de uma tabela, o usuário do FGAC pode: não vai mais usar SELECT * nessa tabela. As consultas nessa tabela devem nomear todas colunas sejam incluídas.

  • O SELECT concedido em uma coluna gerada não concede SELECT nas colunas de base subjacentes.

  • Para tabelas intercaladas, SELECT concedido na tabela pai não serão propagadas para a tabela filha.

  • Ao conceder SELECT em um fluxo de alterações, você também precisa conceder EXECUTE na função com valor de tabela para o fluxo de alterações. Para mais informações, consulte EXECUTE.

  • Quando SELECT é usado com uma função agregada em colunas específicas, por exemplo, SUM(col_a), o papel precisa ter o privilégio SELECT nessas colunas. Se a função agregada não especificar nenhuma coluna, como COUNT(*), o papel precisa ter o privilégio SELECT em pelo menos uma coluna da tabela.

  • Ao usar SELECT com uma sequência, você só pode conferir aquelas que têm privilégios para visualizar.

Exemplos

GoogleSQL

GRANT SELECT ON TABLE employees TO ROLE hr_director;

GRANT SELECT ON TABLE customers, orders, items TO ROLE account_mgr;

GRANT SELECT(name, level, cost_center, location, manager) ON TABLE employees TO ROLE hr_manager;

GRANT SELECT(name, address, phone) ON TABLE employees, contractors TO ROLE hr_rep;

GRANT SELECT ON VIEW orders_view TO ROLE hr_manager;

GRANT SELECT ON CHANGE STREAM ordersChangeStream TO ROLE hr_analyst;

GRANT SELECT ON SEQUENCE sequence_name TO ROLE role_name;

PostgreSQL

GRANT SELECT ON TABLE employees TO hr_director;

GRANT SELECT ON TABLE customers, orders, items TO account_mgr;

GRANT SELECT(name, level, cost_center, location, manager) ON TABLE employees TO hr_manager;

GRANT SELECT(name, address, phone) ON TABLE employees, contractors TO hr_rep;

GRANT SELECT ON TABLE orders_view TO hr_manager; // orders_view is an invoker rights view

GRANT SELECT ON CHANGE STREAM orders_change_stream TO hr_analyst;

GRANT SELECT ON SEQUENCE sequence_name TO hr_package;

INSERT

Permite que a função insira linhas nas tabelas especificadas. Se uma lista de colunas for especificada, a permissão será válida apenas para essas colunas. Se nenhuma lista de colunas for especificada, o privilégio será válido em todas colunas na tabela.

  • Se os nomes das colunas forem especificados, qualquer coluna não incluída recebe o valor padrão na inserção.

  • INSERT não pode ser concedido em colunas geradas.

Exemplos

GoogleSQL

GRANT INSERT ON TABLE employees, contractors TO ROLE hr_manager;

GRANT INSERT(name, address, phone) ON TABLE employees TO ROLE hr_rep;

PostgreSQL

GRANT INSERT ON TABLE employees, contractors TO hr_manager;

GRANT INSERT(name, address, phone) ON TABLE employees TO hr_rep;

UPDATE

Permite que o papel atualize linhas nas tabelas especificadas. As atualizações podem ser restritas a um subconjunto de colunas da tabela. Quando você usa isso com sequências, permite que o papel chame a função get-next-sequence-value na sequência.

Além do privilégio UPDATE, o papel precisa do privilégio SELECT em todas as colunas consultadas. As colunas consultadas incluem as colunas na cláusula WHERE.

Não é possível conceder UPDATE em colunas geradas.

Exemplos

GoogleSQL

GRANT UPDATE ON TABLE employees, contractors TO ROLE hr_manager;

GRANT UPDATE(name, address, phone) ON TABLE employees TO ROLE hr_rep;

PostgreSQL

GRANT UPDATE ON TABLE employees, contractors TO hr_manager;

GRANT UPDATE(name, address, phone) ON TABLE employees TO hr_rep;

DELETE

Permite que o papel exclua linhas das tabelas especificadas.

  • Não é possível conceder DELETE no nível da coluna.

  • O papel também precisa de SELECT em todas as colunas que podem ser incluídas nas cláusulas WHERE da consulta.

  • Para tabelas intercaladas em bancos de dados de dialeto GoogleSQL, a O privilégio DELETE é necessário apenas na tabela pai. Se uma tabela filha especificar ON DELETE CASCADE, as linhas da tabela filho serão excluídas mesmo sem o privilégio DELETE na tabela filha.

Exemplo

GoogleSQL

GRANT DELETE ON TABLE employees, contractors TO ROLE hr_admin;

PostgreSQL

GRANT DELETE ON TABLE employees, contractors TO hr_admin;

EXECUTE

Ao conceder SELECT em um fluxo de alterações, você também precisa conceder EXECUTE na função de leitura do fluxo de alterações. Para mais informações, consulte Funções de leitura de fluxo de mudança e sintaxe de consulta.

Quando você usa isso com modelos, permite que o papel use o modelo em funções de machine learning.

Exemplo

O exemplo a seguir mostra como conceder EXECUTE na função de leitura para o fluxo de mudanças chamado my_change_stream.

GoogleSQL

GRANT EXECUTE ON TABLE FUNCTION READ_my_change_stream TO ROLE hr_analyst;

PostgreSQL

GRANT EXECUTE ON FUNCTION spanner.read_json_my_change_stream TO hr_analyst;

USO

Quando você concede USAGE a um esquema nomeado, ele fornece privilégios para acessar objetos contidos no esquema nomeado. O privilégio USAGE é concedido, por padrão, ao esquema padrão.

A seguir

Veja mais informações em: