sql >> Database >  >> RDS >> Sqlserver

Een door de gebruiker gedefinieerde functie coderen in SQL Server

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.

  1. Weet iemand welke coderingstechniek JDeveloper/SQL Developer gebruikt om inloggegevens te behouden?

  2. Afkappen (niet ronde) decimalen in SQL Server

  3. Gegevens selecteren van twee verschillende servers in SQL Server

  4. Oracle LIMIT n,m equivalent