Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
student12345 Member Откуда: Сообщений: 3 |
Создаю триггер, в котором при добавлении в таблицу данные будут шифроваться. Ошибка такая: " Типы данных nvarchar(max) и varbinary(max) в операторе add несовместимы. " Вроде всё перекапала, не понимаю, помогите, пожалуйста. declare @trigname varchar(20) set @trigname=@new_tname+'T' declare @var nvarchar(max) declare @var2 varbinary(max) declare @var3 varbinary(max) declare @sqlv2 nvarchar(max) set @sqlv2=N'create trigger['+@trigname+ ']on['+ @view + ']instead of insert, update as begin open symmetric key['+@keyname+ ']decryption by password=['+@passw+'] DECLARE klient_cursor CURSOR GLOBAL SCROLL KEYSET FOR SELECT column_name FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME=['+@syst+'] OPEN klient_cursor WHILE @@FETCH_STATUS = 0 begin FETCH NEXT FROM klient_cursor INTO '+@var+ 'set['+@var2+']=(select convert(varbinary(max),'+@var+') from inserted) set['+ @var3+']=ENCRYPTBYKEY(Key_GUID(['+@keyname+']),['+@var2+']) insert into ['+@view+'](['+@var+']) values (['+@var3+']) end CLOSE klient_cursor DEALLOCATE klient_cursor' exec SP_EXECUTESQL @sqlv2 end |
2 апр 15, 13:07 [17463938] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104760 |
Что будет если к кирпичам прибавить молоко ? Что будет если к nvarchar(max) прибавить varbinary(max) ? |
||
2 апр 15, 13:11 [17463984] Ответить | Цитировать Сообщить модератору |
student12345 Member Откуда: Сообщений: 3 |
Glory, я пробовала менять тип данных, это не помогло. |
2 апр 15, 13:19 [17464039] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104760 |
Меняйте пока не поможет |
||
2 апр 15, 13:20 [17464048] Ответить | Цитировать Сообщить модератору |
LexusR Member Откуда: Novosibirsk Сообщений: 1887 |
а зачем вам динамический запрос в котором каша из внешних и внутренних переменных я так понимаю что переменные @var,@var2 и @var3 должны быть декларированы внутри триггера а не снаружи вы напишите снсчала статический тригер для одной таблицы а уж потом если у вас планируется какая-то супер пупер автоматизация создания тригеров для новых таблиц будете прикручивать динамику |
2 апр 15, 13:24 [17464070] Ответить | Цитировать Сообщить модератору |
o-o
Guest |
student12345, у кого пробовали-то? вы собираете строку. ВСЕ переменные, участвующие в сборке, должны быть строковыми. в приведенном куске уже declare @var2 varbinary(max) declare @var3 varbinary(max) а еще куча других переменных используется и вы не привели их описание |
2 апр 15, 13:24 [17464071] Ответить | Цитировать Сообщить модератору |
alexeyvg Member Откуда: Moscow Сообщений: 31778 |
Что у вас за пеерменная @var2 varbinary(max)? Это имя поля, судя по 'set['+@var2+']=(select Имя в виде байтов длинной до 2 миллиардов? :-) В общем, напишите просто триггер, или, например, просто опишите словами, что у вас есть, и вы хотите получить. |
||||
2 апр 15, 13:40 [17464162] Ответить | Цитировать Сообщить модератору |
LexusR Member Откуда: Novosibirsk Сообщений: 1887 |
информация к размышлениюif OBJECT_ID('dbo._TestEncryption') is not null drop table dbo._TestEncryption create table dbo._TestEncryption(id int not null primary key identity(1,1),EncryptionName varbinary(100)) GO if OBJECT_ID('dbo.vw_TestEncryption') is not null drop view dbo.vw_TestEncryption GO CREATE VIEW vw_TestEncryption AS select id, EncryptionName from dbo._TestEncryption GO CREATE SYMMETRIC KEY TestEncryption WITH ALGORITHM = AES_256 ENCRYPTION BY PASSWORD = 'Test_Password_256' GO create trigger Insert__TestEncryption on dbo._TestEncryption instead of insert, update as begin OPEN SYMMETRIC KEY TestEncryption DECRYPTION BY PASSWORD = 'Test_Password_256'; UPDATE d SET EncryptionName = EncryptByKey(Key_GUID('TestEncryption'),I.EncryptionName) from INSERTED I JOIN dbo._TestEncryption D ON d.ID = I.ID IF NOT EXISTS(SELECT * FROM DELETED) INSERT INTO dbo._TestEncryption(EncryptionName) SELECT EncryptByKey(Key_GUID('TestEncryption'),I.EncryptionName) from INSERTED I CLOSE SYMMETRIC KEY TestEncryption end GO insert into vw_TestEncryption (EncryptionName) select cast('one' as varbinary(100)) union select cast('two' as varbinary(100)) select * from dbo._TestEncryption OPEN SYMMETRIC KEY TestEncryption DECRYPTION BY PASSWORD = 'Test_Password_256'; SELECT ID ,EncryptionName ,CONVERT(varchar(50), DecryptByKey(EncryptionName))AS DecryptedName FROM dbo._TestEncryption CLOSE SYMMETRIC KEY TestEncryption DROP SYMMETRIC KEY TestEncryption |
2 апр 15, 14:31 [17464489] Ответить | Цитировать Сообщить модератору |
student12345 Member Откуда: Сообщений: 3 |
Спасибо всем за советы. |
2 апр 15, 14:40 [17464558] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |