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

Как да шифровате дефинирана от потребителя функция в SQL Server

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

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Нулева застой на SQL по дизайн - някакви модели на кодиране?

  2. DATETIMEOFFSETFROMPARTS() Примери в SQL Server (T-SQL)

  3. Как да създадете уникално ограничение за колона за вече съществуваща таблица - SQL Server / TSQL урок, част 97

  4. Грешка при преобразуване на данни за групово зареждане (несъответствие на типа или невалиден знак за посочената кодова страница) за ред 1, колона 4 (Година)

  5. Неуспешна JDBC връзка, грешка:TCP/IP връзката с хост неуспешна