CREATE CREDENTIAL (Transact-SQL)

适用于:SQL ServerAzure SQL 托管实例

创建服务器级别的凭据。 凭据是包含连接到 SQL Server 以外的资源时所需的身份验证信息的记录。 多数凭据包括一个 Windows 用户和一个密码。 例如,将数据库备份保存到某个位置可能需要 SQL Server 提供访问该位置的特殊凭据。 有关详细信息,请参阅凭据(数据库引擎)

注意

若要创建数据库级别的凭据,请参阅 CREATE DATABASE SCOPED CREDENTIAL (Transact-SQL)。 如果需要对服务器上的多个数据库使用相同的凭据,请创建服务器级凭据 CREATE CREDENTIAL

  • 创建数据库范围的凭据 CREATE DATABASE SCOPED CREDENTIAL ,使数据库更易于移植。 数据库移动到新服务器时,数据库范围的凭据将随之移动。
  • 使用 SQL 数据库上的数据库作用域凭据。
  • 将数据库范围的凭据与 PolyBase 配合使用,并Azure SQL 托管实例数据虚拟化功能。

Transact-SQL 语法约定

语法

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

参数

credential_name

指定要创建的凭据的名称。 credential_name 不能以数字 (#) 符号开头。 系统凭据以 ## 开头。

重要

使用共享访问签名 (SAS) 时,该名称必须与容器路径匹配,以 https 开头并且不能包含正斜杠。 请参见示例 D

使用外部数据平台(如 Azure Blob 存储或 S3 兼容平台)进行备份/还原时,下表提供了常见路径:

外部数据源 位置路径 示例
Azure Blob 存储 (V2) https://<mystorageaccountname>.blob.core.windows.net/<mystorageaccountcontainername> 示例 D
Azure Key Vault <keyvaultname>.vault.azure.net 示例 H
Azure Key Vault 托管硬件安全模块 (HSM) <akv-name>.managedhsm.azure.net 示例 H
S3 兼容的对象存储 - 与 S3 兼容的存储: s3://<server_name>:<port>/
- AWS S3: s3://<bucket_name>.S3.<region>.amazonaws.com[:port]/<folder>
s3://s3.<region>.amazonaws.com[:port]/<bucket_name>/<folder>
示例 F

IDENTITY = 'identity_name'

指定从服务器外部进行连接时要使用的帐户名称。 当凭据用于访问 Azure Key Vault 时,IDENTITY 是该密钥保管库的名称。 请参阅以下示例 C。 凭据使用共享访问签名 (SAS) 时,IDENTITY 是 SHARED ACCESS SIGNATURE。 请参见下面的示例 D。

重要

Azure SQL 数据库仅支持 Azure Key Vault 和共享访问签名标识。 不支持 Windows 用户标识。

SECRET = 'secret'

指定发送身份验证所需的机密内容。

当凭据用于访问 Azure 密钥库时,< 请参阅以下示例 C。 凭据使用共享访问签名时,SECRET 是共享访问签名令牌。 请参见下面的示例 D。 有关如何在 Azure 容器上创建存储访问策略和共享访问签名的信息,请参阅第 1 课:在 Azure 容器上创建存储访问策略和共享访问签名

FOR CRYPTOGRAPHIC PROVIDER cryptographic_provider_name

指定企业密钥管理提供程序 (EKM) 的名称。 有关密钥管理的详细信息,请参阅可扩展密钥管理 (EKM)

备注

当 IDENTITY 为 Windows 用户时,机密内容可以是密码。 机密内容使用服务主密钥进行加密。 如果重新生成服务主密钥,则使用新的服务主密钥重新加密机密内容。

创建凭据后,可以使用 CREATE LOGINALTER LOGIN 将该凭据映射到 SQL Server 登录名。 一个 SQL Server 登录只能映射到一个凭据,但是单个凭据可以映射到多个 SQL Server 登录名。 有关详细信息,请参阅凭据(数据库引擎)。 服务器级别凭据只能映射到登录名,不能映射到数据库用户。

可以在 sys.credentials 目录视图中查看有关凭据的信息。

如果该提供程序没有任何登录名映射的凭据,则使用映射到 SQL Server 服务帐户的凭据。

一个登录名可以有多个映射的凭据,只要它们用于不同的提供程序即可。 每个登录名的每个提供程序只能有一个映射的凭据。 相同的凭据可以映射到其他登录名。

权限

需要 ALTER ANY CREDENTIAL 权限。

示例

A. 创建用于 Windows 标识的凭据

以下示例创建名为 AlterEgo 的凭据。 凭据包含 Windows 用户 Mary5 和一个密码。

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

B. 创建用于 EKM 的凭据

下面的示例使用一个名为 User1OnEKM 的帐户,它是以前通过 EKM 的管理工具在 EKM 模块中创建的,并带有一个基本帐户类型和密码。 服务器上的 sysadmin 帐户创建用于连接到 EKM 帐户的凭据,并将其分配给 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. 使用 Azure 密钥保管库创建用于 EKM 的凭据

下面的示例使用了适用于 Microsoft Azure Key Vault 的 SQL Server 连接器,创建了供数据库引擎访问 Azure Key Vault 时使用的 SQL Server 凭据。 有关使用 SQL Server 连接器的完整示例,请参阅使用 Azure Key Vault 的可扩展密钥管理 (SQL Server)

重要

CREATE CREDENTIALIDENTITY 参数需要 key vault 名称。 CREATE CREDENTIAL 的 SECRET 参数要求将 客户端 ID(无连字符)和 <密钥> 一起传递,且二者之间不留空格。 EKM 支持托管标识,凭据可用于托管标识。 有关示例,请参阅 示例 H

在下面的示例中,客户端 ID00001111-aaaa-2222-bbbb-3333cccc4444) 被剥离为连字符,并作为字符串11111111222233334444555555555555输入,机密由字符串SECRET_DBEngine表示。

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

下面的示例使用客户端 ID 和 Secret 字符串的变量创建相同的凭据,然后将其连接在一起形成 SECRET 参数 。 REPLACE 函数用于从客户端 ID 中删除连字符。

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. 使用 SAS 令牌创建凭据

适用于:SQL Server 2014 (12.x) 至当前版本和 Azure SQL 托管实例。

下面的示例使用 SAS 令牌创建共享访问签名凭据。 若要详细了解如何在 Azure 容器上创建存储访问策略和共享访问签名,以及创建使用共享访问签名的凭据,请参阅教程:将 Microsoft Azure Blob 存储与 SQL Server 数据库结合使用

重要

CREDENTIAL NAME 参数需要名称与容器路径匹配,以 https 开头并且末尾不包含正斜杠。 IDENTITY 参数需要名称 SHARED ACCESS SIGNATURE。 SECRET 参数需要共享访问签名令牌。

共享访问签名密钥不应具有前导值?。

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. 为托管标识创建凭据

以下示例创建表示 Azure SQL 或 Azure Synapse 服务的托管标识的凭据。 在这种情况下,密码和机密不适用。

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

有关在 Azure VM 上使用 SQL Server 托管标识创建凭据的示例,请参阅 示例 G示例 H。Linux 不支持服务器级托管标识。

F. 创建用于备份/还原到 S3 兼容存储的凭据

适用于:SQL Server 2022 (16.x) 及更高版本

开放式 S3 兼容标准提供存储路径和详细信息,这些路径和详细信息可能因存储平台而异。 有关详细信息,请参阅 SQL Server 备份到 S3 兼容对象存储的 URL

对于大多数与 S3 兼容的存储,此示例将创建服务器级凭据并执行一个 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;

但是,AWS S3 支持两种不同的 URL 标准。

  • S3://<BUCKET_NAME>.S3.<REGION>.AMAZONAWS.COM/<FOLDER>(默认值)
  • S3://S3.<REGION>.AMAZONAWS.COM/<BUCKET_NAME>/<FOLDER>

有多种方法可以成功为 AWS S3 创建凭据:

  • 在凭据名称中提供存储桶名称和路径和区域。

    -- 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
    

    或者,

    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
    
  • 或者,在凭据名称中提供存储桶名称和路径,但参数化每个 BACKUP/RESTORE 命令中的区域。 使用 S3 特定的区域字符串BACKUP_OPTIONSRESTORE_OPTIONS,例如'{"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
    

G. 创建凭据以使用托管标识访问 Azure Blob 存储

从 SQL Server 2022 CU17 开始,可以将托管标识与 SQL Server 凭据配合使用,以便从 Azure Blob 存储备份和还原 Azure VM 数据库上的 SQL Server。 有关详细信息,请参阅 使用托管标识备份和还原到 URL。

若要创建具有托管标识的凭据以用于 BACKUPRESTORE 操作,请使用以下示例:

CREATE CREDENTIAL [https://<mystorageaccountname>.blob.core.windows.net/<container-name>] 
    WITH IDENTITY = 'Managed Identity';

跟踪标志 4675 可用于检查使用托管标识创建的凭据。 如果在未启用跟踪标志 4675 的情况下执行 CREATE CREDENTIAL 语句,如果未为服务器设置主托管标识,则不会发出错误消息。 若要对这种情况进行故障排除,必须在启用跟踪标志后删除并重新创建凭据。

H. 使用 Azure Key Vault 为可扩展密钥管理创建托管标识凭据

从 SQL Server 2022 CU17 开始,还可以将 Azure VM 上的托管标识用于可扩展密钥管理(EKM)和 Azure Key Vault(AKV)。 有关详细信息,请参阅 Azure Key Vault对可扩展密钥管理的托管标识支持。

若要创建与 AKV 配合使用的 EKM 的托管标识凭据,请使用以下示例:

CREATE CREDENTIAL [<akv-name>.vault.azure.net] 
    WITH IDENTITY = 'Managed Identity'
    FOR CRYPTOGRAPHIC PROVIDER AzureKeyVault_EKM_Prov

例如:

CREATE CREDENTIAL [contoso.vault.azure.net] -- for Azure Key Vault
    WITH IDENTITY = 'Managed Identity'
    FOR CRYPTOGRAPHIC PROVIDER AzureKeyVault_EKM_Prov
CREATE CREDENTIAL [contoso.managedhsm.azure.net] -- for Azure Key Vault Managed HSM
    WITH IDENTITY = 'Managed Identity'
    FOR CRYPTOGRAPHIC PROVIDER AzureKeyVault_EKM_Prov

跟踪标志 4675 可用于检查使用托管标识创建的凭据。 如果在未启用跟踪标志 4675 的情况下执行 CREATE CREDENTIAL 语句,如果未为服务器设置主托管标识,则不会发出错误消息。 若要对这种情况进行故障排除,必须在启用跟踪标志后删除并重新创建凭据。