Хранение VARBINARY в столбце VARCHAR - PullRequest
0 голосов
/ 15 февраля 2019

Пожалуйста, введите этот код:

DECLARE @EncryptedPassword VARBINARY(8000) = ENCRYPTBYPASSPHRASE('ABCD','password')
DECLARE @Setting AS TABLE (ID INT, Value VARCHAR(MAX))

INSERT INTO @Setting VALUES (1, 'true')
INSERT INTO @Setting VALUES (2, @EncryptedPassword)

SELECT * FROM @Setting

@Setting таблица может содержать данные с несколькими типами данных.Как я вижу, это хранит ценность.Но не могу получить его, используя команду SELECT.Как мне этого добиться?

Ответы [ 3 ]

0 голосов
/ 15 февраля 2019

Как я уже говорил в комментариях, я настоятельно рекомендую вам повернуть таблицу настроек и перестать набирать текст с нуля:

DECLARE @EncryptedPassword VARBINARY(8000) = ENCRYPTBYPASSPHRASE('ABCD','password')
DECLARE @Setting AS TABLE (
    Lock char(1) not null default 'X' primary key check (Lock='X'),
    SomethingBoolean bit not null,
    Password varbinary(8000) not null)

INSERT INTO @Setting (SomethingBoolean, Password) VALUES
(1,@EncryptedPassword)

SELECT * FROM @Setting

Результаты:

Lock SomethingBoolean Password
---- ---------------- -----------------------------------------------------------------------------------------------------------
X    1                0x02000000588C2EB2C67DED10B7828C05500008DB1B1E53EFF63168EC607CA80CA2A1147B75F0A9D50F6B95C810D6DCED37AE8186

Это означаетчто настройки на самом деле сохраняются с правильным типом данных .Мы можем не только полагаться на проверки типа и нуля, чтобы гарантировать правильность настроек, мы также можем применять индивидуальные ограничения CHECK, если это необходимо для отдельных настроек.

(Lock только для того, чтобы эта таблица содержалаТолько 1 строка)

0 голосов
/ 15 февраля 2019

Вы можете просто добавить флаг шифрования:

DECLARE @EncryptPhrase NVARCHAR(100) = 'ABCD'

DECLARE @Setting AS TABLE (ID INT, Value NVARCHAR(MAX), IsEncrypted BIT)

INSERT INTO @Setting VALUES (1, 'true',  0)
INSERT INTO @Setting VALUES (2, ENCRYPTBYPASSPHRASE(@EncryptPhrase,N'password'), 1)

SELECT * FROM @Setting

SELECT 
ID
,CASE 
    WHEN IsEncrypted = 1 THEN CAST(DecryptByPassPhrase(@EncryptPhrase, CAST(Value AS VARBINARY(MAX))) as NVARCHAR(MAX)) 
    ELSE Value 
END
FROM @Setting
0 голосов
/ 15 февраля 2019

Попробуйте изменить структуру таблицы, и при получении значения DECRYPT попытайтесь преобразовать ее в столбец Varbinary Nvarchar.

...