Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Триггер со скалярными переменными  [new]
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]     Ответить | Цитировать Сообщить модератору
 Re: Триггер со скалярными переменными  [new]
Glory
Member

Откуда:
Сообщений: 104760
student12345
Вроде всё перекапала, не понимаю, помогите, пожалуйста.

Что будет если к кирпичам прибавить молоко ?
Что будет если к nvarchar(max) прибавить varbinary(max) ?
2 апр 15, 13:11    [17463984]     Ответить | Цитировать Сообщить модератору
 Re: Триггер со скалярными переменными  [new]
student12345
Member

Откуда:
Сообщений: 3
Glory,

я пробовала менять тип данных, это не помогло.
2 апр 15, 13:19    [17464039]     Ответить | Цитировать Сообщить модератору
 Re: Триггер со скалярными переменными  [new]
Glory
Member

Откуда:
Сообщений: 104760
student12345
я пробовала менять тип данных, это не помогло.

Меняйте пока не поможет
2 апр 15, 13:20    [17464048]     Ответить | Цитировать Сообщить модератору
 Re: Триггер со скалярными переменными  [new]
LexusR
Member

Откуда: Novosibirsk
Сообщений: 1887
а зачем вам динамический запрос в котором каша из внешних и внутренних переменных
я так понимаю что переменные @var,@var2 и @var3 должны быть декларированы внутри триггера а не снаружи

вы напишите снсчала статический тригер для одной таблицы а уж потом если у вас планируется какая-то супер пупер автоматизация создания тригеров для новых таблиц будете прикручивать динамику
2 апр 15, 13:24    [17464070]     Ответить | Цитировать Сообщить модератору
 Re: Триггер со скалярными переменными  [new]
o-o
Guest
student12345,

у кого пробовали-то?
вы собираете строку.
ВСЕ переменные, участвующие в сборке, должны быть строковыми.
в приведенном куске уже
declare @var2 varbinary(max)
declare @var3 varbinary(max)

а еще куча других переменных используется и вы не привели их описание
2 апр 15, 13:24    [17464071]     Ответить | Цитировать Сообщить модератору
 Re: Триггер со скалярными переменными  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31778
student12345
Создаю триггер, в котором при добавлении в таблицу данные будут шифроваться.
Вы создайте триггер руками, не начинайте с создания генератора. Тогда будут понятны проблемы, понятно, что вы хотите, понятно, какие будут ошибки, и тут вам быстрее подскажут.
student12345
Вроде всё перекапала, не понимаю, помогите, пожалуйста.
Я вот тоже не понимаю, что вы хотите.

Что у вас за пеерменная @var2 varbinary(max)?
Это имя поля, судя по 'set['+@var2+']=(select
Имя в виде байтов длинной до 2 миллиардов? :-)

В общем, напишите просто триггер, или, например, просто опишите словами, что у вас есть, и вы хотите получить.
2 апр 15, 13:40    [17464162]     Ответить | Цитировать Сообщить модератору
 Re: Триггер со скалярными переменными  [new]
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]     Ответить | Цитировать Сообщить модератору
 Re: Триггер со скалярными переменными  [new]
student12345
Member

Откуда:
Сообщений: 3
Спасибо всем за советы.
2 апр 15, 14:40    [17464558]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить