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

Откуда: Российская Федерация
Сообщений: 105
При изменении в таблице Workstation_Fields UDF_CHAR1 значения записать старое значение в status_old, а новое в status_new, также время записи и имя.
В нижеприведенном примере записывает все данные, которые удовлетворяю условию. Необходимо записать только измененные.

В триггер записан код:
update Workstation_Fields_LIC_PO SET  name=RESOURCES.resourcename,
 									  time=(select datediff(ss, '01/01/1970', getdate()) as theTimestamp),
                                      status_old='Нет',
                                      status_new='Да'
FROM RESOURCES
LEFT JOIN ResourceOwner ON RESOURCES.RESOURCEID=ResourceOwner.RESOURCEID 
LEFT JOIN Workstation_Fields ON Workstation_Fields.WORKSTATIONID=RESOURCES.RESOURCEID
LEFT JOIN SoftwareInfo ON RESOURCES.RESOURCEID=SOFTWAREINFO.WORKSTATIONID
LEFT JOIN WorkstationCI ON WorkstationCI.CIID=RESOURCES.CIID
LEFT JOIN Workstation_Fields_LIC_PO ON WorkstationCI.ATTRIBUTE_1504=Workstation_Fields_LIC_PO.inv_number
LEFT JOIN SoftwareList ON SoftwareList.SOFTWAREID=SoftwareInfo.SOFTWAREID
WHERE SoftwareList.SOFTWARETYPEID='2' and not exists (
select * FROM SoftwareInfo 
JOIN SoftwareList ON SoftwareList.SOFTWAREID=SoftwareInfo.SOFTWAREID 
where RESOURCES.RESOURCEID=SOFTWAREINFO.WORKSTATIONID and SoftwareList.SOFTWARETYPEID='2' 
AND SoftwareInfo.LICENSEID is NULL);
30 янв 17, 10:51    [20160439]     Ответить | Цитировать Сообщить модератору
 Re: изменение в таблице  [new]
aleks2
Guest
and
 exists( select  name, status_old, status_new
           except
           select RESOURCES.resourcename, 'Нет', 'Да'
         )
30 янв 17, 10:55    [20160461]     Ответить | Цитировать Сообщить модератору
 Re: изменение в таблице  [new]
Vladsn07
Member

Откуда: Российская Федерация
Сообщений: 105
Сейчас я явно задал:
status_old='Нет',
status_new='Да'
Как можно узнать status_old и при изменении задать его status_new?
Статус пишется в Workstation_Fields.UDF_CHAR1
30 янв 17, 12:45    [20161053]     Ответить | Цитировать Сообщить модератору
 Re: изменение в таблице  [new]
Vladsn07
Member

Откуда: Российская Федерация
Сообщений: 105
В моем случае trigger срабатывает только после замены Workstation_Fields UDF_CHAR1 и проверяет.
30 янв 17, 12:55    [20161161]     Ответить | Цитировать Сообщить модератору
 Re: изменение в таблице  [new]
TaPaK
Member

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

таблицы INSERTED DELETED ?
30 янв 17, 12:56    [20161170]     Ответить | Цитировать Сообщить модератору
 Re: изменение в таблице  [new]
Vladsn07
Member

Откуда: Российская Федерация
Сообщений: 105
TaPaK
Vladsn07,

таблицы INSERTED DELETED ?


У меня нет таких таблиц.

status_old мне не обязателен, я его всегда могу из status_new могу переделать.

Исправил так:
  update Workstation_Fields_LIC_PO SET  name=RESOURCES.resourcename,
 									  time=(select datediff(ss, '01/01/1970', getdate()) as theTimestamp),
                                      status_new=Workstation_Fields.UDF_CHAR1
FROM RESOURCES
LEFT JOIN ResourceOwner ON RESOURCES.RESOURCEID=ResourceOwner.RESOURCEID 
LEFT JOIN Workstation_Fields ON Workstation_Fields.WORKSTATIONID=RESOURCES.RESOURCEID
LEFT JOIN SoftwareInfo ON RESOURCES.RESOURCEID=SOFTWAREINFO.WORKSTATIONID
LEFT JOIN WorkstationCI ON WorkstationCI.CIID=RESOURCES.CIID
LEFT JOIN Workstation_Fields_LIC_PO ON WorkstationCI.ATTRIBUTE_1504=Workstation_Fields_LIC_PO.inv_number
LEFT JOIN SoftwareList ON SoftwareList.SOFTWAREID=SoftwareInfo.SOFTWAREID
WHERE SoftwareList.SOFTWARETYPEID='2' and not exists (
select * FROM SoftwareInfo 
JOIN SoftwareList ON SoftwareList.SOFTWAREID=SoftwareInfo.SOFTWAREID 
where RESOURCES.RESOURCEID=SOFTWAREINFO.WORKSTATIONID and SoftwareList.SOFTWARETYPEID='2' 
AND SoftwareInfo.LICENSEID is NULL) and
 exists( select  name, status_old, status_new
           except
           select RESOURCES.resourcename, 'Нет', 'Да'
         );

меняет статус только тогда, когда 'Да', если status_new='Нет' не выводит
30 янв 17, 13:28    [20161444]     Ответить | Цитировать Сообщить модератору
 Re: изменение в таблице  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
Vladsn07
TaPaK
Vladsn07,

таблицы INSERTED DELETED ?


У меня нет таких таблиц.
А у триггера - есть!
30 янв 17, 13:33    [20161500]     Ответить | Цитировать Сообщить модератору
 Re: изменение в таблице  [new]
Vladsn07
Member

Откуда: Российская Федерация
Сообщений: 105
Т.к. inv_number в таблице может быть не заполнен необходимо добавить его и выполнить update, это лучше отдельным триггером сделать или можно в одном?
30 янв 17, 13:34    [20161508]     Ответить | Цитировать Сообщить модератору
 Re: изменение в таблице  [new]
Vladsn07
Member

Откуда: Российская Федерация
Сообщений: 105
iap
Vladsn07
пропущено...


У меня нет таких таблиц.
А у триггера - есть!


У триггера нет таких таблиц. скрипт и есть триггер.
30 янв 17, 13:35    [20161517]     Ответить | Цитировать Сообщить модератору
 Re: изменение в таблице  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
Vladsn07
iap
пропущено...
А у триггера - есть!


У триггера нет таких таблиц. скрипт и есть триггер.
они как суслик.
30 янв 17, 13:37    [20161541]     Ответить | Цитировать Сообщить модератору
 Re: изменение в таблице  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
Vladsn07
У триггера нет таких таблиц
Вам намекают на псевдотаблицы inserted и deleted, доступные в триггерах.
Документацию не пробовали читать, прежде чем писать код?
30 янв 17, 13:38    [20161543]     Ответить | Цитировать Сообщить модератору
 Re: изменение в таблице  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31980
Vladsn07
Необходимо записать только измененные.

Vladsn07
У триггера нет таких таблиц. скрипт и есть триггер.

А вы вообще как планировали в триггере обрабатывать только изменённые записи? Были какие то идеи?
Vladsn07
В моем случае trigger срабатывает только после замены Workstation_Fields UDF_CHAR1 и проверяет.
Триггер - это обычная хранимая процедура, сам он ничего не проверяет.
Что там напишите, то там и будет.
30 янв 17, 14:36    [20162074]     Ответить | Цитировать Сообщить модератору
 Re: изменение в таблице  [new]
Vladsn07
Member

Откуда: Российская Федерация
Сообщений: 105
alexeyvg
А вы вообще как планировали в триггере обрабатывать только изменённые записи? Были какие то идеи?

Идея такая:
Создать триггер на изменение Workstation_Fields UDF_CHAR1. При изменении записать новое (status_new), инв.номер (inv_number) имя (name), время изменения (time). Время подойдет и серверное, как в моем случае я применил.
30 янв 17, 16:14    [20162551]     Ответить | Цитировать Сообщить модератору
 Re: изменение в таблице  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
Vladsn07
alexeyvg
А вы вообще как планировали в триггере обрабатывать только изменённые записи? Были какие то идеи?

Идея такая:
Создать триггер на изменение Workstation_Fields UDF_CHAR1. При изменении записать новое (status_new), инв.номер (inv_number) имя (name), время изменения (time). Время подойдет и серверное, как в моем случае я применил.

вообщем хоть справку по триггерам откройте, потом вопросы если появятся пишите
30 янв 17, 16:26    [20162655]     Ответить | Цитировать Сообщить модератору
 Re: изменение в таблице  [new]
Vladsn07
Member

Откуда: Российская Федерация
Сообщений: 105
BBEGIN
  update Workstation_Fields_LIC_PO SET  name=RESOURCES.resourcename,
 									  time=(select datediff(ss, '01/01/1970', getdate()) as theTimestamp),
                                      status_new=Workstation_Fields.UDF_CHAR1
FROM RESOURCES
LEFT JOIN ResourceOwner ON RESOURCES.RESOURCEID=ResourceOwner.RESOURCEID 
LEFT JOIN Workstation_Fields ON Workstation_Fields.WORKSTATIONID=RESOURCES.RESOURCEID
LEFT JOIN SoftwareInfo ON RESOURCES.RESOURCEID=SOFTWAREINFO.WORKSTATIONID
LEFT JOIN WorkstationCI ON WorkstationCI.CIID=RESOURCES.CIID
LEFT JOIN Workstation_Fields_LIC_PO ON WorkstationCI.ATTRIBUTE_1504=Workstation_Fields_LIC_PO.inv_number
LEFT JOIN SoftwareList ON SoftwareList.SOFTWAREID=SoftwareInfo.SOFTWAREID
WHERE SoftwareList.SOFTWARETYPEID='2' and not exists (
select * FROM SoftwareInfo 
JOIN SoftwareList ON SoftwareList.SOFTWAREID=SoftwareInfo.SOFTWAREID 
where RESOURCES.RESOURCEID=SOFTWAREINFO.WORKSTATIONID and SoftwareList.SOFTWARETYPEID='2' 
AND SoftwareInfo.LICENSEID is NULL) and
 exists( select  name, status_new
           except
           select RESOURCES.resourcename, Workstation_Fields.UDF_CHAR1
         )

END

END


Если триггер сработает при условии Workstation_Fields.UDF_CHAR1='Нет', то в таблице Workstation_Fields_LIC_PO status_new и time меняется, но если Workstation_Fields.UDF_CHAR1='Да', то почему-то не меняется.
30 янв 17, 18:35    [20163228]     Ответить | Цитировать Сообщить модератору
 Re: изменение в таблице  [new]
Vladsn07
Member

Откуда: Российская Федерация
Сообщений: 105
Написал простенький триггер, как выбрать только измененные поля?
Сейчас выводятся все поля при изменении столбца UDF_CHAR1

CREATE TRIGGER updatedby ON Workstation_Fields
FOR UPDATE, INSERT
AS
IF UPDATE (UDF_CHAR1)
BEGIN
INSERT INTO Workstation_Fields_LIC_PO (WORKSTATIONID, status_new, DateUp)
SELECT WORKSTATIONID, UDF_CHAR1, getdate()
FROM Workstation_Fields
END
30 янв 17, 20:33    [20163667]     Ответить | Цитировать Сообщить модератору
 Re: изменение в таблице  [new]
TaPaK
Member

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

Вы принципиально игнорируете знания о таблицах INSERTED и DELETED????
30 янв 17, 22:39    [20163941]     Ответить | Цитировать Сообщить модератору
 Re: изменение в таблице  [new]
aleks2
Guest
CREATE TRIGGER updatedby ON Workstation_Fields
FOR UPDATE, INSERT
AS

INSERT INTO Workstation_Fields_LIC_PO (WORKSTATIONID, status_new, DateUp)
SELECT WORKSTATIONID, UDF_CHAR1, getdate()
FROM (select * from inserted  except select * from deleted ) as x
31 янв 17, 06:17    [20164338]     Ответить | Цитировать Сообщить модератору
 Re: изменение в таблице  [new]
Vladsn07
Member

Откуда: Российская Федерация
Сообщений: 105
TaPaK
Vladsn07,

Вы принципиально игнорируете знания о таблицах INSERTED и DELETED????


Мне нужно решить только одну задачу, зачем мне таблицы INSERTED и DELETED.

Решение от aleks2 меня полностью устраивает. Всем спасибо
31 янв 17, 07:41    [20164390]     Ответить | Цитировать Сообщить модератору
 Re: изменение в таблице  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
Vladsn07
Мне нужно решить только одну задачу, зачем мне таблицы INSERTED и DELETED.

Решение от aleks2 меня полностью устраивает. Всем спасибо
Ну так выкиньте их из решения алекса. Они же вам не нужны.
31 янв 17, 08:29    [20164444]     Ответить | Цитировать Сообщить модератору
 Re: изменение в таблице  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31980
Vladsn07
Мне нужно решить только одну задачу, зачем мне таблицы INSERTED и DELETED.

Решение от aleks2 меня полностью устраивает. Всем спасибо
феерично
"Решение с таблицами INSERTED и DELETED меня полностью устраивает, зачем мне таблицы INSERTED и DELETED, все свободны, ламеры"
31 янв 17, 09:55    [20164695]     Ответить | Цитировать Сообщить модератору
 Re: изменение в таблице  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31980
Vladsn07
Сейчас выводятся все поля при изменении столбца UDF_CHAR1
Слова "поле" и "столбец" являются синонимами.
"Сейчас выводятся все столбцы при изменении столбца UDF_CHAR1"
31 янв 17, 09:57    [20164705]     Ответить | Цитировать Сообщить модератору
 Re: изменение в таблице  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
Vladsn07
TaPaK
Vladsn07,

Вы принципиально игнорируете знания о таблицах INSERTED и DELETED????


Мне нужно решить только одну задачу, зачем мне таблицы INSERTED и DELETED.

Решение от aleks2 меня полностью устраивает. Всем спасибо

это наверное потому что inserted у него, а не INSERTED
31 янв 17, 10:01    [20164716]     Ответить | Цитировать Сообщить модератору
 Re: изменение в таблице  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
TaPaK
Vladsn07
пропущено...


Мне нужно решить только одну задачу, зачем мне таблицы INSERTED и DELETED.

Решение от aleks2 меня полностью устраивает. Всем спасибо

это наверное потому что inserted у него, а не INSERTED
До какой-то версии сервера в базах с регистрозависимым COLLATE
действительно требовалось писать inserted, и никак иначе.
В результате, мне INSERTED до сих пор глаз режет! :D
31 янв 17, 10:50    [20164974]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить