Ejecuta instrucciones de SQL con la API de Cloud SQL Data

En esta página, se describe cómo ejecutar instrucciones SQL en bases de datos en instancias de Cloud SQL con la API de datos. Con la API de datos, usas la API de Cloud SQL Admin y la CLI de gcloud para ejecutar instrucciones SQL en cualquier instancia en la que hayas habilitado el acceso a la API de datos.

Puedes usar la API de datos con instancias que usan direcciones IP públicas, acceso privado a servicios o Private Service Connect. La API de datos admite todos los tipos de instrucciones SQL, incluidos el lenguaje de manipulación de datos (DML), el lenguaje de definición de datos (DDL) y el lenguaje de consulta de datos (DQL). La API de datos es adecuada para ejecutar instrucciones administrativas pequeñas y rápidas, como crear roles o usuarios de bases de datos y realizar pequeñas actualizaciones de esquemas.

Antes de comenzar

Antes de que puedas ejecutar instrucciones SQL en una instancia, sigue estos pasos.

Configura el usuario de la base de datos

La API de datos debe autenticarse como un usuario de la base de datos para ejecutar instrucciones SQL.

Para autenticarte como un usuario integrado con contraseña, haz lo siguiente:

  1. Crea una cuenta de usuario con una contraseña no vacía. También puedes usar el usuario predeterminado sqlserver.
  2. Otorga a la cuenta los roles o privilegios necesarios para ejecutar instrucciones SQL. Si el usuario no es sqlserver, otórgale el rol db_owner.
  3. Usa Secret Manager para crear un secreto regional para almacenar la contraseña. Por motivos de seguridad, la API de datos solicita el nombre del recurso del secreto en lugar de la contraseña en la solicitud a la API. El secreto regional debe almacenarse en la misma región que tu Cloud SQL instance. No se admite un secreto creado con el extremo global de Secret Manager , incluso si se almacena en la misma región.
  4. Como práctica recomendada, define IAM condiciones para permitir que un usuario acceda a un secreto específico, pero no a otros secretos del proyecto.

Roles o permisos obligatorios

De forma predeterminada, las cuentas de servicio o usuario con uno de los siguientes roles tienen permiso para ejecutar instrucciones SQL en una instancia de Cloud SQL (cloudsql.instances.executesql):

  • Cloud SQL Admin (roles/cloudsql.admin)
  • Cloud SQL Instance User (roles/cloudsql.instanceUser)
  • Cloud SQL Studio User (roles/cloudsql.studioUser)

También puedes definir un rol personalizado de IAM para la cuenta de servicio o usuario que incluya el cloudsql.instances.executesql permiso. Este permiso es compatible con los roles personalizados de IAM.

Habilita o inhabilita la API de datos

Para usar la API de datos, debes habilitarla para cada instancia. Puedes inhabilitar la API de datos en cualquier momento.

Console

  1. En la Google Cloud consola de, ve a la página Instancias de Cloud SQL.

    Ir a Instancias de Cloud SQL

  2. Para abrir la página de Descripción general de una instancia, haz clic en su nombre.
  3. En el menú de navegación de SQL, selecciona Conexiones.
  4. Haz clic en la pestaña Herramientas de redes.
  5. Selecciona la casilla de verificación Permitir la API de datos.
  6. Haz clic en Guardar.

gcloud

Para habilitar el acceso a la API de datos en una instancia, usa el gcloud sql instances patch comando con la --data-api-access=ALLOW_DATA_API marca:

gcloud sql instances patch INSTANCE_NAME --data-api-access=ALLOW_DATA_API

Para inhabilitar el acceso a la API de datos, usa la marca --data-api-access=DISALLOW_DATA_API:

gcloud sql instances patch INSTANCE_NAME --data-api-access=DISALLOW_DATA_API

Reemplaza INSTANCE_NAME por el nombre de la instancia en la que se habilitará o inhabilitará la API de datos.

Ejecuta una instrucción de SQL

Puedes ejecutar instrucciones SQL en bases de datos en tu instancia de Cloud SQL con la CLI de gcloud o la API de REST.

Autenticación con contraseña

Puedes ejecutar instrucciones SQL con la autenticación de contraseña integrada cuando la contraseña se almacena como un secreto regional con Secret Manager en la misma región que la instancia de Cloud SQL.

gcloud

Para ejecutar una instrucción de SQL en una base de datos en una instancia con la gcloud CLI, usa el comando gcloud sql instances execute-sql.

gcloud sql instances execute-sql INSTANCE_NAME \
--database=DATABASE_NAME \
--sql=SQL_STATEMENT \
--user=USER \
--password-secret-version=PASSWORD_SECRET_VERSION \
--partial-result-mode=PARTIAL_RESULT_MODE

Realiza los siguientes reemplazos:

  • INSTANCE_NAME: El nombre de la instancia.
  • DATABASE_NAME: El nombre de la base de datos dentro de la instancia.
  • SQL_STATEMENT: La instrucción de SQL que se ejecutará. Si la instrucción contiene espacios o caracteres especiales de shell, debe estar entre comillas.
  • USER: El usuario de la base de datos para autenticar.
  • PASSWORD_SECRET_VERSION: El nombre del recurso del secreto de Secret Manager que contiene la contraseña del usuario de la base de datos. El secreto debe ser un secreto regional y almacenarse en la misma región que la instancia de Cloud SQL. El formato esperado del nombre del recurso es projects/{project}/locations/{location}/secrets/{secret}/versions/{secret_version}.
  • PARTIAL_RESULT_MODE: Es opcional. Controla cómo responder cuando el resultado está incompleto. Puede ser ALLOW_PARTIAL_RESULT, FAIL_PARTIAL_RESULT o PARTIAL_RESULT_MODE_UNSPECIFIED. Consulta Modifica el comportamiento de truncamiento.

Terraform

Puedes usar la API de datos en Terraform para aprovisionar recursos en la base de datos, como bases de datos, tablas, extensiones, usuarios y otorgamientos de privilegios, sin conectarte de forma manual a la instancia. Para ejecutar una secuencia de comandos SQL en Terraform, usa el google_sql_provision_script recurso de Terraform.

resource "google_sql_user" "built_in_user" {
  name     = "tf-user"
  host     = "%"  # Don't set this field for PostgreSQL and SQL Server.
  instance = google_sql_database_instance.instance.name
  password = "changeme"
  type     = "BUILT_IN"
}

# Create a regional secret. Global secrets are not supported even if
# located in one region only.
resource "google_secret_manager_regional_secret" "secret" {
  secret_id = "db-password"

  # Use the same region as the Cloud SQL instance.
  location = "us-central1"
}

resource "google_secret_manager_regional_secret_version" "secret_version" {
  secret = google_secret_manager_regional_secret.secret.id
  secret_data = "changeme"
}

resource "google_sql_provision_script" "script" {
  # You can inline the script or import from a file like script  = file("${path.module}/script.sql")
  # When modified, the whole script will be executed again. It's recommended to
  # make the script idempotent with patterns like create if not exists ... or
  # if not exists (select ...) then ... end if.
  script  = "CREATE TABLE IF NOT EXISTS table1 ( col VARCHAR(16) NOT NULL );"

  instance = google_sql_database_instance.instance.name
  database = google_sql_database.database.name
  description = "sql script to create tables"
  user = google_sql_user.built_in_user.name

  # The location should be the same as the Cloud SQL instance's location.
  password_secret_version = "projects/my-project/locations/us-central1/secrets/db-password/versions/latest"

  # The built-in database user and password secret version must be created
  # first. Cloud SQL will retrieve password from Secret Manager
  # and connect to this user account to execute your script.
  depends_on = [
    google_sql_user.built_in_user,
    google_secret_manager_regional_secret_version.secret_version
  ]
}

Aplica los cambios

Para aplicar tu configuración de Terraform en un Google Cloud proyecto, completa los pasos de las siguientes secciones.

Prepara Cloud Shell

  1. Inicia Cloud Shell.
  2. Establece el Google Cloud proyecto predeterminado en el que deseas aplicar tus configuraciones de Terraform.

    Solo necesitas ejecutar este comando una vez por proyecto y puedes ejecutarlo en cualquier directorio.

    export GOOGLE_CLOUD_PROJECT=PROJECT_ID

    Las variables de entorno se anulan si configuras valores explícitos en el archivo de configuración de Terraform.

Prepara el directorio

Cada archivo de configuración de Terraform debe tener su propio directorio (también llamado módulo raíz).

  1. En Cloud Shell, crea un directorio y un archivo nuevo dentro de ese directorio. El nombre del archivo debe tener la extensión .tf, por ejemplo, main.tf. En este instructivo, el archivo se denomina main.tf.
    mkdir DIRECTORY && cd DIRECTORY && touch main.tf
  2. Si sigues un instructivo, puedes copiar el código de muestra en cada sección o paso.

    Copia el código de muestra en el main.tf recién creado.

    De manera opcional, copia el código de GitHub. Esto se recomienda cuando el fragmento de Terraform es parte de una solución de extremo a extremo.

  3. Revisa y modifica los parámetros de muestra que se aplicarán a tu entorno.
  4. Guarda los cambios.
  5. Inicializa Terraform. Solo debes hacerlo una vez por directorio.
    terraform init

    De manera opcional, incluye la opción -upgrade para usar la última versión del proveedor de Google:

    terraform init -upgrade

Aplica los cambios

  1. Revisa la configuración y verifica que los recursos que creará o actualizará Terraform coincidan con tus expectativas:
    terraform plan

    Corrige la configuración según sea necesario.

  2. Para aplicar la configuración de Terraform, ejecuta el siguiente comando y, luego, escribe yes cuando se te solicite:
    terraform apply

    Espera hasta que Terraform muestre el mensaje “¡Aplicación completa!”.

  3. Abre tu Google Cloud proyecto para ver los resultados. En la Google Cloud consola de, navega a tus recursos en la IU para asegurarte de que Terraform los haya creado o actualizado.

Borra los cambios

Borrar un recurso google_sql_provision_script no borrará los recursos en la base de datos que creó. Para borrarlos, puedes agregar instrucciones de forma explícita en la secuencia de comandos, como drop ... if exists y, luego, aplicar los cambios.

REST

Para ejecutar una instrucción de SQL en una base de datos en una instancia con la API de REST, envía una solicitud POST al extremo executeSql:

POST https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID/instances/INSTANCE_NAME/executeSql

El cuerpo de la solicitud debe contener el nombre de la base de datos y la instrucción de SQL:

{
  "database": "DATABASE_NAME",
  "sqlStatement": "SQL_STATEMENT",
  "user": "USER",
  "passwordSecretVersion": "PASSWORD_SECRET_VERSION",
  "partialResultMode": "PARTIAL_RESULT_MODE"
}

Realiza los siguientes reemplazos:

  • PROJECT_ID: ID del proyecto
  • INSTANCE_NAME: El nombre de la instancia.
  • DATABASE_NAME: El nombre de la base de datos dentro de la instancia.
  • SQL_STATEMENT: La instrucción de SQL que se ejecutará.
  • USER: El usuario de la base de datos para autenticar.
  • PASSWORD_SECRET_VERSION: El nombre del recurso del secreto de Secret Manager que contiene la contraseña del usuario de la base de datos. El secreto debe ser un secreto regional y almacenarse en la misma región que la instancia de Cloud SQL. El formato esperado del nombre del recurso es projects/{project}/locations/{location}/secrets/{secret}/versions/{secret_version}.
  • PARTIAL_RESULT_MODE: Es opcional. Controla cómo responde la API cuando el resultado supera los 10 MB. Puede ser FAIL_PARTIAL_RESULT, ALLOW_PARTIAL_RESULT o PARTIAL_RESULT_MODE_UNSPECIFIED. Consulta Modifica el comportamiento de truncamiento.

Modifica el comportamiento de truncamiento

Puedes controlar cómo se manejan los resultados grandes cuando se ejecuta SQL. Para ello, incluye el "partialResultMode" campo en la solicitud. Este campo acepta los siguientes valores:

  • FAIL_PARTIAL_RESULT: Predeterminado. Muestra un error si el resultado supera los 10 MB o si solo se puede recuperar un resultado parcial. No muestra el resultado.
  • ALLOW_PARTIAL_RESULT: Muestra un resultado truncado y establece partial_result en verdadero si el resultado supera los 10 MB o si solo se puede recuperar un resultado parcial debido a un error. No muestra un error.
  • PARTIAL_RESULT_MODE_UNSPECIFIED: Modo no especificado, que es el mismo que FAIL_PARTIAL_RESULT.

Limitaciones

  • El límite de tamaño para una respuesta es de 10 MB. Los resultados que superen este tamaño se truncarán si partialResultMode se establece en ALLOW_PARTIAL_RESULT. De lo contrario, se mostrará un error.
  • Las solicitudes se limitan a 0.5 MB.
  • Solo puedes ejecutar instrucciones SQL para las instancias de Cloud SQL para SQL Server que se estén ejecutando.
  • Cloud SQL no admite el uso de la API de datos con instancias configuradas para la replicación de servidores externos.
  • Las solicitudes que tardan más de 30 segundos se cancelan. No se admite establecer un tiempo de espera de instrucción más alto con SET LOCK_TIMEOUT.
  • Cloud SQL limita la cantidad de solicitudes executeSql simultáneas por instancia para evitar la sobrecarga. Si se alcanza el límite, las solicitudes posteriores fallarán y mostrarán uno de los siguientes errores:

    • At most 'x' concurrent queries may be run on this instance. Try again later.
    • Maximum concurrent reads 'x' reached.

    El límite (x) es de 5 consultas para instancias con menos de 10 GB de memoria total y de 10 consultas para instancias con al menos 10 GB de memoria total.

  • Cada respuesta puede contener un máximo de 10 mensajes o advertencias de la base de datos.

  • Si hay un error de sintaxis o de ejecución de la instrucción, no se muestra ningún resultado.

  • La API de datos no puede autenticarse como usuarios integrados con contraseñas vacías.

  • La API de datos se puede bloquear de forma temporal por motivos de integridad de los datos cuando se realizan ciertas operaciones de mantenimiento en la instancia. Vuelve a intentarlo más tarde si sucede.

  • No se admite el comando GO. Este comando se usa en las utilidades de Microsoft SQL Server para indicar que un lote de declaraciones finalizó y se puede enviar a SQL Server.
  • Si una consulta incluye una columna binaria, la API de datos no puede mostrarla. Convierte los valores binarios en una cadena.

    Por ejemplo, reemplaza:

    SELECT my_binary_column from my_table2;
    

    con:

    SELECT CONVERT(NVARCHAR(4000), my_binary_column, 1) from my_table2;
    
  • Cuando se ejecutan varias consultas y una de ellas falla, se muestra el primer error encontrado. Es posible que algunas de las declaraciones del lote antes del error se hayan ejecutado de forma correcta. Puedes unir varias consultas en una declaración transaction para evitar este problema:

    BEGIN TRANSACTION
        YOUR_SQL_STATEMENTS
    COMMIT;
    

    Reemplaza lo siguiente:

    • YOUR_SQL_STATEMENTS: las declaraciones que deseas ejecutar como parte de esta consulta.
  • La secuencia de comandos SQL y su respuesta de ejecución pueden transitar por ubicaciones intermedias entre tu cliente y la ubicación de la instancia de destino. Por este motivo, las solicitudes fallarán con el error "no admitido para instancias en ciertas carpetas de paquetes de control de Assured Workloads" para ciertos proyectos de Assured Workloads y para proyectos con constraints/sql.restrictNoncompliantResourceCreation aplicados de forma manual.