Вы когда-нибудь сталкивались с зашифрованными хранимыми процедурами в вашей базе данных 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!