Creación de una vista dinámica
En el catálogo de Unity, puede usar vistas dinámicas para configurar control de acceso pormenorizado, lo que incluye:
- Seguridad en el nivel de columnas o filas.
- Enmascaramiento de datos.
El catálogo de Unity presenta las funciones siguientes, que permiten limitar dinámicamente qué usuarios pueden acceder a una fila, columna o registro de una vista:
current_user()
: devuelve la dirección de correo electrónico del usuario actual.is_account_group_member()
: devuelveTRUE
si el usuario actual es miembro de un grupo de nivel de cuenta específico. Se recomienda su uso en vistas dinámicas con datos del catálogo de Unity.is_member()
: devuelveTRUE
si el usuario actual es miembro de un grupo de nivel de área de trabajo específico. Esta función se proporciona por compatibilidad con el repositorio metastore de Hive existente. Evite usarla con vistas de los datos del catálogo de Unity, ya que no evalúa la pertenencia a grupos de nivel de cuenta.
Azure Databricks recomienda no conceder a los usuarios la capacidad de leer las tablas y vistas a las que se hace referencia en la vista.
En los ejemplos siguientes se muestra cómo crear vistas dinámicas en el catálogo de Unity.
Antes de empezar
Para crear o leer vistas dinámicas, los requisitos son los mismos que los de las vistas estándar, excepto los requisitos de proceso. Debe usar uno de los siguientes recursos de proceso:
Un almacén de SQL.
Proceso con modo de acceso compartido.
Proceso con modo de acceso de usuario único en Databricks Runtime 15.4 LTS o superior.
No se pueden leer vistas dinámicas mediante el proceso de usuario único en Databricks Runtime 15.3 o inferior.
Para aprovechar el filtrado de datos proporcionado en Databricks Runtime 15.4 LTS y versiones posteriores, también debe comprobar que el área de trabajo está habilitada para el proceso sin servidor, porque la funcionalidad de filtrado de datos que admite vistas dinámicas se ejecuta en proceso sin servidor. Por lo tanto, es posible que se le cobre por los recursos de proceso sin servidor al usar un solo proceso de usuario para leer vistas dinámicas. Consulte Control de acceso específico sobre el proceso de un solo usuario.
Permisos de nivel de columna
Con una vista dinámica, puede limitar las columnas a las que puede acceder un usuario o grupo determinado. En el ejemplo siguiente, solo los miembros del grupo auditors
pueden acceder a las direcciones de correo electrónico de la tabla sales_raw
. Durante el análisis de consultas, Apache Spark reemplaza la instrucción CASE
por la cadena literal REDACTED
o el contenido real de la columna de dirección de correo electrónico. Otras columnas se devuelven con normalidad. Esta estrategia no tiene ningún efecto negativo en el rendimiento de las consultas.
-- Alias the field 'email' to itself (as 'email') to prevent the
-- permission logic from showing up directly in the column name results.
CREATE VIEW sales_redacted AS
SELECT
user_id,
CASE WHEN
is_account_group_member('auditors') THEN email
ELSE 'REDACTED'
END AS email,
country,
product,
total
FROM sales_raw
Permisos de nivel de fila
Con una vista dinámica, puede especificar permisos hasta el nivel de fila o campo. En el ejemplo siguiente, solo los miembros del grupo managers
pueden ver los importes de transacciones cuando superan 1 000 000 USD. Los resultados coincidentes se filtran para otros usuarios.
CREATE VIEW sales_redacted AS
SELECT
user_id,
country,
product,
total
FROM sales_raw
WHERE
CASE
WHEN is_account_group_member('managers') THEN TRUE
ELSE total <= 1000000
END;
Enmascaramiento de datos
Dado que las vistas del catálogo de Unity usan Spark SQL, puede implementar enmascaramiento de datos avanzado mediante expresiones SQL y expresiones regulares más complejas. En el ejemplo siguiente, todos los usuarios pueden analizar los dominios de correo electrónico, pero solo los miembros del grupo auditors
pueden ver la dirección de correo electrónico completa de un usuario.
-- The regexp_extract function takes an email address such as
-- user.x.lastname@example.com and extracts 'example', allowing
-- analysts to query the domain name.
CREATE VIEW sales_redacted AS
SELECT
user_id,
region,
CASE
WHEN is_account_group_member('auditors') THEN email
ELSE regexp_extract(email, '^.*@(.*)$', 1)
END
FROM sales_raw