Когато създавате дефинирана от потребителя функция в SQL Server, имате възможност да я криптирате.
За да създадете дефинирана от потребителя функция с T-SQL, използвате CREATE FUNCTION
синтаксис. За да го шифровате, добавяте WITH ENCRYPTION
аргумент.
Можете също да използвате същия аргумент за шифроване на съществуваща функция, когато използвате ALTER FUNCTION
.
Когато шифровате дефинирана от потребителя функция по този начин, текстът на функцията се преобразува в обфускиран формат. Дефиницията на функцията не се вижда директно в никакви каталожни изгледи. Следователно дефиницията на функцията не може да бъде видяна от потребители, които нямат достъп до системни таблици или файлове на базата данни.
Пример 1 – Вградена функция с таблично стойности с криптиране
Ето пример за създаване на криптирана дефинирана от потребителя функция с таблица.
СЪЗДАВАНЕ НА ФУНКЦИЯ dbo.udf_CatsByName_ITVF( @CatName varchar(70) ) ВРЪЩА ТАБЛИЦА С ENCRYPTIONASRETURN ( ИЗБЕРЕТЕ CatId, CatName, Phone ОТ dbo.Cats WHERE CatName =@CatName );GO
Частта за криптирането му е WITH ENCRYPTION
. Бих могъл просто да премахна този аргумент, ако не искам да го криптирам.
След като създадох тази функция, сега, когато използвам sys.sql_modules
изглед на системния каталог, за да видите неговата дефиниция, получавам NULL.
ИЗБЕРЕТЕ дефиниция ОТ sys.sql_modulesWHERE object_id =OBJECT_ID('udf_CatsByName_ITVF');
Резултат:
+--------------+| определение ||--------------|| NULL |+--------------+
И ето съобщението за грешка, което получавам в Azure Data Studio, когато се опитам да скриптира функцията:
Не беше върнат скрипт при скриптиране като Създаване на обект UserDefinedFunction
И бих получил подобно съобщение, ако се опитам да го видя в SSMS, DBeaver или друг софтуер за управление на база данни с GUI.
Пример 2 – Функция с таблична стойност с множество изрази с криптиране
Ето TVF с множество изявления, който прави същото като предишната функция. TVF с много изявления имат различен синтаксис от вградените TVF. При TVF с множество изявления вие поставяте опцията за криптиране, след като посочите променливата за връщане.
СЪЗДАВАНЕ НА ФУНКЦИЯ [dbo].[udf_CatsByName_MSTVF]( @CatName varchar(70) ) ВРЪЩА @cats ТАБЛИЦА ( CatId int, CatName varchar(70), Phone varchar(10) ) С ШИФРИРАНЕASBEGIN INSERT INTO @catsNa SELECTme CatNa SELECTme , Телефон ОТ dbo.Cats WHERE CatName =@CatName; ВРЪЩАНЕ; КРАЙ; ОТПРАВИ
Пример 3 – Скаларна функция с криптиране
И ето пример за криптирана скаларна функция:
СЪЗДАВАНЕ НА ФУНКЦИЯ dbo.discountPrice( @price DECIMAL(12,2), @discount DECIMAL(12,2) ) ВРЪЩА DECIMAL (12,2) С ШИФИРАНЕASBEGIN RETURN @price * (1 - @discount);END;GO
Пример 4 – Добавете криптиране към съществуваща функция
Ако искате да шифровате съществуваща функция, използвайте ALTER FUNCTION
със същото определение. С други думи, мога да взема първия пример и да заменя CREATE
с ALTER
.
ALTER FUNCTION dbo.udf_CatsByName_ITVF( @CatName varchar(70) ) ВРЪЩА ТАБЛИЦА С ENCRYPTIONASRETURN ( ИЗБЕРЕТЕ CatId, CatName, Phone ОТ dbo.Cats WHERE CatName =@CatName );GO
Това очевидно предполага, че останалата част от дефиницията на функцията е точно същата като съществуващата функция.
Най-лесният начин да се уверите, че използвате същата дефиниция, е да използвате вашия GUI инструмент, за да скриптирате съществуващата функция, като използвате опцията „Script as Alter“, ако съществува. В противен случай можете да използвате „Script as Create“, след което, когато се появи дефиницията, променете CREATE
с ALTER
.
Ако имате само интерфейс на командния ред, можете да потърсите sys.sql_modules
преглед, за да получите съществуващата дефиниция (както в предишния пример). След това можете да копирате дефиницията и да замените CREATE
с ALTER
.
След като направите това, можете да добавите WITH ENCRYPTION
и го стартирайте отново.
Пример 5 – Добавяне на множество аргументи
Можете да посочите множество аргументи като разделен със запетая списък. Например, ако искате да използвате криптиране и искате да зададете обвързване на схемата, тогава ще трябва да ги добавите като списък, разделен със запетая.
СЪЗДАВАНЕ НА ФУНКЦИЯ dbo.udf_CatsByName_ITVF( @CatName varchar(70) ) ВРЪЩА ТАБЛИЦА С ОБВЪЗВАНЕ НА СХЕМИ, ВЪЗРАЩАНЕ НА ШИФРИРАНЕ ( ИЗБЕРЕТЕ CatId, CatName, Phone ОТ dbo.Cats WHERE CatName =GO);С други думи, вие посочвате само
WITH
веднъж – няма нужда да го повтаряте за всеки аргумент.Важни бележки
Ето някои неща, които трябва да знаете за криптирането на дефинирани от потребителя функции в SQL Server:
- Привилегированите потребители, които имат достъп до системни таблици през порта на DAC или пряк достъп до файловете на базата данни, все още ще могат да виждат (некриптирана) дефиниция на функцията.
- Потребителите, които могат да прикачат дебъгер към сървърния процес, могат да извличат оригиналната процедура от паметта по време на изпълнение.
- Използването на криптиране предотвратява публикуването на функцията като част от репликацията на SQL Server.
- Функциите на CLR не могат да бъдат шифровани.