В 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 не могат да бъдат шифровани.
- Компилираните процедури не могат да бъдат шифровани.