sp_refresh_parameter_encryption (Transact-SQL)

適用対象: SQL Server 2016 (13.x) 以降 Azure SQL DatabaseAzure SQL Managed Instance

現在のデータベースで、指定されたスキーマ バインドされていないストアド プロシージャ、ユーザー定義関数、ビュー、DML トリガー、データベース レベルの DDL トリガー、またはサーバー レベルの DDL トリガーのパラメーターの Always Encrypted メタデータを更新します。

Transact-SQL 構文表記規則

構文

sys.sp_refresh_parameter_encryption [ @name = ] 'module_name' 
    [ , [ @namespace = ] '<class>' ]
[ ; ]

<class> ::=
{ DATABASE_DDL_TRIGGER | SERVER_DDL_TRIGGER }

引数

[ @name = ] 'module_name' は、 ストアド プロシージャ、ユーザー定義関数、ビュー、DML トリガー、データベース レベルの DDL トリガー、またはサーバー レベルの DDL トリガーの名前です。 module_name を共通言語ランタイム (CLR) ストアド プロシージャまたは CLR 関数にすることはできません。 module_name は、スキーマ バインドできません。 module_name は既定値のない nvarchar です。 module_name はマルチパート識別子にできますが、現在のデータベース内のオブジェクトのみを参照できます。

[ @namespace = ] ' < class > ' は指定したモジュールのクラスです。 module_name が DDL トリガーの場合、<class> が必須です。 <class>nvarchar(20) です。 有効な入力は DATABASE_DDL_TRIGGERSERVER_DDL_TRIGGER です。

リターン コードの値

0 (成功) または 0 以外の数値 (失敗)

解説

次の場合、モジュールのパラメーターの暗号化メタデータが古くなる可能性があります。

  • モジュールが参照するテーブル内の列の暗号化プロパティが更新された場合。 たとえば、列が削除され、同じ名前の新しい列が追加されたが、別の暗号化の種類、暗号化キー、または暗号化アルゴリズムが追加されている。
  • モジュールは、古いパラメーター暗号化メタデータを持つ別のモジュールを参照します。

テーブルの暗号化プロパティを変更する場合、sp_refresh_parameter_encryption は テーブルを直接または間接的に参照するモジュールに対して実行する必要があります。 このストアド プロシージャは、呼び出し元に移動する前にユーザーが最初に内部モジュールを更新する必要なく、任意の順序でこれらのモジュールで呼び出すことができます。

sp_refresh_parameter_encryption は、オブジェクトに関連付けられている権限、拡張プロパティ、または SET オプションには影響しません。

サーバー レベルの DDL トリガーを更新するには、任意のデータベースのコンテキストからこのストアド プロシージャを実行します。

注意

オブジェクトに関連付けられている署名は、sp_refresh_parameter_encryption の実行時に削除されます。

アクセス許可

モジュールに対する ALTER 権限、およびオブジェクトによって参照される CLR ユーザー定義型と XML スキーマ コレクションに対する REFERENCES 権限が必要です。

指定したモジュールがデータベース レベルの DDL トリガーである場合は、現在のデータベースのALTER ANY DATABASE DDL TRIGGER 権限が必要です。

指定されたモジュールがサーバー レベルの DDL トリガーである場合は、CONTROL SERVER 権限が必要です。

EXECUTE AS 句で定義されているモジュールでは、指定したプリンシパルに対して IMPERSONATE 権限が必要です。 通常、オブジェクトを更新しても、モジュールが EXECUTE AS USER を指定して定義された場合を除いて、オブジェクトの EXECUTE AS のプリンシパルは変更されません。プリンシパルのユーザー名は、モジュールが作成された時点とは異なるユーザーに解決されます。

次の例では、テーブルとプロシージャを作成してテーブルを参照し、Always Encrypted を構成してから、テーブルの変更とsp_refresh_parameter_encryption プロシージャの実行を示します。

まず、初期テーブルと、テーブルを参照するストアド プロシージャを作成します。

CREATE TABLE [Patients]([PatientID] [int] IDENTITY(1,1) NOT NULL,
	[SSN] [char](11), 
	[FirstName] [nvarchar](50) NULL,
	[LastName] [nvarchar](50) NOT NULL,
	[MiddleName] [nvarchar](50) NULL,
	[StreetAddress] [nvarchar](50) NOT NULL,
	[City] [nvarchar](50) NOT NULL,
	[ZipCode] [char](5) NOT NULL,
	[State] [char](2) NOT NULL,
	[BirthDate] [date] NOT NULL,
 CONSTRAINT [PK_Patients] PRIMARY KEY CLUSTERED 
(
	[PatientID] ASC
) WITH 
    (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, 
	 IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, 
	 ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]) ON [PRIMARY];
GO

CREATE PROCEDURE [find_patient] @SSN [char](11)
AS
BEGIN
	SELECT * FROM [Patients] WHERE SSN=@SSN
END;
GO

次に、Always Encrypted キーを設定します。

CREATE COLUMN MASTER KEY [CMK1]
WITH
(
	   KEY_STORE_PROVIDER_NAME = N'MSSQL_CERTIFICATE_STORE',
   	KEY_PATH = N'CurrentUser/my/A66BB0F6DD70BDFF02B62D0F87E340288E6F9305'
);
GO

CREATE COLUMN ENCRYPTION KEY [CEK1]
WITH VALUES
(
	   COLUMN_MASTER_KEY = [CMK1],
   	ALGORITHM = 'RSA_OAEP',
   	ENCRYPTED_VALUE = 
	   0x016E000001630075007200720065006E00740075007300650072002F006D0079002F006100360036006200620030006600360064006400370030006200640066006600300032006200360032006400300066003800370065003300340030003200380038006500360066003900330030003500CA0D0CEC74ECADD1804CF99137B4BD06BBAB15D7EA74E0C249A779C7768A5B659E0125D24FF827F5EA8CA517A8E197ECA1353BA814C2B0B2E6C8AB36E3AE6A1E972D69C3C573A963ADAB6686CF5D24F95FE43140C4F9AF48FBA7DF2D053F3B4A1F5693A1F905440F8015BDB43AF8A04BE4E045B89876A0097E5FBC4E6A3B9C3C0D278C540E46C53938B8C957B689C4DC095821C465C73117CBA95B758232F9E5B2FCC7950B8CA00AFE374DE42847E3FBC2FDD277035A2DEF529F4B735C20D980073B4965B4542A34723276A1646998FC6E1C40A3FDB6ABCA98EE2B447F114D2AC7FF8C7D51657550EC5C2BABFFE8429B851272086DCED94332CF18FA854C1D545A28B1EF4BE64F8E035175C1650F6FC5C4702ACF99850A4542B3747EAEC0CC726E091B36CE24392D801ECAA684DE344FECE05812D12CD72254A014D42D0EABDA41C89FC4F545E88B4B8781E5FAF40D7199D4842D2BFE904D209728ED4F527CBC169E2904F6E711FF81A8F4C25382A2E778DD2A58552ED031AFFDA9D9D891D98AD82155F93C58202FC24A77F415D4F8EF22419D62E188AC609330CCBD97CEE1AEF8A18B01958833604707FDF03B2B386487CC679D7E352D0B69F9FB002E51BCD814D077E82A09C14E9892C1F8E0C559CFD5FA841CEF647DAB03C8191DC46B772E94D579D8C80FE93C3827C9F0AE04D5325BC73111E07EEEDBE67F1E2A73580085
);
GO

最後に、SSN 列を暗号化された列に置き換え、Always Encrypted コンポーネントを更新するsp_refresh_parameter_encryption プロシージャを実行します。

ALTER TABLE [Patients] DROP COLUMN [SSN];
GO

ALTER TABLE [Patients] 
    ADD	[SSN] [char](11) COLLATE Latin1_General_BIN2 
	ENCRYPTED WITH 
	    (COLUMN_ENCRYPTION_KEY = [CEK1], 
    	ENCRYPTION_TYPE = Deterministic, 
	    ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256') 
	NOT NULL;
GO

EXEC sp_refresh_parameter_encryption [find_patient];
GO

参照

常に暗号化
Always Encrypted ウィザード