Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Триггер на изменение одной базы при добавлении записи в другую  [new]
Vitaly_l1
Member

Откуда:
Сообщений: 12
Извините за простой наверное вопрос. Собираю данные из контроллеров станков. Служебная программа пишет в базу SQL 2014. Мне необходимо при добавлении записи в одну базу изменять запись в другой.
база tsdop - это база в которую пишет программа агент только добавлением
num_IP nchar(4) это адрес машины например 5A3F это IP адрес 90.63 - 63 узел в сети
дальше например cycle это время цикла машины он float например 176947200
и тд.
база ts - это база в которую триггер должен писать информацию с изменением некоторых значений
num_IP nchar(4) это адрес машины например 5A3F это IP адрес 90.63 - 63 узел в сети это то что свяжет эти две базы
cycle это цикл из базы tsdop/10000000 в данном случае 17.6947200
В идеале после изменения записи в ts удалить эту запись из tsdop. вот что я написал но не работает

USE [PB]
GO
/****** Object: Trigger [dbo].[MyTrigger] Script Date: 20.06.2017 12:06:49 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER TRIGGER [dbo].[MyTrigger]
ON [dbo].[tsdop]
AFTER INSERT
AS
BEGIN
UPDATE ts SET cycle = inserted.cycle/10000000
FROM 
inserted 
JOIN tsdop ON inserted.num_IP = tsdop.num_IP 
LEFT JOIN ts ON inserted.num_IP = tsdop.num_IP
END

Подскажите пожалуйста я нашел на форуме но не могу дальше двинуться не работает.

Сообщение было отредактировано: 20 июн 17, 12:39
20 июн 17, 12:34    [20577070]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на изменение одной базы при добавлении записи в другую  [new]
Vitaly_l1
Member

Откуда:
Сообщений: 12
Немного неправильно в заголовке написал нужно при добавлении записи в базе TSDOP менять строку в TS. И в идеале удалять строку из TSDOP
ALTER TRIGGER [dbo].[MyTrigger]
ON [dbo].[tsdop]
FOR INSERT
AS
BEGIN
UPDATE ts SET cycle = i.cycle/10000000
FROM ts JOIN inserted i
ON i.num_IP = ts.num_IP
END

Изменил ругается на эту переменную ts.num_IP в предпоследней строке
20 июн 17, 13:13    [20577191]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на изменение одной базы при добавлении записи в другую  [new]
Rankatan
Member

Откуда:
Сообщений: 250
TSDOP ts это таблицы в базе.

ALTER TRIGGER [dbo].[MyTrigger]
ON [dbo].[tsdop]
FOR INSERT
AS
BEGIN
	UPDATE ts SET cycle = i.cycle/10000000
	FROM ts JOIN inserted i
	ON i.num_IP = ts.num_IP
END


Должен работать, ошибки в написании нет.
20 июн 17, 13:31    [20577288]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на изменение одной базы при добавлении записи в другую  [new]
Vitaly_l1
Member

Откуда:
Сообщений: 12
Да виноват таблица TS была пустая. Можно ли как-то удалить запись из TSDOP после изменения TS ?
20 июн 17, 13:39    [20577325]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на изменение одной базы при добавлении записи в другую  [new]
Rankatan
Member

Откуда:
Сообщений: 250
CREATE TRIGGER [dbo].[MyTrigger2]
ON [dbo].[ts]
FOR DELETE,UPDATE
AS
BEGIN
	delete tsdop 
	FROM tsdop JOIN inserted i
	ON i.num_IP = tsdop.num_IP
END
20 июн 17, 13:44    [20577353]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на изменение одной базы при добавлении записи в другую  [new]
Rankatan
Member

Откуда:
Сообщений: 250
вернее

CREATE TRIGGER [dbo].[MyTrigger2]
ON [dbo].[ts]
FOR DELETE,UPDATE
AS
BEGIN
	delete tsdop 
	FROM tsdop JOIN deleted d
	ON d.num_IP = tsdop.num_IP
END
20 июн 17, 13:45    [20577362]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на изменение одной базы при добавлении записи в другую  [new]
Vitaly_l1
Member

Откуда:
Сообщений: 12
Но мне надо удалять запись в tsdop после успешного обновления данных в ts
20 июн 17, 14:32    [20577586]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на изменение одной базы при добавлении записи в другую  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Vitaly_l1,

а вам как написали?
20 июн 17, 14:41    [20577630]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на изменение одной базы при добавлении записи в другую  [new]
Vitaly_l1
Member

Откуда:
Сообщений: 12
Этот код надо вставить в тело предыдущего триггера или сделать его отдельно. Если отдельно то по какому событию он будет запускаться ?
20 июн 17, 14:57    [20577688]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на изменение одной базы при добавлении записи в другую  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Vitaly_l1
по какому событию он будет запускаться ?
ON [dbo].[ts] FOR DELETE,UPDATE
20 июн 17, 14:58    [20577693]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на изменение одной базы при добавлении записи в другую  [new]
Vitaly_l1
Member

Откуда:
Сообщений: 12
в ts ничего не добавляется я руками создаю там несколько строчек по количеству станков для мониторинга их текущего состояния.
А писать туда надо будет из базы tsdop в которую пишут непосредственно станки о себе. Но станки не могут сами искать и изменять информацию они могут только добавлять в базу. Вот я и хочу использовать её как буферную. После сброса данных со станка переписывать строку состояния конкретного станка в ts и удалять строку из tsdop. Удалять всю базу... не знаю насколько это корректно, не зацепит строки из других станков. Извините мою невысокую компетентность в SQL. И ещё вопрос какая функция переводит nchar в char ?
20 июн 17, 15:06    [20577731]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на изменение одной базы при добавлении записи в другую  [new]
Vitaly_l1
Member

Откуда:
Сообщений: 12
Да работает нормально. Действительно удаляет всё корректно. по nchar подскажите пожалуйста
20 июн 17, 15:15    [20577781]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на изменение одной базы при добавлении записи в другую  [new]
Rankatan
Member

Откуда:
Сообщений: 250
CREATE TRIGGER [dbo].[MyTrigger3]
ON [dbo].[tsdop]
INSTEAD OF insert
AS
BEGIN
	MERGE dbo.ts as Target 
	USING inserted as Source
	ON Target.num_IP=Source.num_IP
	WHEN MATCHED THEN 
		UPDATE SET Target.cycle=Source.cycle/10000000
	WHEN NOT MATCHED THEN 
		insert(num_IP,cycle) VALUES(Source.num_IP,Source.cycle/10000000)
END


Мне кажется тебе вот такой триггер нужен. Т.е. когда данные приходят в tsdop они не попадают в tsdop, а сразу помещаются в ts

--конвертация вот так
select cast(clm as nchar(4000))
20 июн 17, 15:28    [20577835]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на изменение одной базы при добавлении записи в другую  [new]
Rankatan
Member

Откуда:
Сообщений: 250
только там еще точку с запятой нужно добавить в самом конце
insert(num_IP,cycle) VALUES(Source.num_IP,Source.cycle/10000000);


+ удалить уже созданные триггеры (чтобы не мешали)
20 июн 17, 15:33    [20577844]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на изменение одной базы при добавлении записи в другую  [new]
Vitaly_l1
Member

Откуда:
Сообщений: 12
Последний вариант думаю вообще круто попробую хотя и предыдущий даёт нужный результат.
По переводу в станке данные тэга в HEX коде хранятся в SQL их принимает nchar(4). Нужно при формировании ts преобразовать их из nchar(4) в char(2). Например 4A50 перевести в JP
20 июн 17, 15:41    [20577869]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на изменение одной базы при добавлении записи в другую  [new]
Rankatan
Member

Откуда:
Сообщений: 250
declare @nchar nchar(4)= '4A50'

SELECT cast(CONVERT(VARBINARY(25), '0x'+@nchar, 1) as char)
20 июн 17, 15:51    [20577912]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на изменение одной базы при добавлении записи в другую  [new]
aleks2
Guest
Не, фсе так увлеклись написанием триггеров, что я ажно стисняюсь спросить:

А зачем ваще этот цирк с триггерами?

В чем цимес сего перекладывания из пустого в порожнее?
20 июн 17, 15:53    [20577929]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на изменение одной базы при добавлении записи в другую  [new]
Vitaly_l1
Member

Откуда:
Сообщений: 12
Попытался при помощи этих преобразований из HEX писать сразу в char() агент ошибку даёт.

ProDbw:Action1: ERR No = -2147467259, [Microsoft][ODBC SQL Server Driver][SQL Server]Символьные или двоичные данные могут быть усечены.

ALTER TRIGGER [dbo].[MyTrigger1]
ON [dbo].[tsdop]
FOR INSERT
AS
BEGIN
UPDATE ts SET cycle = i.cycle/10000000 , date=getdate(), kol_need=i.kol_need ,
sdelano=i.sdelano , cav=i.cav, sost=i.sost, bph=i.bph,
prod=cast(CONVERT(VARBINARY(25), '0x'+i.prod1, 1) as char)+cast(CONVERT(VARBINARY(25), '0x'+i.prod2, 1) as char)+cast(CONVERT(VARBINARY(25), '0x'+i.prod3, 1) as char)+cast(CONVERT(VARBINARY(25), '0x'+i.prod4, 1) as char)+cast(CONVERT(VARBINARY(25), '0x'+i.prod5, 1) as char)+cast(CONVERT(VARBINARY(25), '0x'+i.prod6, 1) as char)+cast(CONVERT(VARBINARY(25), '0x'+i.prod7, 1) as char)
FROM ts JOIN inserted i
ON i.num_IP = ts.num_IP
END
Тут 7 ячеек по 2 символа хочу преобразовать и записать сразу в char(20) хотя они и получаются char(14)
20 июн 17, 16:22    [20578031]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на изменение одной базы при добавлении записи в другую  [new]
Rankatan
Member

Откуда:
Сообщений: 250
попробуй так

ALTER TRIGGER [dbo].[MyTrigger1]
ON [dbo].[tsdop]
FOR INSERT
AS
BEGIN
	UPDATE ts 
	SET cycle = i.cycle/10000000 , date=getdate(), kol_need=i.kol_need ,
	sdelano=i.sdelano , cav=i.cav, sost=i.sost, bph=i.bph,
	prod=CAST(cast(CONVERT(VARBINARY(4), '0x'+i.prod1, 1) as char)
		+cast(CONVERT(VARBINARY(4), '0x'+i.prod2, 1) as char)
		+cast(CONVERT(VARBINARY(4), '0x'+i.prod3, 1) as char)
		+cast(CONVERT(VARBINARY(4), '0x'+i.prod4, 1) as char)
		+cast(CONVERT(VARBINARY(4), '0x'+i.prod5, 1) as char)
		+cast(CONVERT(VARBINARY(4), '0x'+i.prod6, 1) as char)
		+cast(CONVERT(VARBINARY(4), '0x'+i.prod7, 1) as char) as char(20))
	FROM ts 
	JOIN inserted i
		ON i.num_IP = ts.num_IP
END
20 июн 17, 16:30    [20578059]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на изменение одной базы при добавлении записи в другую  [new]
Rankatan
Member

Откуда:
Сообщений: 250
плюс еще замени везде char на char(2)
20 июн 17, 16:31    [20578063]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на изменение одной базы при добавлении записи в другую  [new]
Vitaly_l1
Member

Откуда:
Сообщений: 12
Большое спасибо за помощь
20 июн 17, 16:53    [20578145]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на изменение одной базы при добавлении записи в другую  [new]
Vitaly_l1
Member

Откуда:
Сообщений: 12
Ещё вопрос. теперь в одну из баз надо добавлять запись из временной таблицы. Где ошибка. База сhange в которую надо добавить а changedop из которой надо добавить.
create TRIGGER [dbo].[Trigger_change1]
ON [dbo].[changedop]
FOR INSERT
AS
BEGIN
insert into change (param,date,old_value,new_value,list_param,num_IP,prod) VALUES
(i.param , getdate(), i.old_value/10 , i.new_value/10 , i.list_param , i.num_IP,CAST(cast(CONVERT(VARBINARY(4), '0x'+i.prod1, 1) as char(2))
+cast(CONVERT(VARBINARY(4), '0x'+i.prod2, 1) as char(2))
+cast(CONVERT(VARBINARY(4), '0x'+i.prod3, 1) as char(2))
+cast(CONVERT(VARBINARY(4), '0x'+i.prod4, 1) as char(2))
+cast(CONVERT(VARBINARY(4), '0x'+i.prod5, 1) as char(2))
+cast(CONVERT(VARBINARY(4), '0x'+i.prod6, 1) as char(2))
+cast(CONVERT(VARBINARY(4), '0x'+i.prod7, 1) as char(2)) as char(14)))
FROM inserted i
END
27 июн 17, 15:39    [20594202]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на изменение одной базы при добавлении записи в другую  [new]
Vitaly_l1
Member

Откуда:
Сообщений: 12
insert into change (param,date,old_value,new_value,list_param,num_IP,prod)
SELECT i.param , getdate(), i.old_value/10 , i.new_value/10 , i.list_param , i.num_IP,CAST(cast(CONVERT(VARBINARY(4), '0x'+i.prod1, 1) as char(2))
+cast(CONVERT(VARBINARY(4), '0x'+i.prod2, 1) as char(2))
+cast(CONVERT(VARBINARY(4), '0x'+i.prod3, 1) as char(2))
+cast(CONVERT(VARBINARY(4), '0x'+i.prod4, 1) as char(2))
+cast(CONVERT(VARBINARY(4), '0x'+i.prod5, 1) as char(2))
+cast(CONVERT(VARBINARY(4), '0x'+i.prod6, 1) as char(2))
+cast(CONVERT(VARBINARY(4), '0x'+i.prod7, 1) as char(2)) as char(14))
FROM inserted i
так работает немного странно что в таблицу changedop ничего не пишет но мне это и надо
27 июн 17, 16:34    [20594461]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить