sql >> Database teknologi >  >> RDS >> Sqlserver

Sådan krypteres en brugerdefineret funktion i SQL Server

Når du opretter en brugerdefineret funktion i SQL Server, har du mulighed for at kryptere den.

For at oprette en brugerdefineret funktion med T-SQL bruger du CREATE FUNCTION syntaks. For at kryptere det, tilføjer du WITH ENCRYPTION argument.

Du kan også bruge det samme argument til at kryptere en eksisterende funktion, når du bruger ALTER FUNCTION .

Når du krypterer en brugerdefineret funktion på denne måde, konverteres funktionens tekst til et sløret format. Funktionens definition er ikke direkte synlig i nogen katalogvisninger. Derfor kan funktionens definition ikke ses af brugere, der ikke har adgang til systemtabeller eller databasefiler.

Eksempel 1 – Inline-tabel-vurderet funktion med kryptering

Her er et eksempel på oprettelse af en krypteret brugerdefineret funktion med tabelværdi.

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

Delen til at kryptere den er WITH ENCRYPTION . Jeg kunne simpelthen fjerne det argument, hvis jeg ikke ville kryptere det.

Efter at have oprettet den funktion, nu når jeg bruger sys.sql_modules systemkatalogvisning for at se dens definition, får jeg NULL.

SELECT definition 
FROM sys.sql_modules
WHERE object_id = OBJECT_ID('udf_CatsByName_ITVF');

Resultat:

+--------------+
| definition   |
|--------------|
| NULL         |
+--------------+

Og her er fejlmeddelelsen, jeg får i Azure Data Studio, når jeg prøver at scripte funktionen:

No script was returned when scripting as Create on object UserDefinedFunction

Og jeg ville få en lignende besked, hvis jeg prøvede at se den i SSMS, DBeaver eller enhver anden GUI-databasestyringssoftware.

Eksempel 2 – Multi-sætning tabel-værdi-funktion med kryptering

Her er en multi-statement TVF, der gør det samme som den forrige funktion. Multi-Statement TVF'er har en anden syntaks end inline TVF'er. På TVF'er med flere erklæringer sætter du krypteringsindstillingen, efter du har angivet returvariablen.

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

Eksempel 3 – Skalær funktion med kryptering

Og her er et eksempel på en krypteret skalarfunktion:

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

Eksempel 4 – Tilføj kryptering til en eksisterende funktion

Hvis du vil kryptere en eksisterende funktion, skal du bruge ALTER FUNCTION med samme definition. Med andre ord kan jeg tage det første eksempel og erstatte CREATE med 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

Dette forudsætter naturligvis, at resten af ​​funktionens definition er nøjagtig den samme som den eksisterende funktion.

Den nemmeste måde at sikre, at du bruger den samme definition på, er at bruge dit GUI-værktøj til at scripte den eksisterende funktion ved at bruge "Script as Alter", hvis den findes. Ellers kan du bruge "Script som Opret", og derefter ændre CREATE, når definitionen vises med ALTER .

Hvis du kun har en kommandolinjegrænseflade, kan du forespørge på sys.sql_modules view for at få den eksisterende definition (som i det foregående eksempel). Du kan derefter kopiere definitionen og erstatte CREATE med ALTER .

Når du har gjort det, kan du tilføje WITH ENCRYPTION og kør det igen.

Eksempel 5 – Tilføjelse af flere argumenter

Du kan angive flere argumenter som en kommasepareret liste. For eksempel, hvis du vil bruge kryptering og du vil angive skemabinding, så skal du tilføje disse som en kommasepareret liste.

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

Med andre ord, du angiver kun WITH én gang – det er ikke nødvendigt at gentage det for hvert argument.

Vigtige bemærkninger

Her er nogle ting, du bør vide om kryptering af brugerdefinerede funktioner i SQL Server:

  • Privilegerede brugere, der kan få adgang til systemtabeller over DAC-porten eller direkte få adgang til databasefiler, vil stadig kunne se funktionens (ikke-krypterede) definition.
  • Brugere, der kan knytte en debugger til serverprocessen, kan hente den originale procedure fra hukommelsen under kørsel.
  • Brug af kryptering forhindrer funktionen i at blive publiceret som en del af SQL Server-replikering.
  • CLR-funktioner kan ikke krypteres.

  1. ProxySQL Native Clustering med Kubernetes

  2. cd:-M:ugyldig mulighed

  3. Sådan installeres MySQL på CentOS 7

  4. JDBC-forbindelse mislykkedes, fejl:TCP/IP-forbindelse til vært mislykkedes