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。
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 密钥库时,SECRET 参数必须格式化为服务主体的<>(没有连字符)和>,在两者之间没有空格的情况下一起传递。 请参阅以下示例 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(无连字符)和 <密钥> 一起传递,且二者之间不留空格。

在下面的示例中,客户端 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

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