ďťż
 
[MS SQL] Trigger ďťż
 
[MS SQL] Trigger
Zobacz wiadomości
 
Cytat
A gdyby tak się wedrzeć na umysłów górę, / Gdyby stanąć na ludzkich myśli piramidzie, / I przebić czołem przesądów chmurę, / I być najwyższą myślą wcieloną. . . Juliusz Słowacki, Kordian
Indeks BCB i MySQL subiekt gt fototapeta
 
  Witamy

[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.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • effulla.pev.pl
  • comp
    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.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • nawschodzie.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

    Valid HTML 4.01 Transitional

    Free website template provided by freeweblooks.com