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.