Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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.173 c
2-1161430828
nokk
2006-10-21 15:40
2006.11.05
время gmt


2-1161261418
СержК
2006-10-19 16:36
2006.11.05
Событие наведения указателя мышки к кнопке на форме


15-1161072064
cyborg
2006-10-17 12:01
2006.11.05
Чего-то Яндекс совсем испортился


15-1160828553
PHPDeveloper
2006-10-14 16:22
2006.11.05
Assembler


4-1150985614
PRT
2006-06-22 18:13
2006.11.05
Popup в Run - time





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский