Published on

July 19, 2023

Работа с зашифрованными хранимыми процедурами в SQL Server

Вы когда-нибудь сталкивались с зашифрованными хранимыми процедурами в вашей базе данных SQL Server? Если да, то вам, возможно, интересно, как с ними работать, особенно когда вам нужно поместить свой код в систему контроля версий (VCS) или получить код из рабочей среды. В этом блоге мы рассмотрим, как найти зашифрованные хранимые процедуры и предоставим сведения о расшифровке их.

Давайте начнем с рассмотрения примера сценария. Представьте, что у вас есть клиент, который хочет хранить свой код в системе контроля версий, но у них возникают проблемы, потому что некоторые из их процедур зашифрованы. Это шифрование было выполнено в прошлом, и текущему персоналу необходимо получить код из рабочей среды.

Чтобы проиллюстрировать это, давайте создадим две зашифрованные хранимые процедуры:

CREATE PROCEDURE EncryptedOne WITH ENCRYPTION AS
SELECT 1 AS One
GO

CREATE PROCEDURE EncryptedTwo WITH ENCRYPTION AS
BEGIN
    DECLARE @i INT = 1;
    WHILE @i < 100
    BEGIN
        SELECT @i = @i + 1
    END
    SELECT @i / 50
END

Если мы попытаемся сгенерировать скрипт этих процедур в SQL Server Management Studio (SSMS), мы столкнемся с ошибкой, указывающей, что текст процедуры равен NULL. Это происходит потому, что текст зашифрованных процедур хранится по-другому в представлениях системного каталога.

Чтобы найти зашифрованные процедуры, мы можем выполнить запрос к представлению каталога sys.procedures и использовать функцию OBJECTPROPERTY с параметром ‘IsEncrypted’:

SELECT name, OBJECTPROPERTY(object_id, 'IsEncrypted') AS Encrypted
FROM sys.procedures
WHERE OBJECTPROPERTY(object_id, 'IsEncrypted') = 1

Этот запрос вернет список зашифрованных процедур в вашей базе данных. Однако он не предоставит фактический код для этих процедур. Чтобы получить код, вы можете использовать функцию OBJECT_DEFINITION:

SELECT name, OBJECTPROPERTY(object_id, 'IsEncrypted') AS Encrypted, OBJECT_DEFINITION(object_id) AS Code
FROM sys.procedures
WHERE OBJECTPROPERTY(object_id, 'IsEncrypted') = 1

Выполнив этот запрос, вы получите набор результатов с именами, статусом шифрования и кодом зашифрованных процедур.

Важно отметить, что столбец code будет NULL для зашифрованных процедур. Фактический код хранится в представлении DMV sys.syscomments, к которому можно получить доступ с использованием другого подхода.

Имея эти знания, вы теперь можете определить и найти зашифрованные хранимые процедуры в вашей базе данных SQL Server. В будущих блогах мы рассмотрим, как расшифровать эти процедуры и обсудим, как инструменты, такие как Flyway, могут помочь в управлении зашифрованным кодом.

Помните, что разбиение сложных тем на более мелкие, фокусированные посты может быть отличным способом делиться знаниями и взаимодействовать с сообществом SQL Server. Так что не стесняйтесь начать свой собственный блогинговый путь как #SQLNewBlogger!

Спасибо за чтение, и оставайтесь на связи для получения больше советов и трюков по SQL Server!

Click to rate this post!
[Total: 0 Average: 0]

Let's work together

Send us a message or book free introductory meeting with us using button below.