Форум: "Базы";
Текущий архив: 2006.11.05;
Скачать: [xml.tar.bz2];
ВнизТриггеры в MsSQL Найти похожие ветки
← →
NotGooDP © (2006-09-07 13:35) [0]Здравствуйте!
Подскажите пожалуйста каким образом в триггер можно передать данные о записе редакитруемой в данный момент
т.е.
триггер вызваеться при редактировании записи и в другую таблицу передает данные до начала редактирования
CREATE TRIGGER Bef_Update ON Table_ELD For Update as
INSERT History_Table
VALUES(здесь должны быть данные редактируемой таблицы.,GETDATE ( ), USER)
← →
Ega23 © (2006-09-07 13:41) [1]Читай в BOL про inserted и deleted в разделе Create Trigger
← →
NotGooDP © (2006-09-07 13:51) [2]Насколько я понял из BOL необходимо сначала создать переменую
DECLARE @переменная тип
затем переменной присвоить значениеSELECT @переменная = Table_ELD.поле1
From Table_ELD
только после этого производить добавлениеINSERT History_Table
VALUES(@переменная ,GETDATE ( ), USER)
правильно ????
← →
evvcom © (2006-09-07 14:10) [3]Записей может быть и больше одной.
> только после этого производить добавление
Это в смысле история изменений? То как ты написал, тебе, видимо, подойдетinsert into History_Table from (select field1, getdate(), user from inserted)
← →
Ega23 © (2006-09-07 14:26) [4]
> insert into History_Table from (select field1, getdate(),
> user from inserted)
"Абсолютно в ж..у правильно!" (с) Pulp Fiction
← →
Ega23 © (2006-09-07 14:28) [5]
insert into History_Table from (select field1, getdate(), user from inserted)
Только я бы сначала объявил переменную типа datetime, записал в неё значение getdate() и потом подставлял значение переменной. А то если записей сотня - значение разное будет.
← →
Ega23 © (2006-09-07 14:28) [6]Впрочем, это уже от логики зависит.
← →
evvcom © (2006-09-07 14:32) [7]> [4] Ega23 © (07.09.06 14:26)
Э... Все таки там в инсерте from лишний :)
← →
NotGooDP © (2006-09-07 15:09) [8]Всем спасибо, сейчас попробую.
← →
NotGooDP © (2006-09-07 15:50) [9]спасибо все получилось только еще вопрос
каким образом мне определить какое именно действие выполняеться в данный момент удаление или рдактирование
т.е.if Update @Action = "Редактирование"
Else @Action = "Удаление"
это не верно!
← →
Ega23 © (2006-09-07 15:58) [10]
> каким образом мне определить какое именно действие выполняеться
> в данный момент удаление или рдактирование
Рекомендую просто два разных триггера создать. Один на Insert, Update, другой - на delete.
А логику - в хранимую процедуру вынести, чтобы 2 раза код не писать.
← →
NotGooDP © (2006-09-07 16:00) [11]Кароче я сделал триггер, но он неправильно как то работает!!!
он мне копирует все строчки из таблицы вместо той, которую изменяют в данный момент где я не правилно сделал ????
Create TRIGGER ELD_Trigger_Update ON Table_ELD For Update as
INSERT INTO History_ELD
SELECT
Persone_ID,
Family_member_ID,
MVD_Unit_Id,
ELD_Status,
ELD_Status_ID,
ELD_Status_Date,
ELD_Payment_Date,
getdate(),
User,
"Редактирование"
FROM Table_ELD
← →
Ega23 © (2006-09-07 16:11) [12]
> он мне копирует все строчки из таблицы вместо той, которую
> изменяют в данный момент
Ничего не понял. Переформулируй.
← →
evvcom © (2006-09-07 16:12) [13]> [11] NotGooDP © (07.09.06 16:00)
> FROM Table_ELD
Блин! Чукча не читатель, чукча писатель? См. [3]:select field1, getdate(), user from inserted
> какое именно действие выполняеться в данный момент
Если строка попала только в inserted, то insert, если и в inserted, и в deleted, то update, если только в deleted, то delete. Таблицы не пусты могут быть только в триггере, afair.
← →
NotGooDP © (2006-09-07 16:17) [14])))))
спасибо )
← →
NotGooDP © (2006-09-07 16:27) [15]Все спасибо заработало )))
еще один вопрос каким образом вызывать триггер до сохранения изменений в таблице ?
т.е. по умолчанию он выполняется только после успешного выполнения команды и тем самым заносит в таблицу уже измененные данные, мне надо чтобы в таблицу заносились данные до изменений т.е. команда т.е. видимо надо использовать INSTEAD OF я прав ?
← →
NotGooDP © (2006-09-07 16:29) [16]блин я не прав (
← →
NotGooDP © (2006-09-07 16:30) [17]тогда каким образом можно отключить AFTER
← →
Ega23 © (2006-09-07 16:30) [18]
> еще один вопрос каким образом вызывать триггер до сохранения
> изменений в таблице ?
Триггер - последний рубеж. Всё делается ПЕРЕД вставкой и никак иначе.
← →
NotGooDP © (2006-09-07 16:32) [19]Блин (
тогда как мне это сделать с помощью какого механизма ?
← →
Ega23 © (2006-09-07 16:35) [20]
> тогда как мне это сделать с помощью какого механизма ?
Какой механизм? Тебе перед вставкой надо, или после?
← →
NotGooDP © (2006-09-07 16:39) [21]перед !
← →
evvcom © (2006-09-07 16:39) [22]> [19] NotGooDP © (07.09.06 16:32)
Если триггер, то:
1. триггер before, а не after
2. insert into History_Table (select old.field from inserted new inner join Table_ELD old on old.id = new.id)
← →
NotGooDP © (2006-09-07 16:40) [23]У меня должна быть историческая табилца в которую помещаються все действия пользователя
← →
evvcom © (2006-09-07 16:47) [24]> [23] NotGooDP © (07.09.06 16:40)
И?
← →
NotGooDP © (2006-09-07 16:53) [25]так все вопрос снят !!!
я туплю уже !!!!
> evvcom
ты мне еще выше написал где что храниться !
← →
NotGooDP © (2006-09-07 16:54) [26]просто надо выбирать было из таблизы deleted там и храняться данные которые были до апдейта
← →
NotGooDP © (2006-09-07 16:55) [27]ЕЩЕ раз всем спасибо )
← →
evvcom © (2006-09-07 16:57) [28]> [26] NotGooDP © (07.09.06 16:54)
А, ну да... Запамятовал.
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2006.11.05;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.041 c