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

Jak zašifrovat uloženou proceduru na serveru SQL Server

Na serveru SQL Server můžete zašifrovat uloženou proceduru v okamžiku, kdy ji vytvoříte, nebo ji můžete později upravit tak, aby zahrnovala šifrování.

Chcete-li vytvořit uloženou proceduru pomocí T-SQL, použijte CREATE PROCEDURE syntax. Chcete-li jej zašifrovat, přidejte WITH ENCRYPTION argument.

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

Když takto zašifrujete uloženou proceduru, text procedury se převede do zastřeného formátu. Jeho definice není přímo viditelná v žádném zobrazení katalogu. Definici procedury proto nemohou zobrazit uživatelé, kteří nemají přístup k systémovým tabulkám nebo databázovým souborům.

Příklad 1 – Vytvoření šifrované uložené procedury

Zde je příklad vytvoření šifrované uložené procedury.

CREATE PROCEDURE dbo.usp_GetCatsByName @catname varchar(70)
WITH ENCRYPTION
AS
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.

Příklad 2 – Zobrazení výsledku

Po vytvoření této procedury nyní, když používám sp_helptext uložená procedura pro zobrazení definice procedury Zobrazuje se mi zpráva, že je zašifrována.

EXEC sp_helptext 'usp_GetCatsByName';

Výsledek:

The text for object 'usp_GetCatsByName' is encrypted.

A pokud použiji sys.sql_modules zobrazení systémového katalogu dostanu NULL.

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

Výsledek:

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

Dostávám podobný výsledek, bez ohledu na to, kterou metodu T-SQL použiji, abych se pokusil získat definici procedury.

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

No script was returned when scripting as Create on object StoredProcedure

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 3 – Přidání šifrování do existující uložené procedury

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

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

GO

To samozřejmě předpokládá, že zbytek definice postupu je přesně stejný jako ten stávající.

Nejjednodušší způsob, jak zajistit, že používáte stejnou definici, je použít nástroj GUI ke skriptování existující procedury 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 4 – Odebrání šifrování z uložené procedury

Šifrování můžeme odstranit spuštěním ALTER PROCEDURE výpis bez možnosti šifrování.

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

Všimněte si, že to není totéž jako dešifrování uložené procedury. Zde jednoduše měníme stávající postup na novou definici. Předpokládá se tedy, že již máte kopii stávající procedury někde ve svém zdrojovém ovládacím prvku.

Příklad 5 – Nativně kompilované uložené procedury

Šifrování není podporováno u nativně kompilovaných uložených procedur.

Když se pokusím zašifrovat nativně zkompilovanou uloženou proceduru, stane se toto:

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;

Výsledek:

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

Tento příklad postupu je převzat z mého článku Jak vytvořit uloženou proceduru vázanou na schéma na serveru SQL Server, který také vysvětluje, že uloženou proceduru nelze svázat se schématem, pokud se nejedná o nativně zkompilovanou proceduru.

Důležité poznámky

Zde je několik věcí, které byste měli vědět o šifrování uložených procedur na serveru SQL:

  • 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 prohlížet definici uložené procedury (nešifrovanou).
  • 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í tomu, aby byla procedura publikována jako součást replikace SQL Server.
  • Procedury CLR nelze šifrovat.
  • Nativně zkompilované procedury nelze zašifrovat.

  1. Jak nakonfiguruji HikariCP pro postgresql?

  2. Jak stáhnout a nainstalovat nástroje SQLite

  3. PL/SQL ORA-01422:Přesné načtení vrátí více než požadovaný počet řádků

  4. Chyby:Příkaz INSERT EXEC nelze vnořit. a Nelze použít příkaz ROLLBACK v příkazu INSERT-EXEC. jak to vyřešit?