W programie SQL Server można zaszyfrować procedurę składowaną w momencie jej tworzenia lub zmienić ją później, aby zawierała szyfrowanie.
Aby utworzyć procedurę składowaną za pomocą T-SQL, użyj CREATE PROCEDURE
składnia. Aby go zaszyfrować, dodaj WITH ENCRYPTION
argument.
Możesz również użyć tego samego argumentu do zaszyfrowania istniejącej procedury podczas korzystania z ALTER PROCEDURE
.
Podczas szyfrowania procedury składowanej w ten sposób tekst procedury jest konwertowany na format zaciemniony. Jego definicja nie jest bezpośrednio widoczna w żadnych widokach katalogowych. Dlatego definicja procedury nie może być przeglądana przez użytkowników, którzy nie mają dostępu do tabel systemowych ani plików baz danych.
Przykład 1 – Tworzenie zaszyfrowanej procedury przechowywanej
Oto przykład tworzenia zaszyfrowanej procedury składowanej.
CREATE PROCEDURE dbo.usp_GetCatsByName @catname varchar(70) WITH ENCRYPTION AS SELECT CatId, CatName, Phone FROM dbo.Cats WHERE CatName = @catname; GO
Część do zaszyfrowania to WITH ENCRYPTION
. Mógłbym po prostu usunąć ten argument, gdybym nie chciał go zaszyfrować.
Przykład 2 – Wyświetl wynik
Po utworzeniu tej procedury, teraz kiedy używam sp_helptext
procedura składowana, aby wyświetlić definicję procedury, otrzymuję komunikat, że jest zaszyfrowana.
EXEC sp_helptext 'usp_GetCatsByName';
Wynik:
The text for object 'usp_GetCatsByName' is encrypted.
A jeśli użyję sys.sql_modules
widok katalogu systemowego otrzymuję NULL.
SELECT definition FROM sys.sql_modules WHERE object_id = OBJECT_ID('dbo.usp_GetCatsByName');
Wynik:
+--------------+ | definition | |--------------| | NULL | +--------------+
Otrzymuję podobny wynik, niezależnie od tego, której metody T-SQL używam, aby uzyskać definicję procedury.
A oto komunikat o błędzie, który pojawia się w Azure Data Studio, gdy próbuję napisać procedurę:
No script was returned when scripting as Create on object StoredProcedure
Otrzymałbym podobny komunikat, gdybym spróbował wyświetlić go w SSMS, DBeaver lub innym oprogramowaniu do zarządzania bazą danych GUI.
Przykład 3 – Dodaj szyfrowanie do istniejącej procedury przechowywanej
Jeśli chcesz zaszyfrować istniejącą procedurę składowaną, użyj ALTER PROCEDURE
z tą samą definicją. Innymi słowy, mogę wziąć pierwszy przykład i zastąpić CREATE
z ALTER
.
ALTER PROCEDURE dbo.usp_GetCatsByName @catname varchar(70) WITH ENCRYPTION AS SELECT CatId, CatName, Phone FROM dbo.Cats WHERE CatName = @catname; GO
To oczywiście zakłada, że reszta definicji procedury jest dokładnie taka sama jak istniejąca.
Najprostszym sposobem na upewnienie się, że używasz tej samej definicji, jest użycie narzędzia GUI do skryptu istniejącej procedury za pomocą opcji „Skrypt jako zmiana”, jeśli istnieje. W przeciwnym razie możesz użyć „Skrypt jako Utwórz”, a gdy pojawi się definicja, zmień CREATE
z ALTER
.
Jeśli masz tylko interfejs wiersza poleceń, możesz wysłać zapytanie do sys.sql_modules
widok, aby uzyskać istniejącą definicję (jak w poprzednim przykładzie). Następnie możesz skopiować definicję i zastąpić CREATE
z ALTER
.
Gdy to zrobisz, możesz dodać WITH ENCRYPTION
i uruchom go ponownie.
Przykład 4 – Usuń szyfrowanie z procedury przechowywanej
Możemy usunąć szyfrowanie, uruchamiając ALTER PROCEDURE
oświadczenie bez opcji szyfrowania.
ALTER PROCEDURE dbo.usp_GetCatsByName @catname varchar(70) AS SELECT CatId, CatName, Phone FROM dbo.Cats WHERE CatName = @catname;
Zauważ, że to nie to samo, co odszyfrowanie procedury składowanej. Tutaj po prostu zmieniamy istniejącą procedurę do nowej definicji. Zakłada więc, że masz już kopię istniejącej procedury gdzieś w kontroli źródła.
Przykład 5 – Natywnie skompilowane procedury składowane
Szyfrowanie nie jest obsługiwane w natywnie skompilowanych procedurach składowanych.
Oto, co się dzieje, gdy próbuję zaszyfrować natywnie skompilowaną procedurę składowaną:
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;
Wynik:
Msg 10794, Level 16, State 17, Procedure usp_GetCowsByName, Line 3 The option 'ENCRYPTION' is not supported with natively compiled modules.
Ta przykładowa procedura została zaczerpnięta z mojego artykułu Jak utworzyć procedurę składowaną związaną ze schematem w SQL Server, w którym wyjaśniono również, że nie można również powiązać procedury składowanej ze schematem, jeśli nie jest to procedura skompilowana natywnie.
Ważne uwagi
Oto kilka rzeczy, które powinieneś wiedzieć o szyfrowaniu procedur składowanych w SQL Server:
- Uprawnieni użytkownicy, którzy mogą uzyskiwać dostęp do tabel systemowych przez port DAC lub bezpośrednio uzyskiwać dostęp do plików bazy danych, nadal będą mogli wyświetlać definicję procedury składowanej (niezaszyfrowanej).
- Użytkownicy, którzy mogą dołączyć debuger do procesu serwera, mogą pobrać oryginalną procedurę z pamięci w czasie wykonywania.
- Korzystanie z szyfrowania uniemożliwia opublikowanie procedury w ramach replikacji programu SQL Server.
- Procedury CLR nie mogą być szyfrowane.
- Procedury skompilowane natywnie nie mogą być szyfrowane.