sql >> Database >  >> RDS >> Sqlserver

Hoe een opgeslagen procedure in SQL Server te coderen

In SQL Server kunt u een opgeslagen procedure versleutelen op het moment dat u deze maakt, of u kunt deze later wijzigen om versleuteling op te nemen.

Om een ​​opgeslagen procedure met T-SQL te maken, gebruikt u de CREATE PROCEDURE syntaxis. Om het te versleutelen, voeg je de WITH ENCRYPTION . toe argument.

U kunt hetzelfde argument ook gebruiken om een ​​bestaande procedure te versleutelen bij gebruik van ALTER PROCEDURE .

Wanneer u een opgeslagen procedure op deze manier versleutelt, wordt de tekst van de procedure geconverteerd naar een versluierde indeling. De definitie ervan is niet direct zichtbaar in catalogusweergaven. Daarom kan de definitie van de procedure niet worden bekeken door gebruikers die geen toegang hebben tot systeemtabellen of databasebestanden.

Voorbeeld 1 – Maak een gecodeerde opgeslagen procedure

Hier is een voorbeeld van het maken van een gecodeerde opgeslagen procedure.

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

Voorbeeld 2 – Bekijk het resultaat

Na het maken van die procedure, nu wanneer ik de sp_helptext . gebruik opgeslagen procedure om de definitie van de procedure te bekijken Ik krijg een bericht dat het versleuteld is.

EXEC sp_helptext 'usp_GetCatsByName';

Resultaat:

The text for object 'usp_GetCatsByName' is encrypted.

En als ik de sys.sql_modules . gebruik systeemcatalogusweergave krijg ik NULL.

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

Resultaat:

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

Ik krijg een soortgelijk resultaat, ongeacht welke T-SQL-methode ik gebruik om te proberen de definitie van de procedure te krijgen.

En hier is de foutmelding die ik krijg in Azure Data Studio wanneer ik de procedure probeer te scripten:

No script was returned when scripting as Create on object StoredProcedure

En ik zou een soortgelijk bericht krijgen als ik het probeerde te bekijken in SSMS, DBeaver of een andere GUI-databasebeheersoftware.

Voorbeeld 3 – Codering toevoegen aan een bestaande opgeslagen procedure

Als u een bestaande opgeslagen procedure wilt versleutelen, gebruikt u ALTER PROCEDURE met dezelfde definitie. Met andere woorden, ik kan het eerste voorbeeld nemen en CREATE . vervangen met ALTER .

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

GO

Dit veronderstelt uiteraard dat de rest van de definitie van de procedure exact hetzelfde is als de bestaande.

De eenvoudigste manier om ervoor te zorgen dat u dezelfde definitie gebruikt, is door uw GUI-tool te gebruiken om de bestaande procedure 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 4 – Versleuteling verwijderen uit een opgeslagen procedure

We kunnen de codering verwijderen door de ALTER PROCEDURE . uit te voeren verklaring zonder de coderingsoptie.

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

Merk op dat dit niet hetzelfde is als het decoderen van de opgeslagen procedure. Hier wijzigen we eenvoudig de bestaande procedure naar de nieuwe definitie. Het gaat er dus van uit dat je al een kopie van de bestaande procedure ergens in je broncodebeheer hebt staan.

Voorbeeld 5 – Native gecompileerde opgeslagen procedures

Versleuteling wordt niet ondersteund op native gecompileerde opgeslagen procedures.

Dit is wat er gebeurt als ik een native gecompileerde opgeslagen procedure probeer te coderen:

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;

Resultaat:

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

Die voorbeeldprocedure is ontleend aan mijn artikel How to Create a Schema Bound Stored Procedure in SQL Server, waarin ook wordt uitgelegd dat je een opgeslagen procedure ook niet kunt schema-gebonden als het geen native gecompileerde procedure is.

Belangrijke opmerkingen

Hier zijn enkele dingen die u moet weten over het versleutelen van opgeslagen procedures in SQL Server:

  • Bevoorrechte gebruikers die toegang hebben tot systeemtabellen via de DAC-poort of rechtstreeks toegang hebben tot databasebestanden, kunnen nog steeds de definitie van de opgeslagen procedure (niet-versleuteld) 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 procedure wordt gepubliceerd als onderdeel van SQL Server-replicatie.
  • CLR-procedures kunnen niet worden versleuteld.
  • Native gecompileerde procedures kunnen niet worden versleuteld.

  1. Standaard tekencodering van SQL Server

  2. hoe alle beperkingen op een tafel in Oracle te controleren

  3. Transactie ROLLBACK gebruiken in SQL Server

  4. Hoe het numerieke deel van een string te krijgen met behulp van T-SQL?