sql >> Databáze >  >> RDS >> Sqlserver

Jak zašifrovat uživatelem definovanou funkci na serveru SQL Server

Při vytváření uživatelsky definované funkce v SQL Serveru máte možnost ji zašifrovat.

Chcete-li vytvořit uživatelsky definovanou funkci pomocí T-SQL, použijte CREATE FUNCTION syntax. Chcete-li jej zašifrovat, přidejte WITH ENCRYPTION argument.

Stejný argument můžete také použít k zašifrování existující funkce při použití ALTER FUNCTION .

Když tímto způsobem zašifrujete uživatelem definovanou funkci, text funkce se převede do zatemněného formátu. Definice funkce není přímo viditelná v žádném zobrazení katalogu. Proto definici funkce nemohou zobrazit uživatelé, kteří nemají přístup k systémovým tabulkám nebo databázovým souborům.

Příklad 1 – Inline Table-Valued funkce se šifrováním

Zde je příklad vytvoření šifrované uživatelsky definované funkce s hodnotou tabulky.

VYTVOŘIT FUNKCI dbo.udf_CatsByName_ITVF( @CatName varchar(70) ) VRÁTÍ TABULKU SE ŠIFROVÁNÍMASRETURN ( SELECT CatId, CatName, Phone FROM dbo.Cats WHERE CatName =@CatName );GO

Část pro šifrování je WITH ENCRYPTION . Mohl bych tento argument jednoduše odstranit, pokud bych jej nechtěl šifrovat.

Po vytvoření této funkce nyní, když používám sys.sql_modules zobrazení systémového katalogu pro zobrazení jeho definice, dostanu NULL.

SELECT definice FROM sys.sql_modulesWHERE object_id =OBJECT_ID('udf_CatsByName_ITVF');

Výsledek:

+---------------+| definice ||---------------|| NULL |+--------------+

A tady je chybová zpráva, kterou dostávám v Azure Data Studio, když se pokouším skriptovat funkci:

Při skriptování jako Create on object UserDefinedFunction nebyl vrácen žádný skript

A podobnou zprávu bych dostal, kdybych se ji pokusil zobrazit v SSMS, DBeaver nebo jiném softwaru pro správu databází GUI.

Příklad 2 – Multi-Statement Table-Valued Function se šifrováním

Zde je vícepříkazová TVF, která funguje stejně jako předchozí funkce. Vícepříkazové TVF mají jinou syntaxi než vložené TVF. Na Multi-Statement TVFs vložíte možnost šifrování po zadání návratové proměnné.

VYTVOŘTE FUNKCI [dbo].[udf_CatsByName_MSTVF]( @CatName varchar(70) ) VRÁTÍ @cats TABLE ( CatId int, CatName varchar(70), Phone varchar(10) ) SE ŠIFROVÁNÍMBEGIN INSERT INTO CatIds Cats, Cats , Telefon OD dbo.Cats WHERE CatName =@CatName; RETURN;END;GO

Příklad 3 – Skalární funkce se šifrováním

A zde je příklad zašifrované skalární funkce:

VYTVOŘIT FUNKCI dbo.discountPrice( @price DECIMAL(12,2), @discount DECIMAL(12,2) ) VRÁCENÍ DESETINNÉ (12,2) SE ŠIFROVÁNÍZAČÁTEK NÁVRAT @price * (1 - @sleva);KONEC;GO 

Příklad 4 – Přidání šifrování ke stávající funkci

Pokud chcete zašifrovat existující funkci, použijte ALTER FUNCTION se stejnou definicí. Jinými slovy, mohu vzít první příklad a nahradit CREATE pomocí ALTER .

ALTER FUNCTION dbo.udf_CatsByName_ITVF( @CatName varchar(70) ) VRÁTÍ TABULKU SE ŠIFROVÁNÍMASRETURN ( SELECT CatId, CatName, Phone FROM dbo.Cats WHERE CatName =@CatName );GO

To samozřejmě předpokládá, že zbytek definice funkce je přesně stejný jako existující funkce.

Nejjednodušší způsob, jak zajistit, že používáte stejnou definici, je použít váš nástroj GUI ke skriptování existující funkce pomocí možnosti „Script as Alter“, pokud existuje. V opačném případě můžete použít „Script as Create“, a když se objeví definice, změňte CREATE pomocí ALTER .

Pokud máte pouze rozhraní příkazového řádku, můžete se zeptat na sys.sql_modules zobrazit, abyste získali existující definici (jako v předchozím příkladu). Poté můžete zkopírovat definici a nahradit CREATE pomocí ALTER .

Jakmile to uděláte, můžete přidat WITH ENCRYPTION a spusťte jej znovu.

Příklad 5 – Přidání více argumentů

Můžete zadat více argumentů jako seznam oddělený čárkami. Pokud například chcete použít šifrování a chcete určit vazbu schématu, pak byste je museli přidat jako seznam oddělený čárkami.

VYTVOŘIT FUNKCI dbo.udf_CatsByName_ITVF( @CatName varchar(70) ) VRÁTÍ TABULKU SE SCHEMABINDING, ENCRYPTIONASRETURN ( SELECT CatId, CatName, Phone FROM dbo.Cats WHERE CatName =@preCatNa) 

Jinými slovy, zadáte pouze WITH jednou – není třeba to opakovat pro každý argument.

Důležité poznámky

Zde je několik věcí, které byste měli vědět o šifrování uživatelsky definovaných funkcí v SQL Server:

  • Privilegovaní uživatelé, kteří mohou přistupovat k systémovým tabulkám přes port DAC nebo přímo přistupovat k databázovým souborům, budou i nadále moci zobrazit (nešifrovanou) definici funkce.
  • Uživatelé, kteří mohou k procesu serveru připojit ladicí program, mohou za běhu načíst původní proceduru z paměti.
  • Použití šifrování zabrání publikování funkce jako součásti replikace SQL Server.
  • Funkce CLR nelze šifrovat.

  1. Jak nastavit aktuální jazyk v SQL Server (T-SQL)

  2. Jak získat aktuální datum v PostgreSQL

  3. Jak se dotazovat na hodnoty z xml uzlů?

  4. Rozdíl mezi BYTE a CHAR v datových typech sloupců