Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.11.2015, 19:22   #1
xxbesoxx
Участник клуба
 
Регистрация: 10.08.2010
Сообщений: 1,389
По умолчанию T-SQL проверка на update помощью trigger

Здравствуйте ребята . До пустим есть такой таблицы
Код:
create database DB1
use DB1

create Table Tab1(t_id int identity,
                  naimenovanie nvarchar(30),
                  price money ,
                  Comentar nvarchar(max)
                  )
                  
 ----------------------------
 
 create Table Tab2(t_id int ,
                   naimenovanie nvarchar(30),
                   price money ,
                   Comentar nvarchar(max)
                  )
Я хочу триггер для изменение запись на таблице Tab1 если делали update на Tab1 что бы Tab2 сохранил " изначальное состояние как он был " и еще "Как его редактировали " пишу
Код:
 create trigger T1_Change
 on Tab1
 after update
 as
 begin
   -- Как он был изначально 
   insert into Tab2(t_id, naimenovanie, price, Comentar)
   select I.t_id, I.naimenovanie, I.price, I.Comentar
   from Inserted  I
   -- Как его изменили 
   insert into Tab2(t_id, naimenovanie, price, Comentar)
   select D.t_id, D.naimenovanie, D.price, D.Comentar
   from deleted  D
 end
все работает .! Но , мне надо что это триггер работал в моменте Update только на "naimenovanie, price " и Не работал на изменение Comentar
как в этот триггере добавить EXISTS что он реагировал только на изменение запись в "naimenovanie, price " ???
xxbesoxx вне форума Ответить с цитированием
Старый 27.11.2015, 19:49   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

типа
Код:
insert ...
  SELECT ...
    from Inserted  I,deleted  D
    WHERE I.t_Id=D.t_Id AND (I.naimenovanie<>D.naimenovanie OR I.price<>D.price)
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 27.11.2015, 20:10   #3
xxbesoxx
Участник клуба
 
Регистрация: 10.08.2010
Сообщений: 1,389
По умолчанию

1. Спасибо за внимание
2. Простите что туплю )
Подредактировал так
Код:
alter trigger T1_Change
 on Tab1
 after update
 as
 begin
   -- Как он был изначально 
   insert into Tab2(t_id, naimenovanie, price, Comentar)
   select I.t_id, I.naimenovanie, I.price, I.Comentar
   from Inserted  I , deleted D
   WHERE I.t_Id=D.t_Id AND (I.naimenovanie<>D.naimenovanie OR I.price<>D.price)
 
   -- Как его изменили 
   insert into Tab2(t_id, naimenovanie, price, Comentar)
   select D.t_id, D.naimenovanie, D.price, D.Comentar
   from deleted  D , Inserted  I 
   WHERE I.t_Id=D.t_Id AND (I.naimenovanie<>D.naimenovanie OR I.price<>D.price) 
 end
Но при update если я обновляю только Comentar вот так
Код:
 update Tab1 set Comentar = N'Ля_ля5558888' where t_id=1
все равно записывается изначальное состояние , как он был до этого . Я хочу что он не реагировал в моменте update Tab1 set Comentar
xxbesoxx вне форума Ответить с цитированием
Старый 27.11.2015, 20:25   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Знаешь, я бы на твоем месте запретил нафик (именно нафик) прямой доступ запросов (типа update Tab1 set Comentar ), и сделал ХП, в котрой бы прописал обновление Tab2 и Tab1. Уже в самой ХП этот самый update Tab1 set Comentar и на нее гранты юзеру.
И пусть юзер пользуется только ХПшкой. Только через нее добавляет.
Это, ИМХО конечно, и надежнее и удобнее.

Не ну серьезно, нефик юзера баловать...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 27.11.2015, 20:26   #5
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Сомневаюсь и сильно, что реагирует на изменение только Comentar
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 27.11.2015, 20:31   #6
xxbesoxx
Участник клуба
 
Регистрация: 10.08.2010
Сообщений: 1,389
По умолчанию

Цитата:
Знаешь, я бы на твоем месте запретил нафик (именно нафик) прямой доступ запросов (типа update Tab1 set Comentar ), и сделал ХП,
Друг спасибо за внимание , Это конечно запрещено ... Но причем тут это ?
Цитата:
Не ну серьезно, нефик юзера баловать...
Не баловать здесь не причем , хочу увидит данных который редактировали кроме Comentar то есть , не интересно как редактировали Comentar А все остальные да

Цитата:
Сомневаюсь и сильно, что реагирует на изменение только Comentar
Да реагирует на изменение только Comentar , и не хочу что реагировал

Так работает правильно, не реагирует только на Comentare
Код:
CREATE TRIGGER d_tbPeoples ON Tab1
FOR UPDATE
AS
 IF EXISTS (SELECT *
            FROM deleted D, inserted I
            WHERE (I.naimenovanie<>D.naimenovanie OR I.price<>D.price )
            )
  BEGIN 
     -- Как он был изначально 
   insert into Tab2(t_id, naimenovanie, price, Comentar)
   select I.t_id, I.naimenovanie, I.price, I.Comentar
   from Inserted I  
   -- Как его изменили 
   insert into Tab2(t_id, naimenovanie, price, Comentar)
   select D.t_id, D.naimenovanie, D.price, D.Comentar
   from deleted  D   
  
  END
На всех остальные на "naimenovanie, price" реагирует ... Тема можно закрыть . Огромное вам спасибо , за внимание , за помощь и извиняюсь если я не понял на этот раз ваши советь .... Пускай будет так , главное что работает как я хотел

Последний раз редактировалось Stilet; 27.11.2015 в 21:22.
xxbesoxx вне форума Ответить с цитированием
Старый 27.11.2015, 21:01   #7
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

А триггер то обновил в базе?

Цитата:
EXISTS
Ну обнови парочку записей одной командой и беда будет
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 27.11.2015, 21:12   #8
xxbesoxx
Участник клуба
 
Регистрация: 10.08.2010
Сообщений: 1,389
По умолчанию

Цитата:
обнови парочку записей одной командой и беда будет
Друг такой не будет у меня .... " парочку записей одной командой" это не случится не когда ... Знайте это почему ? До пустим из приложений Delphi оператор оформляет что то не важно .! А начальник который не доверят эту оператору он хочет контролировать его или её , то есть , оператор оформлять что то и кроме коментар если они что то будет редактировать ... из приложение редактирование только по одному запись.
Вот такие начальники бывает говорить что оператору пускай будет из приложений права на редактирование .! Но я хочу его увидит "Что, Когда и как он это редактировал"

Последний раз редактировалось xxbesoxx; 27.11.2015 в 21:19.
xxbesoxx вне форума Ответить с цитированием
Старый 27.11.2015, 21:19   #9
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Не важно. Сам запустишь скрипт не из программы например. Триггер отрабатывает не в отдельности для каждой обновленной записи, а в результате команды UPDATE. Т.е. если обновилось две записи, то в Inserted и Deleted будет по 2 записи, и что даст WHERE (I.naimenovanie<>D.naimenovanie OR I.price<>D.price ) без связки по ид? Собственно это касается и инсертов без WHERE

Триггер не правильный
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 27.11.2015, 21:23   #10
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Цитата:
Это конечно запрещено ... Но причем тут это ?
А это позволит избавиться от триггера. ХП проще прописать на такие действия. чем триггер.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
сложный SQL update luiszevs SQL, базы данных 4 18.12.2011 13:53
UPDATE sql hunter03 Помощь студентам 5 14.12.2011 18:00
SQL UPDATE MAZADA БД в Delphi 0 13.07.2011 13:38
UPDATE SQL us4us SQL, базы данных 1 08.06.2011 20:42
Удаление строки с помощью SQL запроса (Query1.SQL.ADD('Delete....')) Schutze Помощь студентам 6 29.11.2009 22:15