Wanneer u een door de gebruiker gedefinieerde functie in SQL Server maakt, heeft u de mogelijkheid om deze te versleutelen.
Om een door de gebruiker gedefinieerde functie met T-SQL te maken, gebruikt u de CREATE FUNCTION
syntaxis. Om het te versleutelen, voeg je de WITH ENCRYPTION
. toe argument.
U kunt hetzelfde argument ook gebruiken om een bestaande functie te versleutelen bij gebruik van ALTER FUNCTION
.
Wanneer u een door de gebruiker gedefinieerde functie op deze manier versleutelt, wordt de tekst van de functie geconverteerd naar een versluierde indeling. De definitie van de functie is niet direct zichtbaar in catalogusweergaven. Daarom kan de definitie van de functie niet worden bekeken door gebruikers die geen toegang hebben tot systeemtabellen of databasebestanden.
Voorbeeld 1 – Inline tabel gewaardeerde functie met versleuteling
Hier is een voorbeeld van het maken van een versleutelde, door de gebruiker gedefinieerde functie met tabelwaarde.
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
Het deel om het te versleutelen is WITH ENCRYPTION
. Ik zou dat argument gewoon kunnen verwijderen als ik het niet wilde versleutelen.
Na het maken van die functie, nu wanneer ik de sys.sql_modules
. gebruik systeemcatalogusweergave om de definitie ervan te bekijken, krijg ik NULL.
SELECT definition FROM sys.sql_modules WHERE object_id = OBJECT_ID('udf_CatsByName_ITVF');
Resultaat:
+--------------+ | definition | |--------------| | NULL | +--------------+
En hier is de foutmelding die ik krijg in Azure Data Studio wanneer ik de functie probeer te scripten:
No script was returned when scripting as Create on object UserDefinedFunction
En ik zou een soortgelijk bericht krijgen als ik het probeerde te bekijken in SSMS, DBeaver of een andere GUI-databasebeheersoftware.
Voorbeeld 2 – Multi-statement tabelwaardefunctie met versleuteling
Hier is een TVF met meerdere verklaringen die hetzelfde doet als de vorige functie. Multi-Statement TVF's hebben een andere syntaxis dan inline TVF's. Op Multi-Statement TVF's plaatst u de coderingsoptie nadat u de retourvariabele hebt opgegeven.
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
Voorbeeld 3 – Scalaire functie met versleuteling
En hier is een voorbeeld van een versleutelde scalaire functie:
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
Voorbeeld 4 – Codering toevoegen aan een bestaande functie
Als je een bestaande functie wilt versleutelen, gebruik dan ALTER FUNCTION
met dezelfde definitie. Met andere woorden, ik kan het eerste voorbeeld nemen en CREATE
. vervangen met 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
Dit veronderstelt uiteraard dat de rest van de functiedefinitie precies hetzelfde is als de bestaande functie.
De eenvoudigste manier om ervoor te zorgen dat u dezelfde definitie gebruikt, is door uw GUI-tool te gebruiken om de bestaande functie te scripten met behulp van de optie "Script as Alter", als deze bestaat. Anders zou je "Script as Create" kunnen gebruiken, en als de definitie verschijnt, verander CREATE
met ALTER
.
Als u alleen een opdrachtregelinterface heeft, kunt u de sys.sql_modules
opvragen bekijken om de bestaande definitie te krijgen (zoals in het vorige voorbeeld). U kunt dan de definitie kopiëren en CREATE
vervangen met ALTER
.
Zodra je dat hebt gedaan, kun je WITH ENCRYPTION
. toevoegen en voer het opnieuw uit.
Voorbeeld 5 – Meerdere argumenten toevoegen
U kunt meerdere argumenten opgeven als een door komma's gescheiden lijst. Als u bijvoorbeeld codering en . wilt gebruiken u schemabinding wilt specificeren, dan moet u deze toevoegen als een door komma's gescheiden lijst.
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
Met andere woorden, u specificeert alleen WITH
één keer – u hoeft het niet voor elk argument te herhalen.
Belangrijke opmerkingen
Hier zijn enkele dingen die u moet weten over het versleutelen van door de gebruiker gedefinieerde functies in SQL Server:
- Bevoorrechte gebruikers die toegang hebben tot systeemtabellen via de DAC-poort of rechtstreeks toegang hebben tot databasebestanden, kunnen nog steeds de (niet-gecodeerde) definitie van de functie bekijken.
- Gebruikers die een debugger aan het serverproces kunnen koppelen, kunnen tijdens runtime de oorspronkelijke procedure uit het geheugen halen.
- Het gebruik van versleuteling voorkomt dat de functie wordt gepubliceerd als onderdeel van SQL Server-replicatie.
- CLR-functies kunnen niet worden versleuteld.