ďťż
 
[MS SQL 2000] triger dla tylko jednego rekordu ďťż
 
[MS SQL 2000] triger dla tylko jednego rekordu
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 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.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?= =?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.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • nocnerozmowy.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