En esta página, se describen los privilegios que puedes otorgar a un rol de base de datos para el control de acceso detallado. Esta información se aplica a las bases de datos con dialecto de GoogleSQL y PostgreSQL.
Para obtener información sobre los roles de la base de datos y el control de acceso detallado, consulta 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 desde una tabla, vista, flujo de cambios, secuencia o 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 después. No se permite una lista de columnas para una vista.
Spanner admite vistas de privilegios del invocador y vistas de privilegios del definidor. Para obtener más información, consulta Descripción general de las vistas.
Si creas una vista con los derechos del invocador, para consultar la vista, el rol o el usuario de la base de datos necesita el privilegio
SELECTen la vista y también el privilegioSELECTen los objetos subyacentes a los que se hace referencia en la vista. Por ejemplo, supongamos que la vistaSingerNamesse crea en la tablaSingers.CREATE VIEW SingerNames SQL SECURITY INVOKER AS SELECT Singers.SingerId, Singers.FirstName, Singers.LastName FROM Singers;Supongamos que el rol de base de datos
myRoleejecuta la consultaSELECT * FROM SingerNames. El rol debe tener el privilegioSELECTen la vista y el privilegioSELECTen las tres columnas a las que se hace referencia o en toda la tablaSingers.Si creas una vista con derechos de definidor, para consultar la vista, el rol o el usuario de la base de datos solo necesita el privilegio
SELECTen la vista. Por ejemplo, supongamos que la vistaAlbumsBudgetse crea en la tablaAlbums.CREATE VIEW AlbumsBudget SQL SECURITY DEFINER AS SELECT Albums.Id, Albums.AlbumTitle, MarketingBudget FROM Albums;Supongamos que el rol de base de datos
Analystrealiza la consultaSELECT * FROM AlbumsBudget. El rol solo necesita el privilegioSELECTen la vista. No necesita el privilegioSELECTen las tres columnas a las que se hace referencia ni en la tablaAlbums.Después de otorgar
SELECTen un subconjunto de columnas para una tabla, el usuario con control de acceso detallado ya no puede usarSELECT *en esa tabla. Las consultas en esa tabla deben nombrar todas las columnas que se incluirán.El permiso
SELECTotorgado en una columna generada no otorga el permisoSELECTen las columnas base subyacentes.En el caso de las tablas intercaladas, el permiso
SELECTotorgado en la tabla superior no se propaga a la tabla secundaria.Cuando otorgas
SELECTen un flujo de cambios, también debes otorgarEXECUTEen la función con valor de tabla para el flujo de cambios. Para obtener más información, consulta EXECUTE.Cuando se usa
SELECTcon una función de agregación en columnas específicas, por ejemplo,SUM(col_a), el rol debe tener el privilegioSELECTen esas columnas. Si la función de agregación no especifica ninguna columna, por ejemplo,COUNT(*), el rol debe tener el privilegioSELECTen, al menos, una columna de la tabla.Cuando usas
SELECTcon una secuencia, solo puedes ver las secuencias que tienes privilegios para ver.
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 en todas las columnas de la tabla.
Si se especifican los nombres de las columnas, cualquier columna que no se incluya obtiene su valor predeterminado en el momento de la inserción.
No se puede otorgar
INSERTen las 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 esto con secuencias, permite que el rol llame 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 columnas en la cláusula WHERE.
No se puede otorgar UPDATE en las 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.
DELETEno se puede otorgar a nivel de columna.El rol también necesita
SELECTen cualquier columna que se pueda incluir en las cláusulasWHEREde la consulta.Para las tablas intercaladas en bases de datos de dialecto de GoogleSQL, el privilegio
DELETEsolo se requiere en la tabla superior. Si una tabla secundaria especificaON DELETE CASCADE, las filas de la tabla secundaria se borran incluso sin el privilegioDELETEen 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 un flujo de cambios, también debes otorgar EXECUTE en la
función de lectura para el flujo de cambios. Para obtener más información, consulta
Funciones de lectura de flujos de cambios y sintaxis de consultas.
Cuando usas este rol con modelos, le permite 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. El privilegio USAGE se otorga, de forma predeterminada, al esquema predeterminado.
¿Qué sigue?
- Configura el control de acceso detallado
- Descripción general del control de acceso detallado
- Sentencias GRANT y REVOKE (bases de datos de dialecto de GoogleSQL)
- Sentencias GRANT y REVOKE (bases de datos de dialecto PostgreSQL)