CREATE CREDENTIAL (Transact-SQL)

適用対象: SQL Server Azure SQL Managed Instance

サーバー レベルの資格情報を作成します。 資格情報は、SQL Server 外部のリソースへの接続に必要な認証情報を含むレコードです。 通常、資格情報には Windows ユーザーとパスワードが含まれます。 たとえば、どこかにデータベースのバックアップを保存するには、その場所にアクセスするための特別な資格情報を SQL Server で提供することが必要な場合があります。 詳しくは、「資格情報 (データベース エンジン)」をご覧ください。

注意

データベース レベルで資格情報を作成するには、CREATE DATABASE SCOPED CREDENTIAL (Transact-SQL) を使います。 サーバー上の複数のデータベースに同じ資格情報を使用する必要がある場合は、 CREATE CREDENTIAL を使用してサーバー レベルの資格情報を作成します。

  • データベースの移植性を高めるために、 CREATE DATABASE SCOPED CREDENTIAL を使用してデータベース スコープの資格情報を作成します。 新しいサーバーにデータベースを移動するとき、データベース スコープの資格情報はそれと共に移動します。
  • SQL Database ではデータベース スコープの資格情報を使います。
  • PolyBaseAzure SQL Managed Instance のデータ仮想化機能を使用して、データベース スコープの資格情報使用します。

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 Storage や S3 互換プラットフォームなどの外部データ プラットフォームを使用したバックアップ/復元に使用する場合、次の表に共通パスを示します。

外部データ ソース ロケーション パス
Azure Blob Storage (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>
or s3://s3.<region>.amazonaws.com[:port]/<bucket_name>/<folder>
例 F.

IDENTITY ='identity_name'

サーバーの外部に接続するときに使用するアカウントの名前を指定します。 Azure Key Vault へのアクセスに資格情報を使うときは、IDENTITY はキー コンテナーの名前です。 後述の C の例を参照してください。 資格情報で Shared Access Signature (SAS) を使っているときは、IDENTITYSHARED ACCESS SIGNATURE です。 後述の D の例を参照してください。

重要

Azure SQL Database でサポートされるのは、Azure Key Vault と Shared Access Signature の ID のみです。 Windows ユーザー ID はサポートされません。

SECRET ='secret'

送信の認証に必要なシークレットを指定します。

資格情報を使用して Azure Key Vault にアクセスする場合、 SECRET 引数は、サービス プリンシパルの <client ID> (ハイフンなし) および <secret> として書式設定する必要があります。これらの間にスペースを入れずに一緒に渡す必要があります。 後述の C の例を参照してください。 資格情報が Shared Access Signature を使っている場合は、SECRET は Shared Access Signature トークンです。 後述の D の例を参照してください。 Azure コンテナーで格納済みアクセス ポリシーと Shared Access Signature を作成する方法について詳しくは、「レッスン 1:Azure コンテナーに格納済みアクセス ポリシーと Shared Access Signature を作成する」をご覧ください。

FOR CRYPTOGRAPHIC PROVIDER cryptographic_provider_name

"拡張キー管理プロバイダー (EKM)" の名前を指定します。 キーの管理について詳しくは、「拡張キー管理 (EKM)」をご覧ください。

解説

IDENTITY が Windows ユーザーの場合、このシークレットはパスワードにすることができます。 シークレットはサービス マスター キーを使用して暗号化されます。 サービス マスター キーが再生成された場合、シークレットは新しいサービス マスター キーを使用して再度暗号化されます。

資格情報を作成した後、CREATE LOGIN または ALTER LOGIN を使って、この資格情報を SQL Server ログインにマップすることができます。 1 つの SQL Server ログインは 1 つの資格情報だけにマップできますが、1 つの資格情報は複数の SQL Server ログインにマップできます。 詳しくは、「資格情報 (データベース エンジン)」をご覧ください。 サーバー レベルの資格情報は、ログインにのみマップでき、データベース ユーザーにはマップできません。

資格情報に関する情報は、sys.credentials カタログ ビューで確認できます。

ログインにマップされたプロバイダーの資格情報がない場合は、SQL Server サービス アカウントにマップされた資格情報が使用されます。

それぞれが異なるプロバイダーで使用される資格情報であれば、1 つのログインに複数の資格情報をマップできます。 マップされた資格情報は、各ログインで各プロバイダーにつき 1 つだけ存在する必要があります。 同じ資格情報を他のログインにマップすることはできます。

アクセス許可

ALTER ANY CREDENTIAL 権限が必要です。

A. Windows ID の資格情報の作成

次の例では、資格情報 AlterEgo を作成します。 この資格情報には Windows ユーザー Mary5 とパスワードが含まれます。

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

B. EKM の資格情報の作成

次の例では、以前に EKM 管理ツールを使って EKM モジュール上に作成した User1OnEKM というアカウントを、基本的なアカウントの種類とパスワードと共に使用します。 サーバーの sysadmin アカウントで、EKM アカウントへの接続に使用する資格情報を作成し、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. Azure キー コンテナーを使用する EKM の資格情報の作成

次の例では、SQL Server コネクタ for Microsoft Azure Key Vault を使って Azure Key Vault にアクセスするときに使う、Database Engine 用の SQL Server 資格情報を作成します。 SQL Server コネクタの完全な使用例については、「Azure Key Vault を使用する拡張キー管理 (SQL Server)」をご覧ください。

重要

CREATE CREDENTIALIDENTITY 引数には、資格情報コンテナー名が必要です。 CREATE CREDENTIALSECRET 引数には、<クライアント ID> (ハイフンなし) と <シークレット> を、間にスペースを入れずに一緒に渡す必要があります。

次の例では、 Client ID (11111111-2222-3333-4444-555555555555) はハイフンから取り除かれ、文字列 11111111222233334444555555555555 として入力され、 Secret は文字列 SECRET_DBEngineで表されます。

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

次の例では、クライアント IDシークレットの文字列に変数を使って、同じ資格情報を作成します。これらの文字列は連結されて 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 Managed Instance。

次の例では、SAS トークンを使用して共有アクセス署名資格情報を作成します。 Azure コンテナーで格納済みアクセス ポリシーと Shared Access Signature を作成してから、Shared Access Signature を使って資格情報を作成するチュートリアルについては、チュートリアル: Microsoft Azure Blob Storage と SQL Server データベースの使用に関する説明をご覧ください。

重要

CREDENTIAL NAME 引数では、名前がコンテナーのパス (https で始まり、末尾のスラッシュを含まないもの) と一致する必要があります。 IDENTITY 引数には、名前 SHARED ACCESS SIGNATURE が必要です。 SECRET 引数には、Shared Access Signature トークンが必要です。

SHARED ACCESS SIGNATURE シークレットの先頭を ? にすることはできません。

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. マネージド ID の資格情報の作成

次の例では、Azure SQL または Azure Synapse サービスのマネージド ID を表す資格情報を作成します。 このケースでは、パスワードとシークレットは適用されません。

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

F. S3 互換ストレージへのバックアップ/復元の資格情報を作成する

適用対象: SQL Server 2022 (16.x) 以降のバージョン

オープン S3 互換標準では、ストレージ プラットフォームによって異なる可能性があるストレージ パスと詳細が提供されます。 詳細については、「S3 互換オブジェクト ストレージの SQL Server Backup to 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 では、2 つの異なる 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": {"region":"us-west-2"}}'など、BACKUP_OPTIONSRESTORE_OPTIONSで S3 固有のリージョン文字列を使用します。

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