Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Как да шифровате съхранена процедура в SQL Server

В SQL Server можете да шифровате съхранена процедура в момента, в който я създавате, или можете да я промените по-късно, за да включите криптиране.

За да създадете съхранена процедура с T-SQL, използвате CREATE PROCEDURE синтаксис. За да го шифровате, добавяте WITH ENCRYPTION аргумент.

Можете също да използвате същия аргумент за криптиране на съществуваща процедура, когато използвате ALTER PROCEDURE .

Когато шифровате съхранена процедура по този начин, текстът на процедурата се преобразува в обфускиран формат. Неговото определение не се вижда директно в никакви каталожни изгледи. Следователно дефиницията на процедурата не може да бъде видяна от потребители, които нямат достъп до системни таблици или файлове на базата данни.

Пример 1 – Създаване на криптирана съхранена процедура

Ето пример за създаване на криптирана съхранена процедура.

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

GO

Частта за криптирането му е WITH ENCRYPTION . Бих могъл просто да премахна този аргумент, ако не искам да го криптирам.

Пример 2 – Вижте резултата

След като създадох тази процедура, сега, когато използвам sp_helptext съхранена процедура, за да видя дефиницията на процедурата. Получавам съобщение, което ми казва, че е криптирана.

EXEC sp_helptext 'usp_GetCatsByName';

Резултат:

The text for object 'usp_GetCatsByName' is encrypted.

И ако използвам sys.sql_modules изглед на системен каталог Получавам NULL.

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

Резултат:

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

Получавам подобен резултат, независимо кой метод на T-SQL използвам, за да се опитам да получа дефиницията на процедурата.

И ето съобщението за грешка, което получавам в Azure Data Studio, когато се опитам да напиша процедурата:

No script was returned when scripting as Create on object StoredProcedure

И бих получил подобно съобщение, ако се опитам да го видя в SSMS, DBeaver или друг софтуер за управление на база данни с GUI.

Пример 3 – Добавете криптиране към съществуваща съхранена процедура

Ако искате да шифровате съществуваща съхранена процедура, използвайте ALTER PROCEDURE със същото определение. С други думи, мога да взема първия пример и да заменя CREATE с ALTER .

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

GO

Това очевидно предполага, че останалата част от дефиницията на процедурата е точно същата като съществуващата.

Най-лесният начин да се уверите, че използвате същата дефиниция, е да използвате вашия GUI инструмент, за да скриптирате съществуващата процедура, като използвате опцията „Script as Alter“, ако съществува. В противен случай можете да използвате „Script as Create“, след което, когато се появи дефиницията, променете CREATE с ALTER .

Ако имате само интерфейс на командния ред, можете да потърсите sys.sql_modules преглед, за да получите съществуващата дефиниция (както в предишния пример). След това можете да копирате дефиницията и да замените CREATE с ALTER .

След като направите това, можете да добавите WITH ENCRYPTION и го стартирайте отново.

Пример 4 – Премахване на криптирането от съхранена процедура

Можем да премахнем криптирането, като изпълним ALTER PROCEDURE изявление без опцията за криптиране.

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

Имайте предвид, че това не е същото като декриптиране на съхранената процедура. Тук ние просто променяме съществуващата процедура към новата дефиниция. Така че предполага се, че вече имате копие на съществуващата процедура някъде във вашия контрол на източника.

Пример 5 – Естествено компилирани съхранени процедури

Шифроването не се поддържа от компилираните в оригинал съхранени процедури.

Ето какво се случва, когато се опитам да криптирам нативно компилирана съхранена процедура:

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;

Резултат:

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

Тази примерна процедура е взета от моята статия, Как да създадем съхранена процедура, обвързана със схема в SQL Server, която също обяснява, че също така не можете да свържете схема със съхранена процедура, ако не е компилирана процедура.

Важни бележки

Ето някои неща, които трябва да знаете за криптирането на съхранени процедури в SQL Server:

  • Привилегированите потребители, които имат достъп до системни таблици през порта на DAC или пряк достъп до файловете на базата данни, все още ще могат да виждат дефиницията на съхранената процедура (некриптирана).
  • Потребителите, които могат да прикачат дебъгер към сървърния процес, могат да извличат оригиналната процедура от паметта по време на изпълнение.
  • Използването на криптиране предотвратява публикуването на процедурата като част от репликацията на SQL Server.
  • Процедурите на CLR не могат да бъдат шифровани.
  • Компилираните процедури не могат да бъдат шифровани.

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. String_agg за SQL Server преди 2017 г

  2. Преобразувайте „datetime2“ в „smalldatetime“ в SQL Server (T-SQL примери)

  3. DEGREES() Примери в SQL Server

  4. Как да свържа sql сървър с php с помощта на xampp?

  5. Как да използвам SqlCommand за СЪЗДАВАНЕ НА БАЗА ДАННИ с параметризирано db име?