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

Откуда:
Сообщений: 369
подскажите
как написать триггер, который п поле nameColumn запишет имя поля которое изменилось по команде Update
CREATE trigger tg_tt ON [dbo].[table] 
FOR INSERT, UPDATE, DELETE AS
    declare
       @numrows int, @Kod int, @Id int, @KodIn int, @KodDel int, @KodInsUpd int,
       @KodFio  int, @KodFioD int,
       @Name Char(50),
       @Date DateTime,
       @NameTable Char(50),
       @NameHost Char(100),
       @Login          Char(100),
       @nameColumn   Char(100)
---Корректировать------------------------------------- 
    set  @KodInsUpd  = (select kod from inserted)
    Set  @KodDel     = (select kod from deleted)
    Set  @nameHost   = (select HOST_NAME())
    Set  @NameTable       = 'table'
    Set  @nameColumn   =  ''
    Set @Date        = GETDATE()
    Set @Login =       SUSER_SNAME()
    Set @Id    = (select count(id) from test)

-------------------------------------------------------
-- select  @numrows = @@rowcount

--Если Update------------------------------------------
if exists(select 1 from inserted) and exists(select 1 from deleted)
begin
    if @numrows = 0
       return
	 insert into test
           (id, NameComp, Login, DateOper, NameTable, nameColumn)
         values
           (@Id+1, @NameHost, @Login, @Date, @NameTable, @nameColumn)
end







9 дек 09, 16:53    [8042138]     Ответить | Цитировать Сообщить модератору
 Re: Trigger какое поле изменилось  [new]
Glory
Member

Откуда:
Сообщений: 104760
COLUMNS_UPDATED ()
Returns a varbinary bit pattern that indicates the columns in a table or view that were inserted or updated. COLUMNS_UPDATED is used anywhere inside the body of a Transact-SQL INSERT or UPDATE trigger to test whether the trigger should execute certain actions.
9 дек 09, 16:57    [8042180]     Ответить | Цитировать Сообщить модератору
 Re: Trigger какое поле изменилось  [new]
iap
Member

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

1. Сколько, по-Вашему, записей может быть в inserted и deleted?
2. Почему триггер FOR INSERT, UPDATE, DELETE, если анализируется только UPDATE?
3. Если одна колонка изменилась в одной строке таблицы, а другая - в другой, то что должно прописаться в test.nameColumn?
4. Использование COLUMNS_UPDATED() и IF UPDATE() абсолютно бессмысленно.
5. Вы хотите сделать универсальный триггер на все случаи жизни?
9 дек 09, 17:02    [8042227]     Ответить | Цитировать Сообщить модератору
 Re: Trigger какое поле изменилось  [new]
devious
Member

Откуда:
Сообщений: 369
нет не универсальный
мне просто надо фиксировать, при Update какое поле в таблице изменилось (просто имя поля, без значений)
для одной лишь таблицы
9 дек 09, 17:04    [8042250]     Ответить | Цитировать Сообщить модератору
 Re: Trigger какое поле изменилось  [new]
devious
Member

Откуда:
Сообщений: 369
MsSQL 2000
9 дек 09, 17:07    [8042283]     Ответить | Цитировать Сообщить модератору
 Re: Trigger какое поле изменилось  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
devious
нет не универсальный
мне просто надо фиксировать, при Update какое поле в таблице изменилось (просто имя поля, без значений)
для одной лишь таблицы
Но в разных строках могут измениться разные поля!
И что понимается под словом "изменилось"?

Кстати, хорошим тоном считается сообщать версию сервера.
9 дек 09, 17:09    [8042311]     Ответить | Цитировать Сообщить модератору
 Re: Trigger какое поле изменилось  [new]
devious
Member

Откуда:
Сообщений: 369
iap
devious
нет не универсальный
мне просто надо фиксировать, при Update какое поле в таблице изменилось (просто имя поля, без значений)
для одной лишь таблицы
Но в разных строках могут измениться разные поля!
И что понимается под словом "изменилось"?

Кстати, хорошим тоном считается сообщать версию сервера.


Версию написал
сразу забыл сорри

На каждое изменение я создаю запись в таблице test
изменилось- Просто команда Update, а менялось или нет не важно
надо просто записать факт, что в такой то табличке происходил update такого то поля
9 дек 09, 17:17    [8042386]     Ответить | Цитировать Сообщить модератору
 Re: Trigger какое поле изменилось  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
devious
На каждое изменение я создаю запись в таблице test
изменилось- Просто команда Update, а менялось или нет не важно
надо просто записать факт, что в такой то табличке происходил update такого то поля
Как это сочетается: "Trigger какое поле изменилось" (название темы) и "менялось или нет не важно"?
Если интересует, было ли поле в списке SET команды UPDATE, то тогда надо последовать совету Glory (и как он это понял? )
9 дек 09, 17:24    [8042449]     Ответить | Цитировать Сообщить модератору
 Re: Trigger какое поле изменилось  [new]
devious
Member

Откуда:
Сообщений: 369
да туплю совсем
конечно нет
нужно получить имя поля которое именно изменилось после Update
именно что данные поменялись
9 дек 09, 18:40    [8043037]     Ответить | Цитировать Сообщить модератору
 Re: Trigger какое поле изменилось  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
Glory вам ответил и ф-цию привел даже
-------------------------------------
Jedem Das Seine
9 дек 09, 18:51    [8043094]     Ответить | Цитировать Сообщить модератору
 Re: Trigger какое поле изменилось  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
devious
да туплю совсем
конечно нет
нужно получить имя поля которое именно изменилось после Update
именно что данные поменялись
Либо динамический SQL с использованием deleted, inserted и INFORMATION_SCHEMA.COLUMNS,
либо тупо проверить последовательно каждое поле на изменение.
Но я опять не понимаю, что надо делать в ситуации, когда в inserted и deleted
по одному миллиону записей? И в ста записях изменилось поле F1, в тысяче других - поле F2 и т.д.?

В таблице, кроме того, должен быть PRIMARY KEY. Иначе сравнить inserted и deleted не получится.
9 дек 09, 21:58    [8043501]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить