[MS SQL] Trigger
kurciok@poczta.onet.pl - 12-11-2006 01:32
[MS SQL] Trigger
Trigger jak nizej wchodzi bez problemów:
CREATE TRIGGER [ON_ADD_USER_FIELDS_CHANGE] ON [dbo].[ADD_USER_FIELDS] WITH EXECUTE AS CALLER FOR UPDATE AS BEGIN INSERT INTO add_user_fields_changes (aufc_type, aufc_row_id) VALUES ('2', '2'); END GO
Natomiast taki
BEGIN INSERT INTO add_user_fields_changes (aufc_type, aufc_row_id) VALUES ('2', OLD.auf_id); END
Nie chce wejsc i zglasza blad:
The name "OLD.auf_id" is not permitted in this context. Valid expressions are constants, constant expressions, and (in some contexts) variables. Column names are not permitted
Sory ze takimi podstawami zawracam glowe ale nie mam ksiazki opisujacej trigger a musze to szybko zrobic. Podejrzewam ze w TSQL jakos inaczej to wyglada ja mam przezwyczajenia z firebirda.
Maciej Łuszczyński - 12-11-2006 01:32
> Trigger taki > > BEGIN > INSERT INTO add_user_fields_changes (aufc_type, aufc_row_id) VALUES > ('2', OLD.auf_id); > END > > Nie chce wejsc i zglasza blad: > > The name "OLD.auf_id" is not permitted in this context. Valid > expressions are constants, constant expressions, and (in some contexts) > variables. Column names are not permitted > Czesc.
A gdyby zamiast OLD uzyc pseudowidoku deleted ?
Pozdrawiam Macko -- *** A czym się różni Cray od normalnego peceta? *** Tym, że Cray wykonuje pętle nieskończone w 10 sekund.
wloochacz - 12-11-2006 01:33
[ciach] > A gdyby zamiast OLD uzyc pseudowidoku deleted ? Właśnie - MS SQL to nie FB/IB; poza tym jest jeszcze "cóś" co się nazywa "inserted" - tak na przyszłość ;-)
-- wloochacz
kurciok@poczta.onet.pl - 12-11-2006 01:34
Zrobiłem to tak:
DECLARE @old int DECLARE @new int
BEGIN
select @old = AUF_ID from deleted select @new = AUF_ID from inserted INSERT INTO add_user_fields_changes (aufc_type, aufc_row_id) VALUES ('2', @new);
END
Tylko teraz się zastanawiam czy nie ma jakiegoś bardziej prostego spoosobu w MS SQL?
Robert Winkler - 12-11-2006 01:34
Pseudowidoki inserter i deleted zawierają informacje o _wszystkich_ _zmodyfikowanych_ _wierszach_ Triger w MSSQL'u uruchamiany jest raz dla wszystkich zmodyfikowanych wierszy. Wyciąganie z nich pojedyńczych wartosci jest bez sensu należy je wykorzystać tak jak zostały dostarczone przez serwer razem ze znajującymi sie tam wszytkomi wierszami. -- ____________ Robert Winkler
kurciok@poczta.onet.pl - 12-11-2006 01:34
> Pseudowidoki inserter i deleted zawierają informacje > o _wszystkich_ _zmodyfikowanych_ _wierszach_ > Triger w MSSQL'u uruchamiany jest raz dla wszystkich zmodyfikowanych > wierszy. > Wyciąganie z nich pojedyńczych wartosci jest bez sensu > należy je wykorzystać tak jak zostały dostarczone przez serwer > razem ze znajującymi sie tam wszytkomi wierszami.
Uuu to mnie Roberie zaskoczyłeś ;-) czyli pół dnia zmarnowałem bo przerobiłem na tą modłe 50 triggerów ;) A możesz opisać jak to działa. Jeżeli dobrze rozumie to w deleted i inserted może być więcej niż jeden wiersz. Czyli jeśli zrobię np. 5 insertów do tabeli to w momęcie comita wywoływany jest tylko jeden trigger? A w pseudowidokach mam 5 wierszy? Tak to działa? Może mi ktoś poprawić tego triggera tak aby prawidłowo to obsługiwał?
W ogóle to mam taki problem że mam bazę napisą w Firebirdzie i musze ją przenieść do MS SQL i tak się już zaczynam zastanawiać czy to jest proste i jak będzie sprawa wyglądała jeśli chodzi o comity itd. Baza jest w tej chwili podpięta do Borlanda poprzez dbExpres
Maciej Łuszczyński - 12-11-2006 01:34
> Uuu to mnie Roberie zaskoczyłeś ;-) czyli pół dnia zmarnowałem bo > przerobiłem na tą modłe 50 triggerów ;) A możesz opisać jak to > działa. Jeżeli dobrze rozumie to w deleted i inserted może być > więcej niż jeden wiersz. Czyli jeśli zrobię np. 5 insertów do > tabeli to w momęcie comita wywoływany jest tylko jeden trigger? A w > pseudowidokach mam 5 wierszy? Tak to działa? Może mi ktoś poprawić > tego triggera tak aby prawidłowo to obsługiwał? > Czesc.
Sprawdz, czy bedzie dzialac:
INSERT INTO add_user_fields_changes (aufc_type, aufc_row_id) SELECT '2', AUF_ID FROM deleted
Twoje rozwazania sa jak najbardziej prawidlowe. Kazdy trigger odpalany jest jeden raz dla operacji, niezaleznie od liczby rekordow, ktore zostana zmodyfikowane. Natomiast commit, z tego co wiem, nie wplywa na moment wywolania triggera - ten jest wywolywany w momencie wykonania operacji, a nie zatwierdzenia transakcji.
Pozdrawiam Macko -- *** A czym się różni Cray od normalnego peceta? *** Tym, że Cray wykonuje pętle nieskończone w 10 sekund.
Robert Winkler - 12-11-2006 01:34
Jeśli wykonasz instrukcje
insert into ADD_USER_FIELDS(auf_id) values(1) insert into ADD_USER_FIELDS(auf_id) values(2)
To wywołane zostaną 2 trigery tyle że oczywiście nie dla zdazenia update tylko insert
Jeśli wykonasz
declare @tmpTable TABLE ( value int PRIMARY KEY ) insert into @tmpTable(value) values (1) insert into @tmpTable(value) values (2) insert into @tmpTable(value) values (3)
insert into ADD_USER_FIELDS(auf_id) select value from @tmpTable
to triger wywoła sie tylko raz z 3 wierszami w widoku inserted i pustym widokiem deleted
Jeśli wykonasz instrukcje
update ADD_USER_FIELDS set jakies_pole = 'nowa wartosc' where auf_id < 100
to triger także wykona sie tylko raz w widoku deleted będzesz miał kopie wszystkich modyfikowanych wierszy z ich wcześniejszymi wartościami w widoku inserted będziesz miał kopie wszystkich modyfikowanych wierszy a ich nowymi wartościami
Twój triger mógłby więc wyglądać nastepująco:
CREATE TRIGGER [ON_ADD_USER_FIELDS_CHANGE] ON [dbo].[ADD_USER_FIELDS] AFTER UPDATE AS BEGIN INSERT INTO add_user_fields_changes (aufc_type, aufc_row_id) SELECT '2', auf_id FROM deleted END GO
-- ____________ Robert Winkler
kurciok@poczta.onet.pl - 13-11-2006 00:13
Ok dziękuje za wyczerpującą odpowiedź teraz rozumiem. Tylko znowu utknąłem na takim triggerze. Działa ale nie obsługuje przypadku w którym w deleted lub inserted będzie więcej wierszy niż jeden (także tak właściwie nie działa :). Mam tu problem z tym warunkiem IF (@newcatype <> @oldcatype) co zrobić aby on sprawdził wszystkie wiersze. Myślałem aby zrobić jakieś zlączenie na tabelach deleted i inserted tak aby do deleted dodały się kolumny z inserted a później w warunku where dać @newcatype <> @oldcatype. Tylko jak to złączenie zrobić i na czym?
CREATE TRIGGER dbo.ON_CARD_UPDATE ON CARDS AFTER UPDATE AS DECLARE @AUserId int; DECLARE @oldcaid int DECLARE @newcaid int DECLARE @oldcatype int DECLARE @newcatype int
BEGIN select @oldcaid = ca_id from deleted select @oldcatype = ca_type from deleted select @newcaid = ca_id from inserted select @newcatype = ca_type from inserted SELECT @AUserID= us_id FROM users WHERE us_card_id=@newcaid;
IF (@newcatype <> @oldcatype) INSERT INTO card_history (ch_card_id, ch_card_state, ch_user_id) VALUES (@newcaid, @newcatype, @AUserId); END GO
Robert Winkler - 13-11-2006 00:13
CREATE TRIGGER dbo.ON_CARD_UPDATE ON CARDS AFTER UPDATE AS BEGIN INSERT INTO card_history (ch_card_id, ch_card_state, ch_user_id) SELECT i.ca_id, i.ca_type, u.us_id from inserted i inner join deleted d on i.ca_id = d.ca_id inner join users u on u.us_card_id = i.ca_id where i.ca_type <> d.ca_type END GO
zanotowane.pldoc.pisz.plpdf.pisz.pleffulla.pev.pl
|
jak to =?ISO-8859-2?Q?zrobi=E6=2E=2E=2E=3F_TSQL_sql_server?==?ISO-8859-2?Q?_?=
=?iso-8859-2?Q?=5BMS_SQL=5D_Czy_mo=BFna_wywo=B3a=E6_funkcje_t ylko_raz_dla?==?iso-8859-2?Q?_ca=B3ego_zbioru_=BCr=F3d=B3owego=3F?=
[MSSQL] =?ISO-8859-2?Q?zgodno=B6ci_z_licencjami_Microsoft_?==?ISO-8859-2?Q?SQL_Server?=
Oracle PL/SQL Wstawianie =?ISO-8859-2?Q?wynik=F3w_kolekcji_d?==?ISO-8859-2?Q?o_tabeli?=
[MSSQL] ACCESS - SQL =?ISO-8859-2?Q?B=B3ad_w_konwersji_lic?==?ISO-8859-2?Q?zb?=
=?iso-8859-2?Q?=5Bmssql=5D_Zapytania_rekurencyjne__-_czy_sk=B3adnia_sql?==?iso-8859-2?Q?_co=B6_takiego_przewiduje_=3F?=
[Oracle PL/SQL] Cursor i zapis =?ISO-8859-2?Q?rekord=F3w_do_?==?ISO-8859-2?Q?kolejnych_plik=F3w?=
=?iso-8859-2?Q?=5BMySQL=5D_Co_minimalnie_potrzebne_zeby_mie=E 6_klienta_My?==?iso-8859-2?Q?SQL_na_Linuxie=3F?=
[oracle] - Oracle SQL Developer - co to jest SID?
=?ISO-8859-2?Q?[Oracle]_Wywo=B3anie_skryptu_sh_z_PL/SQL-a=3F=3F?=
zanotowane.pldoc.pisz.plpdf.pisz.plnawschodzie.xlx.pl
Cytat
Decede mihi sole - nie zasłaniaj mi słonca. Gdy kogoś kochasz, jesteś jak stworzyciel świata - na cokolwiek spojrzysz, nabiera to kształtu, wypełnia się barwą, światłem. Powietrze przytula się do ciebie, choćby był mróz, a ty masz w sobie tyle radości, że musisz ją rozdawać wokoło, bo się w tobie nie mieści Hoc fac - tak czyń. A tergo - od tyłu; z tyłu. I czarne włosy posiwieją. Safona |
|