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

Откуда: Урал
Сообщений: 919
Здравствуйте, уважаемые программисты.

У меня есть таблица:
users
iddate1statusflag
11.01.201110
22.01.201121
33.01.201110


Если все запросы на изменение этой таблицы, затрагивают всегда только одну запись,
(например: Update dbo.users SET status=1 WHERE id=1)
то можно быть уверенным, что таблица inserted содержит одну запись?

И при создании тригера, вместо
ALTER TRIGGER [dbo].[remove_flag_user]
ON [dbo].[users] FOR Update
AS
IF UPDATE (date1)  
begin
	UPDATE dbo.users SET flag='0' WHERE Id IN ( SELECT Id FROM INSERTED )

end

я могу написать так?

ALTER TRIGGER [dbo].[remove_flag_user]
ON [dbo].[users] FOR Update
AS
IF @@ROWCOUNT=1
begin   
   IF UPDATE (date1)   
   begin
        DECLARE @x INT

        SELECT @x=id  FROM INSERTED

	UPDATE dbo.users SET flag='0' WHERE Id =@x
   end
end
25 июл 11, 10:58    [11021464]     Ответить | Цитировать Сообщить модератору
 Re: Тригер - количество записей в таблице inserted  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31964
zvezda_t
я могу написать так?
Конечно можно.

Смысл правда ускользает :-)

А, или нужно, чтобы при апдэйте группы записей флаг не устанавливался?

Тогда правильно.

Ну и ещё для оптимизации я бы добавил в условие and flag<>'0'
25 июл 11, 11:02    [11021497]     Ответить | Цитировать Сообщить модератору
 Re: Тригер - количество записей в таблице inserted  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
zvezda_t,

  • IF UPDATE() лучше забыть - это малоинформативно.
  • @@ROWCOUNT применять можно. Но это не будет корректно работать в MERGE.
    Так что я, например, от такого способа почти отказался.
    Уж лучше использовать SELECT COUNT(*) FROM inserted
  • 25 июл 11, 11:03    [11021502]     Ответить | Цитировать Сообщить модератору
     Re: Тригер - количество записей в таблице inserted  [new]
    iap
    Member

    Откуда: Москва
    Сообщений: 47142
    iap
    Уж лучше использовать SELECT COUNT(*) FROM inserted
    Или EXISTS(SELECT * FROM inserted), если этого достаточно
    25 июл 11, 11:05    [11021514]     Ответить | Цитировать Сообщить модератору
     Re: Тригер - количество записей в таблице inserted  [new]
    zvezda_t
    Member

    Откуда: Урал
    Сообщений: 919
    Благодарю за ответы!

    iap, А чем мне заменить IF UPDATE (date1) , если мне нужно запускать тригер, только если меняется дата?

    alexeyvg, дело в том, что я хочу добавить в тригер вставку записей в другую таблицу(tab_day), поэтому мне нужна дополнительная проверка по параметрам таблицы inserted. Вот я думаю достаточно будет предположить что, запись в таблице inserted одна, или нужно создавать курсор и пробегать в цикле по всем значениям курсора?
    И еще вопрос :
    тригер же запускается на команду Update, если параллельно несколько команд(Update) будет - то и тригер для каждой команды свой сработает?


    Так можно?
    ALTER TRIGGER [dbo].[remove_flag_user]
    ON [dbo].[users] FOR Update
    AS
    IF EXISTS(SELECT * FROM inserted)
    begin
    IF UPDATE (date1)
    begin
    DECLARE @x INT, @date1 datetime

    SELECT @x=id, @date1=date1 FROM INSERTED

    UPDATE dbo.users SET flag='0' WHERE Id =@x

    IF NOT EXISTS(SELECT * FROM dbo.tab_day WHERE id_user=@x AND date1=@date1)
    INSERT INTO dbo.tab_day (id,date1) Values (@x,@date1)
    end
    end
    25 июл 11, 12:18    [11022129]     Ответить | Цитировать Сообщить модератору
     Re: Тригер - количество записей в таблице inserted  [new]
    EvAlex
    Member

    Откуда: Israel
    Сообщений: 1001
    а чем плохо так?
    ALTER TRIGGER remove_flag_user
    ON users FOR Update
    AS
    	UPDATE users SET flag='0' FROM INSERTED a WHERE Users.Id = a.Id
    
    25 июл 11, 12:23    [11022159]     Ответить | Цитировать Сообщить модератору
     Re: Тригер - количество записей в таблице inserted  [new]
    alexeyvg
    Member

    Откуда: Moscow
    Сообщений: 31964
    zvezda_t
    alexeyvg, дело в том, что я хочу добавить в тригер вставку записей в другую таблицу(tab_day), поэтому мне нужна дополнительная проверка по параметрам таблицы inserted. Вот я думаю достаточно будет предположить что, запись в таблице inserted одна, или нужно создавать курсор и пробегать в цикле по всем значениям курсора?
    Лучьше делать проверку без курсора, сразу нпа все записи.

    Предположение ваше будет правильно до первой групповой операции.

    Нужно тогда хотя бы проверку вставить с откатом транзакции.
    zvezda_t
    И еще вопрос :
    тригер же запускается на команду Update, если параллельно несколько команд(Update) будет - то и тригер для каждой команды свой сработает?
    Да, для каждой команды свой
    25 июл 11, 12:25    [11022177]     Ответить | Цитировать Сообщить модератору
     Re: Тригер - количество записей в таблице inserted  [new]
    zvezda_t
    Member

    Откуда: Урал
    Сообщений: 919
    EvAlex,

    ух ты) здорово) Я просто, так не умею... Спасибо, что научили!

    А если не изменить запись, а вставить нужно? Как быть?
    DECLARE @x INT, @date1 datetime
    
    SELECT @x=id, @date1=date1 FROM INSERTED
    
    IF NOT EXISTS(SELECT * FROM dbo.tab_day WHERE id_user=@x AND date1=@date1)
    INSERT INTO dbo.tab_day (id,date1) Values (@x,@date1)
    25 июл 11, 12:25    [11022178]     Ответить | Цитировать Сообщить модератору
     Re: Тригер - количество записей в таблице inserted  [new]
    zvezda_t
    Member

    Откуда: Урал
    Сообщений: 919
    alexeyvg
    Лучьше делать проверку без курсора, сразу на все записи.

    alexeyvg , а как так сделать?
    25 июл 11, 12:27    [11022191]     Ответить | Цитировать Сообщить модератору
     Re: Тригер - количество записей в таблице inserted  [new]
    iap
    Member

    Откуда: Москва
    Сообщений: 47142
    zvezda_t
    EvAlex,

    ух ты) здорово) Я просто, так не умею... Спасибо, что научили!

    А если не изменить запись, а вставить нужно? Как быть?
    DECLARE @x INT, @date1 datetime
    
    SELECT @x=id, @date1=date1 FROM INSERTED
    
    IF NOT EXISTS(SELECT * FROM dbo.tab_day WHERE id_user=@x AND date1=@date1)
    INSERT INTO dbo.tab_day (id,date1) Values (@x,@date1)
    Вот так никогда не пишите!
    Если обрабатывается несколько записей, то как все id поместятся в одну скалярную переменную @x?
    zvezda_t
    если мне нужно запускать тригер
    Триггер запускает сервер? а не Вы.
    Причём это не зависит от количества затронутых записей. Хоть 0.
    Поэтому повторяю: функцию UPDATE() можно забыть.
    Записи, в которых изменилось поле date1 можно выбрать, например, так:
    SELECT *
    FROM inserted i JOIN deleted d ON i.id=d.id
    WHERE NOT EXISTS(SELECT i.date1 INTERSECT SELECT d.date1)
    Здесь сразу учитывается возможность date1 IS NULL.
    Можно и по-старинке, но так короче. IMHO
    25 июл 11, 12:47    [11022360]     Ответить | Цитировать Сообщить модератору
     Re: Тригер - количество записей в таблице inserted  [new]
    iap
    Member

    Откуда: Москва
    Сообщений: 47142
    iap
    Записи, в которых изменилось поле date1 можно выбрать, например, так:
    SELECT *
    FROM inserted i JOIN deleted d ON i.id=d.id
    WHERE NOT EXISTS(SELECT i.date1 INTERSECT SELECT d.date1)
    Здесь сразу учитывается возможность date1 IS NULL.
    Можно и по-старинке, но так короче. IMHO
    Если поле не допускает значения NULL, то, конечно, лучше так:
    SELECT *
    FROM inserted i JOIN deleted d ON i.id=d.id
    WHERE i.date1<>d.date1
    25 июл 11, 12:49    [11022379]     Ответить | Цитировать Сообщить модератору
     Re: Тригер - количество записей в таблице inserted  [new]
    zvezda_t
    Member

    Откуда: Урал
    Сообщений: 919
    iap
    Вот так никогда не пишите!
    Если обрабатывается несколько записей, то как все id поместятся в одну скалярную переменную @x?


    iap, как же быть? как правильно сделать проверку и вставить записи в таблицу tab_day?
    INSERT INTO dbo.tab_day (id,date1) Values (@x,@date1)
    25 июл 11, 12:58    [11022431]     Ответить | Цитировать Сообщить модератору
     Re: Тригер - количество записей в таблице inserted  [new]
    kDnZP
    Member [заблокирован]

    Откуда: ★[msg=16399436]★[msg=20850760]
    Сообщений: 11289
    zvezda_t, вы все также не читаете BOL?

    INSERT INTO ...
    SELECT ...
    25 июл 11, 13:31    [11022693]     Ответить | Цитировать Сообщить модератору
     Re: Тригер - количество записей в таблице inserted  [new]
    iap
    Member

    Откуда: Москва
    Сообщений: 47142
    kDnZP
    zvezda_t, вы все также не читаете BOL?
    Полагаю, что читает, но быстро забывает.
    Это тревожный симптом!
    25 июл 11, 13:45    [11022805]     Ответить | Цитировать Сообщить модератору
     Re: Тригер - количество записей в таблице inserted  [new]
    zvezda_t
    Member

    Откуда: Урал
    Сообщений: 919
    iap, Большое при Большое Вам спасибо, что учите как правильно!!!!!!
    Благодаря, Вам научилась использовать INTERSECT - круто))))

    kDnZP, ой ) точно) спасибо, за терпение)))

    так правильно?
    INSERT INTO dbo.tab_day (id,date1) 
    SELECT id,date1 FROM INSERTED as A
    WHERE NOT EXISTS(SELECT * FROM dbo.tab_day WHERE id_user=A.id AND date1=A.date1)
    25 июл 11, 13:45    [11022809]     Ответить | Цитировать Сообщить модератору
     Re: Тригер - количество записей в таблице inserted  [new]
    zvezda_t
    Member

    Откуда: Урал
    Сообщений: 919
    iap
    Полагаю, что читает, но быстро забывает.
    Это тревожный симптом!

    завязывать с программированием?((
    25 июл 11, 13:50    [11022840]     Ответить | Цитировать Сообщить модератору
     Re: Тригер - количество записей в таблице inserted  [new]
    zvezda_t
    Member

    Откуда: Урал
    Сообщений: 919
    iap
    iap
    Записи, в которых изменилось поле date1 можно выбрать, например, так:
    SELECT *
    FROM inserted i JOIN deleted d ON i.id=d.id
    WHERE NOT EXISTS(SELECT i.date1 INTERSECT SELECT d.date1)
    Здесь сразу учитывается возможность date1 IS NULL.
    Можно и по-старинке, но так короче. IMHO
    Если поле не допускает значения NULL, то, конечно, лучше так:
    SELECT *
    FROM inserted i JOIN deleted d ON i.id=d.id
    WHERE i.date1<>d.date1


    iap, не могу понять разницы между этими двумя запросами.
    Почему во втором не учитывается NULL?
    Если будет NULL<>NULL - условие выполнится что ли?
    26 июл 11, 08:00    [11026085]     Ответить | Цитировать Сообщить модератору
     Re: Тригер - количество записей в таблице inserted  [new]
    iap
    Member

    Откуда: Москва
    Сообщений: 47142
    zvezda_t
    iap
    пропущено...
    Если поле не допускает значения NULL, то, конечно, лучше так:
    SELECT *
    FROM inserted i JOIN deleted d ON i.id=d.id
    WHERE i.date1<>d.date1


    iap, не могу понять разницы между этими двумя запросами.
    Почему во втором не учитывается NULL?
    Если будет NULL<>NULL - условие выполнится что ли?
    NULL<>NULL даёт UNKNOWN
    A WHERE или ON пропускает только TRUE

    http://msdn.microsoft.com/ru-ru/library/ms191504(v=SQL.100).aspx
    26 июл 11, 09:29    [11026262]     Ответить | Цитировать Сообщить модератору
     Re: Тригер - количество записей в таблице inserted  [new]
    zvezda_t
    Member

    Откуда: Урал
    Сообщений: 919
    iap, Большое спасибо Вам!))))
    Вы меня здорово выручили! Благодарю Вас, что учите :)
    26 июл 11, 09:38    [11026308]     Ответить | Цитировать Сообщить модератору
    Все форумы / Microsoft SQL Server Ответить