Privilégios de controlo de acesso detalhados

Esta página descreve os privilégios que pode conceder a uma função da base de dados para um controlo de acesso detalhado. Estas informações aplicam-se a bases de dados com dialeto GoogleSQL e bases de dados com dialeto PostgreSQL.

Para saber mais sobre as funções da base de dados e o controlo de acesso detalhado, consulte o artigo Vista geral do controlo de acesso detalhado.

A tabela seguinte mostra os privilégios de controlo de acesso detalhado e os objetos da base de dados nos quais podem ser concedidos.

SELECIONAR INSERIR ATUALIZAR ELIMINAR EXECUTE UTILIZAÇÃO
Esquema
Tabela
Coluna
Ver
Alterar stream
Função de leitura da stream de alterações
Sequência
Modelo

As secções seguintes fornecem detalhes sobre cada privilégio.

SELECT

Permite que a função leia ou consulte a partir de uma tabela, uma vista, uma stream de alteração, uma sequência ou um modelo.

  • Se for especificada uma lista de colunas para uma tabela, o privilégio é válido apenas nessas colunas. Se não for especificada nenhuma lista de colunas, o privilégio é válido em todas as colunas da tabela, incluindo as colunas adicionadas posteriormente. Não é permitida uma lista de colunas para uma vista.

  • O Spanner suporta vistas de direitos do invocador e vistas de direitos do definidor. Para mais informações, consulte o artigo Vista geral das visualizações.

    Se criar uma vista com direitos do invocador, para consultar a vista, a função ou o utilizador da base de dados precisa do privilégio SELECT na vista e também do privilégio SELECT nos objetos subjacentes referenciados na vista. Por exemplo, suponhamos que a vista SingerNames é criada na tabela Singers.

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

    Suponhamos que a função da base de dados myRole executa a consulta SELECT * FROM SingerNames. A função tem de ter o privilégio SELECT na vista e tem de ter o privilégio SELECT nas três colunas referenciadas ou na tabela Singers completa.

    Se criar uma vista com direitos do definidor, para consultar a vista, a função ou o utilizador da base de dados só precisa do privilégio SELECT na vista. Por exemplo, suponhamos que a vista AlbumsBudget é criada na tabela Albums.

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

    Suponhamos que a função da base de dados Analyst executa a consulta SELECT * FROM AlbumsBudget. A função só precisa do privilégio SELECT na vista. Não precisa do privilégio SELECT nas três colunas referenciadas nem na tabela Albums.

  • Depois de conceder SELECT num subconjunto de colunas para uma tabela, o utilizador do FGAC já não pode usar SELECT * nessa tabela. As consultas nessa tabela têm de especificar todas as colunas a incluir.

  • SELECT concedido numa coluna gerada não concede SELECT nas colunas base subjacentes.

  • Para tabelas intercaladas, a autorização SELECT concedida na tabela principal não é propagada para a tabela secundária.

  • Quando concede SELECT num fluxo de alterações, também tem de conceder EXECUTE na função de valor de tabela para o fluxo de alterações. Para mais informações, consulte o comando EXECUTE.

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

  • Quando usa SELECT com uma sequência, só pode ver as sequências para as quais tem privilégios de visualização.

Exemplos de utilização de GRANT SELECT

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 for especificada uma lista de colunas, a autorização é válida apenas nessas colunas. Se não for especificada nenhuma lista de colunas, o privilégio é válido em todas as colunas da tabela.

  • Se forem especificados nomes de colunas, qualquer coluna não incluída recebe o respetivo valor predefinido no momento da inserção.

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

Exemplos de utilização de GRANT INSERT

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 a função atualize linhas nas tabelas especificadas. As atualizações podem ser restringidas a um subconjunto de colunas da tabela. Quando usa esta opção com sequências, permite que a função chame a função get-next-sequence-value na sequência.

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

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

Exemplos de utilização de GRANT UPDATE

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 a função elimine linhas das tabelas especificadas.

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

  • A função também precisa de SELECT em quaisquer colunas que possam ser incluídas nas cláusulas WHERE da consulta.

  • Para tabelas intercaladas em bases de dados com dialeto GoogleSQL, o privilégio DELETE só é necessário na tabela principal. Se uma tabela secundária especificar ON DELETE CASCADE, as linhas da tabela secundária são eliminadas mesmo sem o privilégio DELETE na tabela secundária.

Exemplo de utilização de GRANT DELETE

GoogleSQL

GRANT DELETE ON TABLE employees, contractors TO ROLE hr_admin;

PostgreSQL

GRANT DELETE ON TABLE employees, contractors TO hr_admin;

EXECUTE

Quando concede SELECT num fluxo de alterações, também tem de conceder EXECUTE na função de leitura para o fluxo de alterações. Para mais informações, consulte o artigo Altere as funções de leitura de streams e a sintaxe de consulta.

Quando usa esta opção com modelos, permite que a função use o modelo em funções de aprendizagem automática.

Exemplo de utilização de GRANT EXECUTE

O exemplo seguinte mostra como conceder EXECUTE na função de leitura para o fluxo de alterações denominado 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;

UTILIZAÇÃO

Quando concede USAGE a um esquema com nome, concede privilégios de acesso a objetos contidos no esquema com nome. O privilégio USAGE é concedido, por predefinição, ao esquema predefinido.

O que se segue?