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

Sådan krypterer du en lagret procedure i SQL Server

I SQL Server kan du kryptere en lagret procedure på det tidspunkt, du opretter den, eller du kan ændre den senere for at inkludere kryptering.

For at oprette en lagret procedure med T-SQL, bruger du CREATE PROCEDURE syntaks. For at kryptere det, tilføjer du WITH ENCRYPTION argument.

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

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

Eksempel 1 – Opret en krypteret lagret procedure

Her er et eksempel på oprettelse af en krypteret lagret procedure.

CREATE PROCEDURE dbo.usp_GetCatsByName @catname varchar(70)
WITH ENCRYPTION
AS
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.

Eksempel 2 – Se resultatet

Efter at have oprettet den procedure, nu når jeg bruger sp_helptext lagret procedure for at se procedurens definition Jeg får en besked, der fortæller mig, at den er krypteret.

EXEC sp_helptext 'usp_GetCatsByName';

Resultat:

The text for object 'usp_GetCatsByName' is encrypted.

Og hvis jeg bruger sys.sql_modules systemkatalogvisning Jeg får NULL.

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

Resultat:

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

Jeg får et lignende resultat, uanset hvilken T-SQL-metode jeg bruger til at forsøge at få procedurens definition.

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

No script was returned when scripting as Create on object StoredProcedure

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

Eksempel 3 – Tilføj kryptering til en eksisterende lagret procedure

Hvis du ønsker at kryptere en eksisterende lagret procedure, skal du bruge ALTER PROCEDURE med samme definition. Med andre ord kan jeg tage det første eksempel og erstatte CREATE med ALTER .

ALTER PROCEDURE dbo.usp_GetCatsByName @catname varchar(70)
WITH ENCRYPTION
AS
SELECT 
    CatId,
    CatName,
    Phone
FROM dbo.Cats
WHERE CatName = @catname;

GO

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

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 procedure ved hjælp af "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 4 – Fjern kryptering fra en lagret procedure

Vi kan fjerne kryptering ved at køre ALTER PROCEDURE sætning uden krypteringsmulighed.

ALTER PROCEDURE dbo.usp_GetCatsByName @catname varchar(70)
AS
SELECT 
    CatId,
    CatName,
    Phone
FROM dbo.Cats
WHERE CatName = @catname;

Bemærk, at dette ikke er det samme som at dekryptere den lagrede procedure. Her ændrer vi blot den eksisterende procedure til den nye definition. Så det antager, at du allerede har en kopi af den eksisterende procedure et eller andet sted i din kildekontrol.

Eksempel 5 – Native kompilerede lagrede procedurer

Kryptering understøttes ikke på oprindeligt kompilerede lagrede procedurer.

Her er, hvad der sker, når jeg forsøger at kryptere en oprindeligt kompileret lagret procedure:

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;

Resultat:

Msg 10794, Level 16, State 17, Procedure usp_GetCowsByName, Line 3
The option 'ENCRYPTION' is not supported with natively compiled modules.

Det eksempel på proceduren er taget fra min artikel, How to Create a Schema Bound Stored Procedure in SQL Server, som også forklarer, at du heller ikke kan skemabunde en lagret procedure, hvis det ikke er en indbygget kompileret procedure.

Vigtige bemærkninger

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

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

  1. Hvordan forhindrer jeg en databasetrigger i at gentage sig?

  2. COSH() Funktion i Oracle

  3. Høj pladsforbrug Fra crfclust.bdb

  4. Er der en måde at få rækkenummeret i Mysql som rækkenummeret i oracle