Usa vistas seguras con parámetros

En este documento, se describe cómo usar vistas seguras parametrizadas en Cloud SQL para MySQL, que te permiten limitar el acceso a los datos según parámetros con nombre específicos de la aplicación, como las credenciales de usuario de la aplicación. Las vistas seguras con parámetros mejoran la seguridad y el control de acceso, ya que extienden la funcionalidad de las vistas de MySQL. Estas vistas también mitigan los riesgos de ejecutar consultas no confiables desde las aplicaciones, ya que aplican automáticamente una serie de restricciones a cualquier consulta que se ejecute.

Para obtener más información, consulta Vistas seguras parametrizadas en Cloud SQL.

Antes de comenzar

En este documento, se supone que ya creaste una instancia de Cloud SQL para MySQL.

  1. Asegúrate de que tu instancia de Cloud SQL ejecute MySQL 8.0.43 o una versión posterior. Si tu instancia de MySQL 8.0 ejecuta una versión secundaria anterior, puedes realizar una actualización de versión secundaria.

  2. Habilita la marca de base de datos cloudsql_parameterized_secure_view para tu instancia.

    Este cambio de marca no requiere que se reinicie la base de datos. Para obtener más información, consulta Configura marcas de base de datos.

Crea una vista segura con parámetros

Para crear una vista segura con parámetros, ejecuta el comando DDL CREATE VIEW. Por ejemplo:

CREATE VIEW v_orders
AS SELECT * FROM orders
WHERE customer_id = @local_customer_id;

Usa la siguiente sintaxis:

-- Create a view with a parameter using the WHERE clause
CREATE VIEW VIEW_NAME AS
SELECT * FROM TABLE_NAME
WHERE CONDITION;
-- Create a view with a parameter using the HAVING clause
CREATE VIEW VIEW_NAME AS
SELECT * FROM TABLE_NAME
WHERE CONDITION_1      -- row level security
GROUP BY COLUMN_NAME
HAVING CONDITION_2;    -- grouping
-- Create a view with a parameter using the ON clause
CREATE VIEW VIEW_NAME AS
SELECT * FROM TABLE_NAME_1
JOIN TABLE_NAME_2
ON CONDITION_1       --  join criteria
WHERE CONDITION_2;   --  row level security

Reemplaza lo siguiente:

  • VIEW_NAME: El nombre de la vista segura con parámetros.
  • TABLE_NAME o TABLE_NAME_N: El nombre de la tabla o las tablas que se usarán en la vista parametrizada
  • COLUMN_NAME o COLUMN_NAME_N: Nombre de la columna o las columnas de la tabla que se usarán en la vista parametrizada
  • CONDITION o CONDITION_N: Es la sentencia o las sentencias condicionales que se evaluarán como parte de una cláusula WHERE, ON o HAVING. Puedes especificar la variable de sesión que se usa como parámetro cuando realices una consulta en la vista más adelante. Una condición se parece a lo siguiente:

    WHERE customer_id = @local_customer_id

    Las variables de sesión, @variable_name, solo se permiten dentro de las cláusulas WHERE, ON o HAVING de una instrucción CREATE VIEW.

Cómo consultar una vista segura con parámetros

Para consultar una vista segura parametrizada en Cloud SQL para MySQL, tienes dos opciones:

  • Asigna valores a las variables con la sugerencia SET_VIEW_VARS mientras consultas la vista segura parametrizada. Si no se configura alguna de las variables a las que hace referencia la vista o si aparecen variables no relacionadas en la sugerencia SET_VIEW_VARS, falla la consulta en la vista segura parametrizada.

  • Llama al procedimiento mysql.execute_parameterized_query para consultar la vista segura con parámetros. Si usas el procedimiento mysql.execute_parameterized_query, debes proporcionar dos argumentos. El primer argumento es una consulta en la vista segura parametrizada sin ninguna sugerencia sobre la variable de sesión. El segundo argumento proporciona todas las variables de sesión necesarias y los valores que deseas proporcionar.

Cómo usar valores de sugerencia

Para consultar la vista segura con parámetros usando la sugerencia SET_VIEW_VARS, haz lo siguiente:

-- Set the parameter and query
SELECT /*+ SET_VIEW_VARS(SESSION_VARIABLE = VALUE) */ *
FROM VIEW_NAME;

Reemplaza lo siguiente:

  • SESSION_VARIABLE: Es el parámetro con nombre de la vista segura parametrizada para el que puedes proporcionar diferentes valores. Defines el nombre de la variable de sesión cuando creas la vista con la notación @variable_name en la cláusula de condición de la vista.
  • VALUE: Es un valor para este parámetro con nombre.
  • VIEW_NAME: Nombre de la vista segura parametrizada

Por ejemplo:

SELECT /*+ SET_VIEW_VARS(local_customer_id = 12345) */ *
FROM v_orders;

Usa el procedimiento de consulta con parámetros

Para consultar la vista segura parametrizada con el procedimiento mysql.execute_parameterized_query, usa la siguiente sintaxis:

CALL mysql.execute_parameterized_query(
  'SELECT * FROM DATABASE_NAME.VIEW_NAME',
  'SESSION_VARIABLE=VALUE');

Reemplaza lo siguiente:

  • SESSION_VARIABLE: Es el parámetro con nombre de la vista segura parametrizada para el que puedes proporcionar diferentes valores. Defines el nombre de la variable de sesión cuando creas la vista con la notación @variable_name en la cláusula de condición de la vista.
  • VALUE: Es un valor para este parámetro con nombre.
  • DATABASE_NAME: Nombre de la base de datos de la vista
  • VIEW_NAME: Nombre de la vista segura parametrizada

Por ejemplo:

   CALL mysql.execute_parameterized_query(
    'SELECT * FROM db.v_orders',
    'local_customer_id = 5, earliest_year = 2021');

Restricciones en las consultas

A continuación, se indica el conjunto de operaciones restringidas para las consultas que ejecutas con las opciones que se describen en Cómo consultar una vista segura con parámetros:

  • La consulta solo puede ser una instrucción SELECT.
  • La consulta no puede incluir invocaciones a funciones definidas por el usuario ni a procedimientos almacenados.
  • La consulta no puede asignar variables.
  • Si usas el método CALL mysql.execute_parameterized_query, la consulta no puede ser varias instrucciones concatenadas en una sola. Por ejemplo, la instrucción de consulta SELECT * FROM a; DROP TABLE a; no es válida.

Visualiza vistas seguras parametrizadas en los registros

Cuando los usuarios de la base de datos de Cloud SQL para MySQL intentan crear una vista segura parametrizada, se registra un mensaje de nivel de información en el registro de errores de MySQL similar al siguiente:

 User variables permitted in %s.%s through Parameterized
 Secure View feature

Soluciona problemas relacionados con las vistas seguras con parámetros

Problema Soluciona problemas
La marca cloud_parameterized_secure_view no está configurada para la instancia. Si la marca cloudsql_parameterized_secure_view se establece en OFF, cualquier intento de consultar una vista segura parametrizada existente generará el siguiente error:

Cannot operate on a Parameterized Secure View without `cloudsql_parameterized_secure_view` being set. Please turn the flag on first before querying Parameterized Secure Views

Si intentas crear una vista segura con parámetros sin configurar la marca, recibirás el siguiente error:

View's SELECT contains a variable or parameter

Para verificar si las vistas seguras parametrizadas están habilitadas para una instancia de Cloud SQL, consulta la variable global:

SHOW VARIABLES LIKE 'cloudsql_parameterized_secure_view';
La consulta falla con el error View's SELECT contains a variable or parameter. No se permiten variables fuera de las cláusulas WHERE, HAVING o ON. Si usas una variable fuera de estas cláusulas, se producirá un error.
La consulta falla con el error User variable `%s` used in Parameterized Secure View %s must be set in the query before using SET_VIEW_VARS hint Configura la variable de sesión antes de ejecutar la consulta.
La consulta falla con un error de versión de MySQL Si intentas consultar una vista segura parametrizada existente desde una versión de MySQL anterior a la 8.0.43, es posible que veas el siguiente error:

Variable %s found in view %s. Please upgrade to 8.0.43 or above to use Parameterized Secure Views

¿Qué sigue?