No SQL Server, você pode criptografar um procedimento armazenado no momento em que o cria ou pode alterá-lo posteriormente para incluir a criptografia.
Para criar um procedimento armazenado com T-SQL, você usa o
CREATE PROCEDURE
sintaxe. Para criptografá-lo, você adiciona o WITH ENCRYPTION
argumento. Você também pode usar o mesmo argumento para criptografar um procedimento existente ao usar
ALTER PROCEDURE
. Quando você criptografa um procedimento armazenado dessa maneira, o texto do procedimento é convertido em um formato ofuscado. Sua definição não é diretamente visível em nenhuma exibição de catálogo. Portanto, a definição do procedimento não pode ser visualizada por usuários que não tenham acesso às tabelas do sistema ou aos arquivos do banco de dados.
Exemplo 1 – Criar um procedimento armazenado criptografado
Aqui está um exemplo de criação de um procedimento armazenado criptografado.
CREATE PROCEDURE dbo.usp_GetCatsByName @catname varchar(70) WITH ENCRYPTION AS SELECT CatId, CatName, Phone FROM dbo.Cats WHERE CatName = @catname; GO
A parte para criptografar é
WITH ENCRYPTION
. Eu poderia simplesmente remover esse argumento se não quisesse criptografá-lo. Exemplo 2 – Veja o resultado
Depois de criar esse procedimento, agora quando uso o
sp_helptext
procedimento armazenado para visualizar a definição do procedimento, recebo uma mensagem informando que ele está criptografado. EXEC sp_helptext 'usp_GetCatsByName';
Resultado:
The text for object 'usp_GetCatsByName' is encrypted.
E se eu usar o
sys.sql_modules
visualização do catálogo do sistema recebo NULL. SELECT definition FROM sys.sql_modules WHERE object_id = OBJECT_ID('dbo.usp_GetCatsByName');
Resultado:
+--------------+ | definition | |--------------| | NULL | +--------------+
Obtenho um resultado semelhante, independentemente de qual método T-SQL eu uso para tentar obter a definição do procedimento.
E aqui está a mensagem de erro que recebo no Azure Data Studio quando tento fazer o script do procedimento:
No script was returned when scripting as Create on object StoredProcedure
E eu receberia uma mensagem semelhante se tentasse visualizá-la no SSMS, DBeaver ou qualquer outro software de gerenciamento de banco de dados GUI.
Exemplo 3 - Adicionar criptografia a um procedimento armazenado existente
Se você deseja criptografar um procedimento armazenado existente, use
ALTER PROCEDURE
com a mesma definição. Em outras palavras, posso pegar o primeiro exemplo e substituir CREATE
com ALTER
. ALTER PROCEDURE dbo.usp_GetCatsByName @catname varchar(70) WITH ENCRYPTION AS SELECT CatId, CatName, Phone FROM dbo.Cats WHERE CatName = @catname; GO
Isso obviamente pressupõe que o restante da definição do procedimento é exatamente a mesma que a existente.
A maneira mais fácil de garantir que você está usando a mesma definição é usar sua ferramenta GUI para fazer o script do procedimento existente usando a opção “Script as Alter”, se existir. Caso contrário, você pode usar “Script as Create” e, quando a definição aparecer, altere
CREATE
com ALTER
. Se você tiver apenas uma interface de linha de comando, poderá consultar o
sys.sql_modules
view para obter a definição existente (como no exemplo anterior). Você pode então copiar a definição e substituir CREATE
com ALTER
. Depois de fazer isso, você pode adicionar
WITH ENCRYPTION
e execute-o novamente. Exemplo 4 – Remover criptografia de um procedimento armazenado
Podemos remover a criptografia executando o
ALTER PROCEDURE
declaração sem a opção de criptografia. ALTER PROCEDURE dbo.usp_GetCatsByName @catname varchar(70) AS SELECT CatId, CatName, Phone FROM dbo.Cats WHERE CatName = @catname;
Observe que isso não é o mesmo que descriptografar o procedimento armazenado. Aqui, estamos simplesmente alterando o procedimento existente para a nova definição. Portanto, ele pressupõe que você já tenha uma cópia do procedimento existente em algum lugar do seu controle de origem.
Exemplo 5 – Procedimentos armazenados compilados nativamente
A criptografia não é compatível com procedimentos armazenados compilados nativamente.
Aqui está o que acontece quando tento criptografar um procedimento armazenado compilado nativamente:
ALTER PROCEDURE [dbo].[usp_GetCowsByName] @cowname varchar(70) WITH SCHEMABINDING, NATIVE_COMPILATION, ENCRYPTION AS BEGIN ATOMIC WITH ( TRANSACTION ISOLATION LEVEL = SNAPSHOT, LANGUAGE = N'us_english' ) SELECT CowId, CowName, Phone FROM dbo.Cows WHERE CowName = @cowname END;
Resultado:
Msg 10794, Level 16, State 17, Procedure usp_GetCowsByName, Line 3 The option 'ENCRYPTION' is not supported with natively compiled modules.
Esse procedimento de exemplo é retirado do meu artigo, Como criar um procedimento armazenado vinculado ao esquema no SQL Server, que também explica que você também não pode vincular um procedimento armazenado ao esquema se não for um procedimento compilado nativamente.
Observações importantes
Aqui estão algumas coisas que você deve saber sobre a criptografia de procedimentos armazenados no SQL Server:
- Usuários privilegiados que podem acessar as tabelas do sistema pela porta DAC ou acessar diretamente os arquivos de banco de dados ainda poderão visualizar a definição do procedimento armazenado (não criptografado).
- Os usuários que podem anexar um depurador ao processo do servidor podem recuperar o procedimento original da memória em tempo de execução.
- O uso de criptografia impede que o procedimento seja publicado como parte da replicação do SQL Server.
- Os procedimentos CLR não podem ser criptografados.
- Procedimentos compilados nativamente não podem ser criptografados.