[MS SQL 2000] triger dla tylko jednego rekordu
Krzysztof Wiśniewski - 23-01-2006 10:00
[MS SQL 2000] triger dla tylko jednego rekordu
Napisałem dość skomplikowany wyzwalacz, który zapisuje w odpowiedniej tabeli - logu wszystkie zmiany, dokonane w polach tabeli przez juzerów. Działanie tego wyzwalacza opiera się na danych odczytywanych z tabel "inserted" i "deleted". Wyzwalacz ma sens jedynie wtedy, gdy juzer zmodyfikował pojedynczy rekord (zresztą aplikacja pozwala na operowanie tylko pojedynczym rekordem).
Niemniej chciałbym zabezpieczyć tabelę przed niepoprawnym działaniem wyzwalacza, jeśli juzer w jakikolwiek sposób dokona modyfikacji grupy rekordów. Dopisałem na początku kodu wyzwalacza taki oto kod:
DECLARE @ModPrzed bigint; DECLARE @ModPo bigint; SELECT @ModPrzed = COUNT(*) FROM inserted; SELECT @ModPo = COUNT(*) FROM deleted; IF @ModPrzed > 1 OR @ModPo > 1 BEGIN RETURN; END
Czy ma to sens?
Pozdrawiam, Krzysiek
Grzegorz Danowski - 23-01-2006 10:00
Użytkownik "Krzysztof Wiśniewski" <ktuvok@poczta.onet.pl> napisał w wiadomości news:dr06fu$55f$1@news.onet.pl... > Napisałem dość skomplikowany wyzwalacz, który zapisuje w odpowiedniej > tabeli - logu wszystkie zmiany, dokonane w polach tabeli przez juzerów. > Działanie tego wyzwalacza opiera się na danych odczytywanych z tabel > "inserted" i "deleted". Wyzwalacz ma sens jedynie wtedy, gdy juzer > zmodyfikował pojedynczy rekord (zresztą aplikacja pozwala na operowanie > tylko pojedynczym rekordem). > > Niemniej chciałbym zabezpieczyć tabelę przed niepoprawnym działaniem > wyzwalacza, jeśli juzer w jakikolwiek sposób dokona modyfikacji grupy > rekordów. Dopisałem na początku kodu wyzwalacza taki oto kod: > > DECLARE @ModPrzed bigint; > DECLARE @ModPo bigint; > SELECT @ModPrzed = COUNT(*) FROM inserted; > SELECT @ModPo = COUNT(*) FROM deleted; > IF @ModPrzed > 1 OR @ModPo > 1 > BEGIN > RETURN; > END > > Czy ma to sens?
Znaczy w przypadku modyfikacji rekordów nie chcesz zapisywać żadnych zmian do swojej tabeli logów? GD
Krzysztof Wiśniewski - 23-01-2006 10:00
Użytkownik "Grzegorz Danowski" <gdn__na@serwerze__poczta.onet.pl> napisał w wiadomości news:dr08bs$nl9$1@inews.gazeta.pl... | Użytkownik "Krzysztof Wiśniewski" <ktuvok@poczta.onet.pl> napisał w | wiadomości news:dr06fu$55f$1@news.onet.pl... | > Napisałem dość skomplikowany wyzwalacz, który zapisuje w odpowiedniej | > tabeli - logu wszystkie zmiany, dokonane w polach tabeli przez juzerów. | > Działanie tego wyzwalacza opiera się na danych odczytywanych z tabel | > "inserted" i "deleted". Wyzwalacz ma sens jedynie wtedy, gdy juzer | > zmodyfikował pojedynczy rekord (zresztą aplikacja pozwala na operowanie | > tylko pojedynczym rekordem). | > | > Niemniej chciałbym zabezpieczyć tabelę przed niepoprawnym działaniem | > wyzwalacza, jeśli juzer w jakikolwiek sposób dokona modyfikacji grupy | > rekordów. Dopisałem na początku kodu wyzwalacza taki oto kod: | > | > DECLARE @ModPrzed bigint; | > DECLARE @ModPo bigint; | > SELECT @ModPrzed = COUNT(*) FROM inserted; | > SELECT @ModPo = COUNT(*) FROM deleted; | > IF @ModPrzed > 1 OR @ModPo > 1 | > BEGIN | > RETURN; | > END | > | > Czy ma to sens? | | Znaczy w przypadku modyfikacji rekordów nie chcesz zapisywać żadnych zmian | do swojej tabeli logów?
Nieco dokładniej - w przypadku modyfikacji tabeli obejmującej więcej niż jeden rekord nie chcę przetwarzać dalszej części kodu wyzwalacza.
Czy to dobry sposób?
Pozdrawiam, Krzysiek
Marcin A. Guzowski - 13-02-2006 10:31
Krzysztof Wiśniewski napisał(a): > DECLARE @ModPrzed bigint; > DECLARE @ModPo bigint; > SELECT @ModPrzed = COUNT(*) FROM inserted; > SELECT @ModPo = COUNT(*) FROM deleted; > IF @ModPrzed > 1 OR @ModPo > 1 > BEGIN > RETURN; > END > > Czy ma to sens?
Bardziej prawidłowo (powyższy kod zadziała na 100% w SQL2k i najpewniej w 2005) byłoby zamiast RETURN; wstawić po prostu kod, który ma się wykonać i zmienić warunek (IF @@ROWCOUNT = 1).
Nie ma też sensu wykonywać dwa razy Count(*) - w przypadku UPDATE ilość rekordów w inserted i deleted jest dokładnie równa. Poza tym można po prostu użyć @@ROWCOUNT.
-- Pozdrawiam, Marcin Guzowski
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?=
=?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?=
[oracle] Baza danych do kursy Introduction to Oracle9i:PL/SQL ? Skąd ją pobrać ?
zanotowane.pldoc.pisz.plpdf.pisz.plnocnerozmowy.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 |
|