Ao criar uma função definida pelo usuário no SQL Server, você tem a opção de criptografá-la.
Para criar uma função definida pelo usuário com T-SQL, você usa a função
CREATE FUNCTION
sintaxe. Para criptografá-lo, você adiciona o WITH ENCRYPTION
argumento. Você também pode usar o mesmo argumento para criptografar uma função existente ao usar
ALTER FUNCTION
. Quando você criptografa uma função definida pelo usuário dessa maneira, o texto da função é convertido em um formato ofuscado. A definição da função não é diretamente visível em nenhuma exibição de catálogo. Portanto, a definição da função 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 – Função com valor de tabela embutido com criptografia
Aqui está um exemplo de criação de uma função com valor de tabela definida pelo usuário criptografada.
CREATE FUNCTION dbo.udf_CatsByName_ITVF( @CatName varchar(70) ) RETURNS TABLE WITH ENCRYPTION AS RETURN ( 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. Depois de criar essa função, agora quando uso o
sys.sql_modules
visualização do catálogo do sistema para ver sua definição, recebo NULL. SELECT definition FROM sys.sql_modules WHERE object_id = OBJECT_ID('udf_CatsByName_ITVF');
Resultado:
+--------------+ | definition | |--------------| | NULL | +--------------+
E aqui está a mensagem de erro que recebo no Azure Data Studio quando tento fazer o script da função:
No script was returned when scripting as Create on object UserDefinedFunction
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 2 – Função com valor de tabela de várias instruções com criptografia
Aqui está um TVF de várias instruções que faz o mesmo que a função anterior. Os TVFs de várias instruções têm uma sintaxe diferente dos TVFs embutidos. Em TVFs de várias instruções, você coloca a opção de criptografia depois de especificar a variável de retorno.
CREATE FUNCTION [dbo].[udf_CatsByName_MSTVF]( @CatName varchar(70) ) RETURNS @cats TABLE ( CatId int, CatName varchar(70), Phone varchar(10) ) WITH ENCRYPTION AS BEGIN INSERT INTO @cats SELECT CatId, CatName, Phone FROM dbo.Cats WHERE CatName = @CatName; RETURN; END; GO
Exemplo 3 – Função escalar com criptografia
E aqui está um exemplo de uma função escalar criptografada:
CREATE FUNCTION dbo.discountPrice( @price DECIMAL(12,2), @discount DECIMAL(12,2) ) RETURNS DECIMAL (12,2) WITH ENCRYPTION AS BEGIN RETURN @price * (1 - @discount); END; GO
Exemplo 4 – Adicionar criptografia a uma função existente
Se você deseja criptografar uma função existente, use
ALTER FUNCTION
com a mesma definição. Em outras palavras, posso pegar o primeiro exemplo e substituir CREATE
com ALTER
. ALTER FUNCTION dbo.udf_CatsByName_ITVF( @CatName varchar(70) ) RETURNS TABLE WITH ENCRYPTION AS RETURN ( SELECT CatId, CatName, Phone FROM dbo.Cats WHERE CatName = @CatName ); GO
Isso obviamente pressupõe que o restante da definição da função é exatamente a mesma que a função existente.
A maneira mais fácil de garantir que você está usando a mesma definição é usar sua ferramenta GUI para fazer o script da função existente usando a opção “Script as Alter”, se ela 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 5 – Adicionando vários argumentos
Você pode especificar vários argumentos como uma lista separada por vírgulas. Por exemplo, se você quiser usar criptografia e você deseja especificar a vinculação de esquema, então você precisa adicioná-los como uma lista separada por vírgulas.
CREATE FUNCTION dbo.udf_CatsByName_ITVF( @CatName varchar(70) ) RETURNS TABLE WITH SCHEMABINDING, ENCRYPTION AS RETURN ( SELECT CatId, CatName, Phone FROM dbo.Cats WHERE CatName = @CatName ); GO
Em outras palavras, você especifica apenas
WITH
uma vez – não há necessidade de repeti-lo para cada argumento. Observações importantes
Aqui estão algumas coisas que você deve saber sobre a criptografia de funções definidas pelo usuário no SQL Server:
- Usuários privilegiados que podem acessar as tabelas do sistema pela porta DAC ou acessar diretamente os arquivos do banco de dados ainda poderão visualizar a definição da função (não criptografada).
- 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 a função seja publicada como parte da replicação do SQL Server.
- As funções CLR não podem ser criptografadas.