Partilhar via


CRIAR CREDENCIAL (Transact-SQL)

Aplica-se a:SQL ServerAzure SQL Managed Instance

Cria uma credencial no nível do servidor. Uma credencial é um registro que contém as informações de autenticação necessárias para se conectar a um recurso fora do SQL Server. A maioria das credenciais inclui um usuário e senha do Windows. Por exemplo, salvar um backup de banco de dados em algum local pode exigir que o SQL Server forneça credenciais especiais para acessar esse local. Para obter mais informações, consulte Credenciais (Mecanismo de Banco de Dados).

Observação

Para tornar a credencial no nível do banco de dados, use CREATE DATABASE SCOPED CREDENTIAL (Transact-SQL). Crie uma credencial de nível de servidor com CREATE CREDENTIAL quando precisar usar a mesma credencial para vários bancos de dados no servidor.

  • Crie uma credencial com escopo de banco de dados com CREATE DATABASE SCOPED CREDENTIAL para tornar o banco de dados mais portátil. Quando um banco de dados é movido para um novo servidor, a credencial de escopo do banco de dados será movida com ele.
  • Use credenciais com escopo de banco de dados no Banco de dados SQL.
  • Use credenciais de escopo de banco de dados com PolyBase e recursos virtualização de dados da Instância Gerenciada SQL do Azure.

Transact-SQL convenções de sintaxe

Sintaxe

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

Argumentos

credential_name

Especifica o nome da credencial que está sendo criada. credential_name não pode começar com o sinal de número (#). As credenciais do sistema começam com ##.

Importante

Ao usar uma assinatura de acesso compartilhado (SAS), esse nome deve corresponder ao caminho do contêiner, começar com https e não deve conter uma barra para frente. Ver exemplo D.

Quando usada para backup/restauração usando uma para plataformas de dados externas, como o Armazenamento de Blob do Azure ou plataformas compatíveis com o S3, a tabela a seguir fornece caminhos comuns:

Fonte de dados externa Caminho da localização Exemplo
Armazenamento de Blob do Azure (V2) https://<mystorageaccountname>.blob.core.windows.net/<mystorageaccountcontainername> Exemplo D.
Armazenamento de objetos compatível com S3 - Armazenamento compatível com S3: s3://<server_name>:<port>/
- AWS S3: s3://<bucket_name>.S3.<region>.amazonaws.com[:port]/<folder>
ou s3://s3.<region>.amazonaws.com[:port]/<bucket_name>/<folder>
Exemplo F.

IDENTIDADE ='identity_name'

Especifica o nome da conta a ser usada ao se conectar fora do servidor. Quando a credencial é usada para acessar o Cofre da Chave do Azure, a IDENTITY é o nome do cofre de chaves. Ver exemplo C abaixo. Quando a credencial está usando uma assinatura de acesso compartilhado (SAS), a IDENTIDADE é ASSINATURA DE ACESSO COMPARTILHADO. Ver exemplo D abaixo.

Importante

A Base de Dados SQL do Azure suporta apenas identidades do Cofre da Chave do Azure e da Assinatura de Acesso Partilhado. Não há suporte para identidades de usuário do Windows.

SECRET ='segredo'

Especifica o segredo necessário para a autenticação de saída.

Quando a credencial é usada para acessar o Cofre de Chaves do Azure, o argumento SECRET deve ser formatado como de ID de cliente de uma entidade de serviço (sem hífenes) e secreto, passados juntos sem um espaço entre eles. Ver exemplo C abaixo. Quando a credencial está usando uma assinatura de acesso compartilhado, o SECRET é o token de assinatura de acesso compartilhado. Ver exemplo D abaixo. Para obter informações sobre como criar uma política de acesso armazenado e uma assinatura de acesso compartilhado em um contêiner do Azure, consulte Lição 1: Criar uma política de acesso armazenado e uma assinatura de acesso compartilhado em um contêiner do Azure.

PARA PROVEDOR DE CRIPTOGRAFIA cryptographic_provider_name

Especifica o nome de um Enterprise Key Management Provider (EKM). Para obter mais informações sobre o Gerenciamento de Chaves, consulte Gerenciamento Extensível de Chaves (EKM).

Comentários

Quando IDENTITY é um usuário do Windows, o segredo pode ser a senha. O segredo é criptografado usando a chave mestra de serviço. Se a chave mestra de serviço for regenerada, o segredo será criptografado novamente usando a nova chave mestra de serviço.

Depois de criar uma credencial, você pode mapeá-la para um logon do SQL Server usando CREATE LOGIN ou ALTER LOGIN. Um logon do SQL Server pode ser mapeado para apenas uma credencial, mas uma única credencial pode ser mapeada para vários logons do SQL Server. Para obter mais informações, consulte Credenciais (Mecanismo de Banco de Dados). Uma credencial no nível do servidor só pode ser mapeada para um login, não para um usuário do banco de dados.

As informações sobre credenciais são visíveis no sys.credentials exibição de catálogo.

Se não houver nenhuma credencial mapeada de logon para o provedor, a credencial mapeada para a conta de serviço do SQL Server será usada.

Um login pode ter várias credenciais mapeadas para ele, desde que sejam usadas com provedores distintos. Deve haver apenas uma credencial mapeada por provedor por login. A mesma credencial pode ser mapeada para outros logins.

Permissões

Requer ALTERAR QUALQUER CREDENCIAL permissão.

Exemplos

Um. Criando uma credencial para a identidade do Windows

O exemplo a seguir cria a credencial chamada AlterEgo. A credencial contém o Mary5 de usuário do Windows e uma senha.

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

B. Criando uma credencial para EKM

O exemplo a seguir usa uma conta criada anteriormente chamada User1OnEKM em um módulo EKM por meio das ferramentas de gerenciamento do EKM, com um tipo de conta básica e senha. A conta sysadmin no servidor cria uma credencial que é usada para se conectar à conta EKM e a atribui à conta do User1 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. Criando uma credencial para EKM usando o Cofre da Chave do Azure

O exemplo a seguir cria uma credencial do SQL Server para o Mecanismo de Banco de Dados usar ao acessar o Cofre da Chave do Azure usando o SQL Server Connector for Microsoft Azure Key Vault. Para obter um exemplo completo de como usar o SQL Server Connector, consulte Extensible Key Management Using Azure Key Vault (SQL Server).

Importante

O argumento IDENTITY de CREATE CREDENTIAL requer o nome do cofre de chaves. O argumento SECRET de CREATE CREDENTIAL requer que o <ID do Cliente> (sem hífenes) e <> Secret sejam passados juntos sem um espaço entre eles.

No exemplo a seguir, o de ID do Cliente () é removido do hífenes e inserido como a cadeia de caracteres e o Secreto é representado pela cadeia de caracteres .

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

O exemplo a seguir cria a mesma credencial usando variáveis para o de ID do Cliente do e cadeias de caracteres de Secret, que são concatenadas para formar o argumento SECRET. A função REPLACE é usada para remover o hífenes da ID do cliente.

DECLARE @AuthClientId uniqueidentifier = '11111111-AAAA-BBBB-2222-CCCCCCCCCCCC';
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. Criando uma credencial usando um token SAS

Aplica-se a: SQL Server 2014 (12.x) até versão atual e Instância Gerenciada SQL do Azure.

O exemplo a seguir cria uma credencial de assinatura de acesso compartilhado usando um token SAS. Para obter um tutorial sobre como criar uma política de acesso armazenado e uma assinatura de acesso compartilhado em um contêiner do Azure e, em seguida, criar uma credencial usando a assinatura de acesso compartilhado, consulte Tutorial: Usar o Armazenamento de Blobs do Microsoft Azure com bancos de dados do SQL Server.

Importante

O argumento CREDENTIAL NAME requer que o nome corresponda ao caminho do contêiner, comece com https e não contenha uma barra à direita. O argumento IDENTITY requer o nome, ASSINATURA DE ACESSO COMPARTILHADO. O argumento SECRET requer o token de assinatura de acesso compartilhado.

O segredo ASSINATURA DE ACESSO COMPARTILHADO não deve ter o principal?.

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. Criando uma credencial para Identidade Gerenciada

O exemplo a seguir cria a credencial que representa a Identidade Gerenciada do serviço SQL do Azure ou do Azure Synapse. Senha e segredo não são aplicáveis neste caso.

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

F. Criar uma credencial para backup/restauração para armazenamento compatível com S3

Aplica-se a: SQL Server 2022 (16.x) e versões posteriores

O padrão aberto compatível com o S3 fornece caminhos de armazenamento e detalhes que podem diferir com base na plataforma de armazenamento. Para obter mais informações, consulte backup do SQL Server para URL para armazenamento de objetos compatíveis com o S3.

Para a maioria dos armazenamentos compatíveis com o S3, este exemplo cria uma credencial no nível do servidor e executa uma 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;

No entanto, o AWS S3 oferece suporte a dois padrões diferentes de URL.

  • S3://<BUCKET_NAME>.S3.<REGION>.AMAZONAWS.COM/<FOLDER> (padrão)
  • S3://S3.<REGION>.AMAZONAWS.COM/<BUCKET_NAME>/<FOLDER>

Há várias abordagens para criar com êxito uma credencial para o AWS S3:

  • Forneça o nome do bucket, o caminho e a região no nome da 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
    

    Ou,

    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
    
  • Ou forneça o nome do bucket e o caminho no nome da credencial, mas parametrize a região dentro de cada comando BACKUP/RESTORE. Use a cadeia de caracteres de região específica do S3 no BACKUP_OPTIONS e RESTORE_OPTIONS, por exemplo, '{"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