Descripción general de las vistas con parámetros

En Bigtable, puedes usar vistas con parámetros para filtrar de forma dinámica los rangos de datos de las vistas lógicas según el contexto de la aplicación. Este enfoque protege tus aplicaciones de la inyección de SQL y reduce la necesidad de tener varias vistas estáticas.

Para controlar la información sensible, las vistas con parámetros de Bigtable usan un contexto aislado que está separado del texto de la consulta en SQL. Debido a que la base de datos vincula estos valores en el servidor, los usuarios y los agentes de IA no pueden manipular los parámetros de consulta. La base de datos limita automáticamente el acceso a los datos a tu contexto específico, independientemente de cómo escribas la consulta.

Beneficios de las vistas con parámetros

Las vistas con parámetros son adecuadas para administrar el alcance de los datos a nivel de la base de datos, en particular en las aplicaciones que procesan consultas de formato libre traducidas del lenguaje natural. El alcance de los datos es el proceso de restringir los resultados de la consulta a un subconjunto específico de datos. Estas vistas ofrecen una forma flexible de implementar lo siguiente:

  • Propagación de identidad de nivel profundo: aplica permisos de datos detallados a nivel del usuario, lo que garantiza que los usuarios solo puedan acceder a su propio contexto de datos. Por ejemplo, una aplicación puede garantizar que los usuarios o los tenants recuperen filas que solo estén dentro de su límite designado.
  • Administración de usuarios simplificada: Usa una sola función de base de datos para todos los usuarios de la base de datos en lugar de una función separada para cada usuario.
  • Aislamiento de parámetros: Las vistas con parámetros mitigan los riesgos pasando valores como contexto aislado que permanece fuera del control del LLM o del usuario final. Debido a que estos valores se mantienen separados del texto de la consulta, un usuario o un agente de IA que genera la consulta no puede manipularlos.
  • Mitigación de la inyección de SQL: Cuando se compilan aplicaciones, sustituir parámetros en el cliente dentro del texto de la consulta puede provocar la manipulación de la consulta. Las vistas con parámetros mitigan este riesgo realizando la vinculación de parámetros en el servidor después de que se analiza la estructura de la consulta. Esto evita la inyección de SQL porque los valores controlados por el atacante no pueden cambiar la estructura de la consulta.

Por ejemplo, considera una aplicación de seguimiento de la salud que almacena registros médicos de pacientes, incluidos los niveles de colesterol. Si los pacientes consultan sus propios datos, un agente malicioso o con un comportamiento inadecuado podría generar o solicitar una consulta que intente recuperar los registros de otros pacientes. Con una vista con parámetros, la aplicación aplica el aislamiento del paciente a nivel de la base de datos. La vista se define con un parámetro de vista patient_id:

CREATE VIEW patient_health_pv AS
(SELECT * FROM patient_health_records WHERE patient_id = CAST(VIEW_PARAMETERS('patient_id') AS BYTES))

Cuando el cliente quiere consultar la lectura de cholesterol de un paciente:

SELECT readings['value'], readings['date']
FROM patient_health_pv
WHERE readings['test_name'] = 'cholesterol'

Debido a que se consulta la vista, Bigtable vincula y aplica automáticamente el valor patient_id del mapa de parámetros aislado. El LLM o el usuario final no pueden alterar ni descartar este filtro, lo que garantiza un alcance sólido a nivel del usuario y elimina los vectores de inyección de SQL.

Cómo funcionan las vistas con parámetros

Las vistas con parámetros usan un mecanismo llamado parámetros de vista para pasar de forma segura el contexto a nivel de la aplicación, como un ID de usuario, a la base de datos. Las vistas con parámetros logran esto pasando los valores de los parámetros de vista como un contexto aislado y separado con la solicitud de consulta. Bigtable puede acceder a este contexto durante la ejecución de la consulta, pero la consulta en sí no puede leer ni modificar el contexto.

La función VIEW_PARAMETERS() es la interfaz de SQL para acceder a estos parámetros dentro de una definición de vista. Por ejemplo, para filtrar datos según el ID del usuario que realiza la consulta, puedes incluir lo siguiente en la cláusula WHERE de tu vista:

CREATE VIEW purchase_history_pv AS
(SELECT * FROM purchases WHERE user_id = CAST(VIEW_PARAMETERS('user_id') AS BYTES))

También puedes usar VIEW_PARAMETERS() para parametrizar los calificadores de columna. Esto permite que la vista muestre campos específicos de forma dinámica según el contexto de la aplicación proporcionado.

CREATE VIEW specific_test_result_pv AS
SELECT
  tests[VIEW_PARAMETERS('test_name')] AS reading,
  _timestamp AS reading_time
FROM patients

Diferencia con los parámetros de consulta estándar

Los parámetros de vista funcionan de manera diferente en comparación con los parámetros de consulta estándar:

  • Sintaxis y contexto: Los parámetros de consulta estándar se definen con la @param sintaxis y no se pueden declarar dentro de una definición de vista, solo en una consulta. Se accede a los parámetros de vista con la función VIEW_PARAMETERS('key'), a la que se puede llamar en cualquier contexto de consulta o vista.
  • Comportamiento de cierre seguro: Si se consulta una definición de vista que contiene una referencia VIEW_PARAMETERS('key'), pero no se proporciona el valor correspondiente en el mapa de parámetros de vista de la solicitud, la consulta falla de inmediato con un error not found / missing parameter. Esto evita la exposición accidental de datos si la configuración se aplica de forma incorrecta.

Limitaciones

Las siguientes limitaciones se aplican a las vistas con parámetros:

  • Solo puedes crear vistas con parámetros a partir de vistas lógicas. Puedes crear una nueva vista lógica con parámetros con Google Cloud CLI. No modificas una vista lógica existente.
  • Los parámetros de vista solo admiten valores del tipo de cadena. Si un parámetro representa un tipo de datos diferente en la definición de SQL de tu vista, debes pasar el valor del parámetro como una cadena y convertirlo dentro de la definición de vista, por ejemplo, CAST(VIEW_PARAMETERS('parameter_name') AS INT64).

¿Qué sigue?