Privilegios de control de acceso detallado

En esta página, se describen los privilegios que puedes otorgar a un rol de base de datos para un control de acceso detallado. Esta información se aplica a las bases de datos con dialecto de GoogleSQL y a las bases de datos con dialecto de PostgreSQL.

Para obtener información sobre los roles de la base de datos y el control de acceso detallado, consulta la descripción general del control de acceso detallado.

En la siguiente tabla, se muestran los privilegios de control de acceso detallado y los objetos de la base de datos en los que se pueden otorgar.

SELECT INSERT UPDATE BORRAR EJECUTAR USO
Esquema
Tabla
Columna
Ver
Flujo de cambios
Función de lectura del flujo de cambios
Secuencia
Modelo

En las siguientes secciones, se proporcionan detalles sobre cada privilegio.

SELECT

Permite que el rol lea o consulte una tabla, una vista, un flujo de cambios, una secuencia o un modelo.

  • Si se especifica una lista de columnas para una tabla, el privilegio solo es válido en esas columnas. Si no se especifica una lista de columnas, el privilegio es válido en todas las columnas de la tabla, incluidas las que se agreguen posteriormente. No se permite una lista de columnas para una vista.

  • Spanner admite vistas de derechos del invocador y vistas de derechos del definidor. Para obtener más información, consulta Descripción general de las vistas.

    Si creas una vista con derechos del invocador, para consultar la vista, el rol o el usuario de la base de datos necesita el privilegio SELECT en la vista y también el privilegio SELECT en los objetos subyacentes a los que se hace referencia en la vista. Por ejemplo, supongamos que la vista SingerNames se crea en la tabla Singers.

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

    Supongamos que el rol de base de datos myRole realiza la consulta SELECT * FROM SingerNames. El rol debe tener el privilegio SELECT en la vista y el privilegio SELECT en las tres columnas a las que se hace referencia o en toda la tabla Singers.

    Si creas una vista con derechos del definidor, para consultar la vista, el rol o el usuario de la base de datos solo necesita el privilegio SELECT en la vista. Por ejemplo, supongamos que la vista AlbumsBudget se crea en la tabla Albums.

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

    Supongamos que el rol de base de datos Analyst realiza la consulta SELECT * FROM AlbumsBudget. El rol solo necesita el privilegio SELECT en la vista. No necesita el privilegio SELECT en las tres columnas a las que se hace referencia ni en la tabla Albums.

  • Después de otorgar SELECT en un subconjunto de columnas de una tabla, el usuario de FGAC ya no puede usar SELECT * en esa tabla. Las consultas en esa tabla deben nombrar todas las columnas que se incluirán.

  • El permiso SELECT otorgado en una columna generada no otorga el permiso SELECT en las columnas base subyacentes.

  • En el caso de las tablas intercaladas, el permiso SELECT otorgado en la tabla principal no se propaga a la tabla secundaria.

  • Cuando otorgas SELECT en una transmisión de cambios, también debes otorgar EXECUTE en la función con valores de tabla para la transmisión de cambios. Para obtener más información, consulta EXECUTE.

  • Cuando se usa SELECT con una función de agregación en columnas específicas, por ejemplo, SUM(col_a), el rol debe tener el privilegio SELECT en esas columnas. Si la función de agregación no especifica ninguna columna, por ejemplo, COUNT(*), el rol debe tener el privilegio SELECT en al menos una columna de la tabla.

  • Cuando usas SELECT con una secuencia, solo puedes ver las secuencias para las que tienes privilegios.

Ejemplos de uso 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 el rol inserte filas en las tablas especificadas. Si se especifica una lista de columnas, el permiso solo es válido en esas columnas. Si no se especifica una lista de columnas, el privilegio es válido para todas las columnas de la tabla.

  • Si se especifican nombres de columna, cualquier columna que no se incluya obtendrá su valor predeterminado al momento de la inserción.

  • No se puede otorgar INSERT en columnas generadas.

Ejemplos de uso 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 el rol actualice filas en las tablas especificadas. Las actualizaciones se pueden restringir a un subconjunto de columnas de la tabla. Cuando usas esta opción con secuencias, el rol puede llamar a la función get-next-sequence-value en la secuencia.

Además del privilegio UPDATE, el rol necesita el privilegio SELECT en todas las columnas consultadas. Las columnas consultadas incluyen las columnas de la cláusula WHERE.

No se puede otorgar UPDATE en columnas generadas.

Ejemplos de uso 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 el rol borre filas de las tablas especificadas.

  • DELETE no se puede otorgar a nivel de la columna.

  • El rol también necesita SELECT en cualquier columna que se pueda incluir en las cláusulas WHERE de la consulta.

  • En el caso de las tablas intercaladas en bases de datos con dialecto de GoogleSQL, el privilegio DELETE solo es obligatorio en la tabla principal. Si una tabla secundaria especifica ON DELETE CASCADE, las filas de la tabla secundaria se borran incluso sin el privilegio DELETE en la tabla secundaria.

Ejemplo de uso 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

Cuando otorgas SELECT en una transmisión de cambios, también debes otorgar EXECUTE en la función de lectura de la transmisión de cambios. Para obtener más información, consulta Funciones de lectura de transmisiones de cambios y sintaxis de consultas.

Cuando usas este rol con modelos, le permites usar el modelo en funciones de aprendizaje automático.

Ejemplo de uso de GRANT EXECUTE

En el siguiente ejemplo, se muestra cómo otorgar EXECUTE en la función de lectura para el flujo de cambios llamado 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

Cuando otorgas USAGE a un esquema con nombre, se proporcionan privilegios para acceder a los objetos contenidos en el esquema con nombre. De forma predeterminada, el privilegio USAGE se otorga al esquema predeterminado.

¿Qué sigue?