CREATE CREDENTIAL (Transact-SQL)

Se aplica a:SQL ServerAzure SQL Managed Instance

Crea una credencial de nivel de servidor. Una credencial es un registro que contiene la información de autenticación necesaria para conectarse a un recurso fuera de SQL Server. La mayoría de las credenciales incluyen un usuario y una contraseña de Windows. Por ejemplo, guardar una copia de seguridad de base de datos en una ubicación cualquiera podría requerir que SQL Server proporcione credenciales especiales para tener acceso a esa ubicación. Para más información, vea Credenciales (motor de base de datos).

Nota

Para establecer la credencial a nivel de la base de datos, use CREATE DATABASE SCOPED CREDENTIAL (Transact-SQL). Cree una credencial de nivel de servidor con CREATE CREDENTIAL cuando necesite usar la misma credencial para varias bases de datos en el servidor.

  • Cree una credencial con ámbito de base de datos con CREATE DATABASE SCOPED CREDENTIAL para que la base de datos sea más portátil. Cuando una base de datos se mueve a un nuevo servidor, la credencial de ámbito de la base de datos se moverá con ella.
  • Use credenciales con ámbito de base de datos en SQL Database.
  • Use credenciales con ámbito de base de datos con PolyBase y Azure SQL Instancia administrada características de virtualización de datos.

Convenciones de sintaxis de Transact-SQL

Sintaxis

CREATE CREDENTIAL credential_name
WITH IDENTITY = 'identity_name'
    [ , SECRET = 'secret' ]
        [ FOR CRYPTOGRAPHIC PROVIDER cryptographic_provider_name ]

Nota:

Para ver la sintaxis de Transact-SQL para SQL Server 2014 (12.x) y versiones anteriores, consulte Versiones anteriores de la documentación.

Argumentos

credential_name

Especifica el nombre de la credencial que se va a crear. credential_name no puede comenzar por el signo de almohadilla (#). Las credenciales del sistema comienzan por ##.

Importante

Cuando se usa una Firma de acceso compartido (SAS), este nombre debe coincidir con la ruta de acceso de contenedor, comenzar por https y no contener una barra diagonal. Vea el ejemplo D.

Cuando se usa para la copia de seguridad o restauración mediante una a plataformas de datos externas, como Azure Blob Storage o plataformas compatibles con S3, en la tabla siguiente se proporcionan rutas de acceso comunes:

Origen de datos externo Ruta de acceso de ubicación Ejemplo
Azure Blob Storage (V2) https://<mystorageaccountname>.blob.core.windows.net/<mystorageaccountcontainername> Ejemplo D.
Almacenamiento de objetos compatible con S3 - Almacenamiento compatible con S3: s3://<server_name>:<port>/
- AWS S3: s3://<bucket_name>.S3.<region>.amazonaws.com[:port]/<folder>
o s3://s3.<region>.amazonaws.com[:port]/<bucket_name>/<folder>
Ejemplo F.

IDENTITY ='identity_name'

Especifica el nombre de la cuenta que se utilizará para conectarse fuera del servidor. Cuando la credencial se usa para tener acceso a Azure Key Vault, IDENTITY es el nombre del almacén de claves. Vea el ejemplo C más adelante. Cuando la credencial usa una Firma de acceso compartido (SAS), IDENTITY es SHARED ACCESS SIGNATURE. Vea el ejemplo D de abajo.

Importante

Azure SQL Database solo admite las identidades de Azure Key Vault y de Firma de acceso compartido. No se admiten las identidades de usuario de Windows.

SECRET ='secret'

Especifica el secreto necesario para la autenticación de salida.

Cuando se usa la credencial para acceder a Azure Key Vault, el argumento SECRET debe tener el formato de identificador> de cliente de <una entidad de servicio (sin guiones) y< secreto>, que se pasa sin un espacio entre ellos. Vea el ejemplo C más adelante. Cuando la credencial usa una Firma de acceso compartido (SAS), SECRET es el token de la Firma de acceso compartido. Vea el ejemplo D de abajo. Para información sobre cómo crear una directiva de acceso almacenada y una firma de acceso compartido en un contenedor de Azure, consulte Lección 1: Creación de una directiva de acceso almacenada y una firma de acceso compartido en un contenedor de Azure.

FOR CRYPTOGRAPHIC PROVIDER cryptographic_provider_name

Especifica el nombre de un Proveedor de administración de claves de la empresa (EKM). Para más información sobre la administración de claves, consulte Administración extensible de claves (EKM).

Observaciones

Si IDENTITY es un usuario de Windows, el secreto puede ser la contraseña. El secreto se cifra usando la clave maestra de servicio. Si se vuelve a generar la clave maestra de servicio, el secreto se vuelve a cifrar con la nueva clave maestra de servicio.

Una vez creada una credencial, puede asignarla a un inicio de sesión de SQL Server por medio de CREATE LOGIN o ALTER LOGIN. Un inicio de sesión de SQL Server solamente se puede asignar a una credencial, pero una credencial puede asignarse a varios inicios de sesión de SQL Server. Para más información, vea Credenciales (motor de base de datos). Una credencial de nivel de servidor solo se puede asignar a un inicio de sesión, no a un usuario de base de datos.

Encontrará más información sobre las credenciales en la vista de catálogo sys.credentials.

Si no hay ninguna credencial de inicio de sesión asignada para el proveedor, se usa la credencial asignada a la cuenta de servicio de SQL Server.

Un inicio de sesión puede tener asignadas varias credenciales, siempre y cuando se utilicen con proveedores distintos. Solo debe haber una credencial asignada por cada proveedor y por cada inicio de sesión. La misma credencial puede estar asignada a otros inicios de sesión.

Permisos

Requiere el permiso ALTER ANY CREDENTIAL.

Ejemplos

A. Crear una credencial de Identidad de Windows

En el ejemplo siguiente se crea la credencial denominada AlterEgo. La credencial contiene el usuario de Windows Mary5 y una contraseña.

CREATE CREDENTIAL AlterEgo WITH IDENTITY = 'Mary5',
    SECRET = '<EnterStrongPasswordHere>';
GO

B. Crear una credencial de EKM

En el ejemplo siguiente se utiliza una cuenta creada previamente denominada User1OnEKM en un módulo EKM a través de las herramientas de administración de EKM, con un tipo de cuenta y una contraseña básicos. La cuenta sysadmin del servidor crea una credencial que se usa para conectar la cuenta de EKM y la asigna a la cuenta User1 de SQL Server:

CREATE CREDENTIAL CredentialForEKM
    WITH IDENTITY='User1OnEKM', SECRET='<EnterStrongPasswordHere>'
    FOR CRYPTOGRAPHIC PROVIDER MyEKMProvider;
GO

/* Modify the login to assign the cryptographic provider credential */
ALTER LOGIN User1
ADD CREDENTIAL CredentialForEKM;

C. Crear una credencial de EKM con Azure Key Vault

En el siguiente ejemplo se crea una credencial de SQL Server para que el Motor de base de datos la use al tener acceso a Azure Key Vault con el Conector de SQL Server para Microsoft Azure Key Vault. Para ver un ejemplo completo sobre cómo usar el Conector de SQL Server, consulte Administración extensible de claves con Azure Key Vault (SQL Server).

Importante

El argumento IDENTITY de CREATE CREDENTIAL requiere el nombre del Almacén de claves. El argumento SECRET de CREATE CREDENTIAL requiere que los valores de <Client ID> (sin guiones) y <Secret> se pasen juntos, sin un espacio entre ellos.

En el ejemplo siguiente, el Id. de cliente (EF5C8E09-4D2A-4A76-9998-D93440D8115D) se deja sin guiones y se introduce como la cadena EF5C8E094D2A4A769998D93440D8115D . El secreto se representa con la cadena SECRET_DBEngine.

USE master;
CREATE CREDENTIAL Azure_EKM_TDE_cred
    WITH IDENTITY = 'ContosoKeyVault',
    SECRET = 'EF5C8E094D2A4A769998D93440D8115DSECRET_DBEngine'
    FOR CRYPTOGRAPHIC PROVIDER AzureKeyVault_EKM_Prov ;

En el siguiente ejemplo se crea la misma credencial usando variables para las cadenas Client ID y Secret, que luego se concatenan entre sí para formar el argumento SECRET. La función REPLACE se usa para quitar los guiones del identificador de cliente.

DECLARE @AuthClientId uniqueidentifier = 'EF5C8E09-4D2A-4A76-9998-D93440D8115D';
DECLARE @AuthClientSecret varchar(200) = 'SECRET_DBEngine';
DECLARE @pwd varchar(max) = REPLACE(CONVERT(varchar(36), @AuthClientId) , '-', '') + @AuthClientSecret;

EXEC ('CREATE CREDENTIAL Azure_EKM_TDE_cred
    WITH IDENTITY = ''ContosoKeyVault'', SECRET = ''' + @PWD + '''
    FOR CRYPTOGRAPHIC PROVIDER AzureKeyVault_EKM_Prov ;');

D. Creación de una credencial mediante un token de SAS

Se aplica a: SQL Server 2014 (12.x) hasta la versión actual y Azure SQL Managed Instance.

En el siguiente ejemplo se crea una credencial de firma de acceso compartido con un token de SAS. Para obtener un tutorial sobre cómo crear una directiva de acceso almacenada y una firma de acceso compartido en un contenedor de Azure y, luego, crear una credencial usando la firma de acceso compartido, vea Tutorial: Uso de Microsoft Azure Blob Storage con bases de datos de SQL Server.

Importante

El argumento CREDENCIAL NAME requiere que el nombre coincida con la ruta de acceso del contenedor, comience por https y no contenga una barra diagonal. El argumento IDENTITY requiere el nombre, SHARED ACCESS SIGNATURE. El argumento SECRET requiere el token de firma de acceso compartido.

El secreto SHARED ACCESS SIGNATURE no debe tener el signo ? inicial.

USE master
CREATE CREDENTIAL [https://<mystorageaccountname>.blob.core.windows.net/<mystorageaccountcontainername>] -- this name must match the container path, start with https and must not contain a trailing forward slash.
    WITH IDENTITY='SHARED ACCESS SIGNATURE' -- this is a mandatory string and do not change it.
    , SECRET = 'sharedaccesssignature' -- this is the shared access signature token
GO

E. Creación de una credencial para la identidad administrada

En el ejemplo siguiente se crea la credencial que representa la identidad administrada de Azure SQL o el servicio Azure Synapse. La contraseña y el secreto no se aplican en este caso.

CREATE CREDENTIAL ServiceIdentity WITH IDENTITY = 'Managed Identity';
GO

F. Creación de una credencial para la copia de seguridad o restauración en almacenamiento compatible con S3

Se aplica a: SQL Server 2022 (16.x) y versiones posteriores.

El estándar compatible con S3 abierto proporciona rutas de acceso de almacenamiento y detalles que pueden diferir en función de la plataforma de almacenamiento. Para obtener más información, consulte Copia de seguridad en URL de SQL Server para el almacenamiento de objetos compatible con S3.

Para la mayoría del almacenamiento compatible con S3, en este ejemplo se crea una credencial de nivel de servidor y se realiza una BACKUP TO URL.

USE [master];
CREATE CREDENTIAL [s3://<endpoint>:<port>/<bucket>]
WITH
        IDENTITY    = 'S3 Access Key',
        SECRET      = '<AccessKeyID>:<SecretKeyID>';
GO

BACKUP DATABASE [SQLTestDB]
TO      URL = 's3://<endpoint>:<port>/<bucket>/SQLTestDB.bak'
WITH    FORMAT /* overwrite any existing backup sets */
,       STATS = 10
,       COMPRESSION;

Sin embargo, AWS S3 admite dos estándares diferentes de dirección URL.

  • S3://<BUCKET_NAME>.S3.<REGION>.AMAZONAWS.COM/<FOLDER> (valor predeterminado)
  • S3://S3.<REGION>.AMAZONAWS.COM/<BUCKET_NAME>/<FOLDER>

Hay varios enfoques para crear correctamente una credencial para AWS S3:

  • Proporcione el nombre del cubo y la ruta de acceso y la región en el nombre de la credencial.

    -- S3 bucket name: datavirtualizationsample
    -- S3 bucket region: us-west-2
    -- S3 bucket folder: backup
    
    CREATE CREDENTIAL [s3://datavirtualizationsample.s3.us-west-2.amazonaws.com/backup]
    WITH    
            IDENTITY    = 'S3 Access Key'
    ,       SECRET      = 'accesskey:secretkey';
    GO
    
    BACKUP DATABASE [AdventureWorks2022]
    TO URL  = 's3://datavirtualizationsample.s3.us-west-2.amazonaws.com/backup/AdventureWorks2022.bak'
    WITH COMPRESSION, FORMAT, MAXTRANSFERSIZE = 20971520;
    GO
    

    O bien,

    CREATE CREDENTIAL [s3://s3.us-west-2.amazonaws.com/datavirtualizationsample/backup]
    WITH    
            IDENTITY    = 'S3 Access Key'
    ,       SECRET      = 'accesskey:secretkey';
    GO
    
    BACKUP DATABASE [AdventureWorks2022]
    TO URL  = 's3://s3.us-west-2.amazonaws.com/datavirtualizationsample/backup/AdventureWorks2022.bak'
    WITH COMPRESSION, FORMAT, MAXTRANSFERSIZE = 20971520;
    GO
    
  • O bien, proporcione el nombre del cubo y la ruta de acceso en el nombre de credencial, pero parametrice la región dentro de cada BACKUP/RESTORE comando. Use la cadena de región específica de S3 en BACKUP_OPTIONS y RESTORE_OPTIONS, por ejemplo, '{"s3": {"region":"us-west-2"}}'.

    -- S3 bucket name: datavirtualizationsample
    -- S3 bucket region: us-west-2
    -- S3 bucket folder: backup
    
    CREATE CREDENTIAL   [s3://datavirtualizationsample.s3.amazonaws.com/backup]
    WITH    
            IDENTITY    = 'S3 Access Key'
    ,       SECRET      = 'accesskey:secretkey';
    GO
    
    BACKUP DATABASE [AdventureWorks2022]
    TO URL  = 's3://datavirtualizationsample.s3.amazonaws.com/backup/AdventureWorks2022.bak'
    WITH
      BACKUP_OPTIONS = '{"s3": {"region":"us-west-2"}}' -- REGION AS PARAMETER)
    , COMPRESSION, FORMAT, MAXTRANSFERSIZE = 20971520;
    GO
    
    RESTORE DATABASE AdventureWorks2022_1 
    FROM URL = 's3://datavirtualizationsample.s3.amazonaws.com/backup/AdventureWorks2022.bak'
    WITH 
      MOVE 'AdventureWorks2022' 
      TO 'C:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\DATA\AdventureWorks2022_1.mdf'
    , MOVE 'AdventureWorks2022_log' 
      TO 'C:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\DATA\AdventureWorks2022_1.ldf'
    , STATS = 10, RECOVERY
    , REPLACE, RESTORE_OPTIONS = '{"s3": {"region":"us-west-2"}}'; -- REGION AS PARAMETER)
    GO