Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Jak zaszyfrować procedurę składowaną w SQL Server

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.

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Rozwiązywanie problemów podczas pracy z datą i godziną w SQL Server

  2. Zapytanie o liczbę rekordów w każdej tabeli w bazie danych

  3. Konwertuj „datetime2” na „date” w SQL Server (przykłady T-SQL)

  4. Jak uzyskać ciąg połączenia z bazy danych

  5. W SQL Server, jak mogę znaleźć wszędzie, gdzie występuje odwołanie do kolumny?