En esta página, se describen los privilegios que puedes otorgar a una función de base de datos para un control de acceso detallado.
Para obtener más información sobre las funciones de bases de datos y el control de acceso detallado, consulta Acerca del control de acceso detallado.
En la siguiente tabla, se muestran los privilegios de control de acceso detallados y los objetos de base de datos en los que se pueden otorgar.
SELECT | INSERT | ACTUALIZAR | BORRAR | EJECUTAR | USO | |
---|---|---|---|---|---|---|
Esquema | ✓ | |||||
Tabla | ✓ | ✓ | ✓ | ✓ | ||
Columna | ✓ | ✓ | ✓ | ✓ | ||
View | ✓ | |||||
Flujo de cambios | ✓ | |||||
Función de lectura de flujos 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 agregan después. Una lista de columnas no se permite para una vista.
Spanner admite las vistas de derechos del invocador y las vistas de derechos del definidor. Para obtener más información, consulta Acerca de las vistas.
Si creas una vista con derechos de invocador, para consultarla, el usuario o la función de base de datos necesita el privilegio
SELECT
en la vista y también el privilegioSELECT
en los objetos subyacentes a los que se hace referencia en la vista. Por ejemplo, supongamos que se crea la vistaSingerNames
en la tablaSingers
.CREATE VIEW SingerNames SQL SECURITY INVOKER AS SELECT Singers.SingerId, Singers.FirstName, Singers.LastName FROM Singers;
Supongamos que la función de base de datos
myRole
realiza la consultaSELECT * FROM SingerNames
. La función debe tener el privilegioSELECT
en la vista y el privilegioSELECT
en las tres columnas a las que se hace referencia o en la tablaSingers
completa.Si creas una vista con los derechos del definidor, para consultarla, el usuario o la función de la base de datos solo necesita el privilegio
SELECT
en la vista. Por ejemplo, supongamos que se crea la vistaAlbumsBudget
en la tablaAlbums
.CREATE VIEW AlbumsBudget SQL SECURITY DEFINER AS SELECT Albums.Id, Albums.AlbumTitle, MarketingBudget FROM Albums;
Supongamos que la función de base de datos
Analyst
realiza la consultaSELECT * FROM AlbumsBudget
. La función solo necesita el privilegioSELECT
en la vista. No necesita el privilegioSELECT
en las tres columnas a las que se hace referencia ni en la tablaAlbums
.Después de otorgar
SELECT
en un subconjunto de columnas de una tabla, el usuario de FGAC ya no puede usarSELECT *
en esa tabla. Las consultas de esa tabla deben nombrar todas las columnas que se incluirán.SELECT
otorgado en una columna generada no otorgaSELECT
en las columnas base subyacentes.En el caso de las tablas intercaladas, el
SELECT
otorgado en la tabla superior no se propaga a la tabla secundaria.Cuando otorgas
SELECT
en un flujo de cambios, también debes otorgarEXECUTE
en la función con valor de tabla para el flujo de cambios. Para obtener más información, consulta EJECUTAR.Cuando se usa
SELECT
con una función de agregación en columnas específicas, por ejemplo,SUM(col_a)
, la función debe tener el privilegioSELECT
en esas columnas. Si la función de agregación no especifica ninguna columna, por ejemploCOUNT(*)
, la función debe tener el privilegioSELECT
en al menos una columna de la tabla.Cuando usas
SELECT
con una secuencia, solo puedes ver secuencias para las que tienes privilegios.
Ejemplos
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 para 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 nombres de columna, cualquier columna no incluida obtiene su valor predeterminado cuando se inserta.
No se puede otorgar
INSERT
en las columnas generadas.
Ejemplos
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 la función actualice filas en las tablas especificadas. Las actualizaciones pueden restringirse a un subconjunto de columnas de la tabla. Cuando usas esto con secuencias, permite que la función llame a la función get-next-sequence-value
en la secuencia.
Además del privilegio UPDATE
, la función necesita el privilegio SELECT
en todas las columnas de claves y en todas las columnas consultadas. Las columnas consultadas incluyen columnas en la cláusula WHERE
y las columnas que se usan para calcular los valores nuevos de las columnas actualizadas y las columnas generadas.
No se puede otorgar UPDATE
en las columnas generadas.
Ejemplos
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.
No se puede otorgar
DELETE
a nivel de la columna.La función también necesita
SELECT
en todas las columnas clave y en las columnas que podrían incluirse en las cláusulasWHERE
de la consulta.Para las tablas intercaladas en las bases de datos del dialecto de GoogleSQL, solo se requiere el privilegio
DELETE
en la tabla superior. Si una tabla secundaria especificaON DELETE CASCADE
, las filas de esta se borrarán incluso sin el privilegioDELETE
en ella.
Ejemplo
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 y sintaxis de consultas de los flujos de cambios.
Cuando usas esto con modelos, permite que el rol use el modelo en funciones de aprendizaje automático.
Ejemplo
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, proporciona privilegios para acceder a los objetos contenidos en ese esquema. De forma predeterminada, se otorga el privilegio USAGE
al esquema predeterminado.
¿Qué sigue?
Para obtener más información, consulta:
- Configura un control de acceso detallado
- Acerca del control de acceso detallado
- Instrucciones GRANT y REVOKE (bases de datos del dialecto GoogleSQL)
- Instrucciones GRANT y REVOKE (bases de datos del dialecto de PostgreSQL)