1

Мне нужно создать хранимую процедуру, которая позволяет нашему хранителю пароля воссоздать симметричный ключ в нашей базе данных , но почему-то он всегда жалуется на неправильный синтаксис. Разрешено ли это в SQL Server 2008 R2 или это просто неправильный синтаксис? БлагодаряШифрование SQL Server: создание ключа внутри хранимой процедуры

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

ALTER PROCEDURE [dbo].[sp_BCPRecreateEncryption] 
    @Password varchar(255) 
AS 
BEGIN 
    DROP SYMMETRIC KEY SymmetricKeyName 
    DROP CERTIFICATE EncryptCert 
    DROP MASTER KEY 

    CREATE MASTER KEY ENCRYPTION BY PASSWORD = @Password 

    CREATE CERTIFICATE EncryptCert 
     WITH SUBJECT = N'EncryptCert', START_DATE = N'08/06/2014 07:16:08', EXPIRY_DATE = N'08/06/2042 07:16:08' 
     ACTIVE FOR BEGIN_DIALOG = ON; 

    CREATE SYMMETRIC KEY SymmetricKeyName 
     WITH KEY_SOURCE = @Password, 
       IDENTITY_VALUE = @Password, 
      ALGORITHM = AES_256 
     ENCRYPTION BY CERTIFICATE EncryptCert; 
END 

Я также попытался использовать executesql, но все еще получаю ту же ошибку

DECLARE @ParmDefinition nvarchar(500); 
SET @ParmDefinition = N'@Password string' ; 

EXECUTE sp_executesql N'CREATE MASTER KEY ENCRYPTION BY PASSWORD = @DCMPassword', @ParmDefinition , @[email protected] 

отредактирован Ошибка добавления:

Msg 102, Level 15, State 1, процедура sp_BCPRecreateEncryption, Строка 13
Неверный синтаксис рядом с «@Password».

Msg 102, уровень 15, состояние 1, процедура sp_BCPRecreateEncryption, строка 20
Неверный синтаксис рядом с «@Password».

+0

пожалуйста, напишите точную ошибку –

+0

'string' не является допустимым SQL тип данных ;-) –

+0

Похоже, параметры не поддерживаются для этого. Вы можете попробовать создать всю литеральную строку и выполнить эту строку с помощью 'EXEC', но вам нужно будет следить за любыми символами' '' в пароле –

ответ

1

Основная проблема заключается в том, что вы не можете использовать переменные для установки паролей; они должны быть строковыми литералами. Если вы посмотрите на страницу MSDN всего за CREATE MASTER KEY, вы заметите, что нет опции для передачи локальной переменной для password. Документация для CREATE SYMMETRIC KEY также показывает, что для KEY_SOURCE и IDENTITY_VALUE действительны только строковые литералы.

Вторая проблема с попыткой исправить через Dynamic SQL заключается в том, что string не является допустимым типом данных.

Если вы хотите получить значение из входного параметра хранимой процедуры, вам нужно будет объединить это значение в динамический SQL. Обязательно сначала выполните санацию для одиночных кавычек ;-), чтобы избежать проблем с SQL-инъекциями.

SET @Password = REPLACE(@Password, N'''', N''''''); 

DECLARE @SQL NVARCHAR(MAX) = N' 
    CREATE MASTER KEY ENCRYPTION BY PASSWORD = ''' 
    + @Password 
    + N''';'; 

EXEC(@SQL); 
1

Вы можете попытаться создать переменную @sql с заполнителями, а затем использовать REPLACE заполнить их.

Этот подход немного лучше по сравнению конкатенации, потому что меньше двойной и четырехъядерный - ':

DECLARE @sql NVARCHAR(MAX) = 
    N'CREATE MASTER KEY ENCRYPTION BY PASSWORD = ''@DCMPassword'''; 

SELECT @sql = REPLACE(@sql, '@DCMPassword', @Password); 

EXEC(@sql);