Compartilhar via


sp_refresh_parameter_encryption (Transact-SQL)

Aplica-se a: SQL Server 2016 (13.x) e posterior Banco de Dados SQL do Azure Instância Gerenciada de SQL do Azure

Atualiza os metadados Always Encrypted dos parâmetros do procedimento armazenado não vinculado a esquema, da função definida pelo usuário, da exibição, do gatilho DML, do gatilho DDL no nível do banco de dados ou do gatilho DDL no nível do servidor especificados no banco de dados atual.

Convenções de sintaxe de Transact-SQL

sp_refresh_parameter_encryption
    [ @name = ] N'name'
    [ , [ @namespace = ] { OBJECT | DATABASE_DDL_TRIGGER | SERVER_DDL_TRIGGER } ]
[ ; ]

Argumentos

[ @name = ] N'name'

O nome do procedimento armazenado, função definida pelo usuário, exibição, gatilho DML, gatilho DDL de nível do banco de dados ou gatilho DDL do nível de servidor. @name é nvarchar(776), sem padrão. @name não pode ser um procedimento armazenado CLR (Common Language Runtime) nem uma função CLR. @name não pode ser vinculado ao esquema. @name pode ser um identificador de várias partes, mas só pode se referir a objetos no banco de dados atual.

[ @namespace = ] N'namespace'

A classe do módulo especificado. @namespace é nvarchar(20), com um padrão de OBJECT. Quando @name é um gatilho DDL, @namespace é obrigatório. As entradas válidas são DATABASE_DDL_TRIGGER e SERVER_DDL_TRIGGER.

Valores do código de retorno

0 (êxito) ou um número diferente de zero (falha)

Comentários

Os metadados de criptografia dos parâmetros de um módulo poderão ficar desatualizados se:

  • As propriedades de criptografia de uma coluna em uma tabela à qual o módulo faz referência foram atualizadas. Por exemplo, uma coluna foi descartada e uma nova coluna foi adicionada com o mesmo nome, mas com um tipo de criptografia, uma chave de criptografia ou um algoritmo de criptografia diferente.

  • O módulo faz referência a outro módulo com metadados de criptografia de parâmetros desatualizados.

Quando as propriedades de criptografia de uma tabela são modificadas, sp_refresh_parameter_encryption deve ser executado em todos os módulos que fazem referência direta ou indireta à tabela. Esse procedimento armazenado pode ser chamado nesses módulos em qualquer ordem, sem exigir que o usuário atualize primeiro o módulo interno antes de passar para seus chamadores.

sp_refresh_parameter_encryption não afeta nenhuma permissão, propriedade estendida ou opção SET que esteja associada ao objeto.

Para atualizar um gatilho DDL de nível de servidor, execute este procedimento armazenado a partir do contexto de qualquer banco de dados.

Observação

Todas as assinaturas associadas ao objeto são descartadas quando você executa sp_refresh_parameter_encryption.

Permissões

Requer a permissão ALTER no módulo e a permissão REFERENCES em todos os tipos de dados CLR definidos pelo usuário e coleções de esquema XML referenciados pelo objeto.

Quando o módulo especificado for um gatilho DDL em nível de banco de dados, será necessária a permissão ALTER ANY DATABASE DDL TRIGGER no banco de dados atual.

Quando o módulo especificado for um gatilho DDL em nível de servidor, será necessária a permissão CONTROL SERVER.

Para módulos definidos com a cláusula EXECUTE AS, a permissão IMPERSONATE é necessária na entidade especificada. Em geral, a atualização de um objeto não altera sua entidade de segurança EXECUTE AS, a menos que o módulo tenha sido definido com EXECUTE AS USER e o nome de usuário da entidade de segurança agora seja um usuário diferente do que era no momento em que o módulo foi criado.

Exemplos

O exemplo a seguir cria uma tabela e um procedimento que faz referência à tabela, configura o Always Encrypted e, em seguida, demonstra a alteração da tabela e a execução do procedimento sp_refresh_parameter_encryption.

Primeiro, crie a tabela inicial e um procedimento armazenado que faça referência a essa tabela.

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)
);
GO

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

Em seguida, configure as chaves 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 = 0x
    016E000001630075007200720065006E00740075007300650072002F006D0079002F006100360036006200620030006600360064006400370030006200640066006600300032006200360032006400300066003800370065003300340030003200380038006500360066003900330030003500CA0D0CEC74ECADD1804CF99137B4BD06BBAB15D7EA74E0C249A779C7768A5B659E0125D24FF827F5EA8CA517A8E197ECA1353BA814C2B0B2E6C8AB36E3AE6A1E972D69C3C573A963ADAB6686CF5D24F95FE43140C4F9AF48FBA7DF2D053F3B4A1F5693A1F905440F8015BDB43AF8A04BE4E045B89876A0097E5FBC4E6A3B9C3C0D278C540E46C53938B8C957B689C4DC095821C465C73117CBA95B758232F9E5B2FCC7950B8CA00AFE374DE42847E3FBC2FDD277035A2DEF529F4B735C20D980073B4965B4542A34723276A1646998FC6E1C40A3FDB6ABCA98EE2B447F114D2AC7FF8C7D51657550EC5C2BABFFE8429B851272086DCED94332CF18FA854C1D545A28B1EF4BE64F8E035175C1650F6FC5C4702ACF99850A4542B3747EAEC0CC726E091B36CE24392D801ECAA684DE344FECE05812D12CD72254A014D42D0EABDA41C89FC4F545E88B4B8781E5FAF40D7199D4842D2BFE904D209728ED4F527CBC169E2904F6E711FF81A8F4C25382A2E778DD2A58552ED031AFFDA9D9D891D98AD82155F93C58202FC24A77F415D4F8EF22419D62E188AC609330CCBD97CEE1AEF8A18B01958833604707FDF03B2B386487CC679D7E352D0B69F9FB002E51BCD814D077E82A09C14E9892C1F8E0C559CFD5FA841CEF647DAB03C8191DC46B772E94D579D8C80FE93C3827C9F0AE04D5325BC73111E07EEEDBE67F1E2A73580085
);
GO

Por fim, substituímos a coluna SSN pela coluna criptografada e, em seguida, executamos o procedimento sp_refresh_parameter_encryption para atualizar os componentes Always Encrypted.

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