znaczacy > comp.* > comp.bazy-danych

Krzysztof Wiśniewski (22.01.2006, 16:58)
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 (22.01.2006, 17:28)
Użytkownik "Krzysztof Wiśniewski" <ktuvok> napisał w
wiadomości news:55f1
[..]
> 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 (22.01.2006, 17:40)
Użytkownik "Grzegorz Danowski" <gdn__na> napisał w
wiadomości news:nl91
| Użytkownik "Krzysztof Wiśniewski" <ktuvok> napisał w
| wiadomości news:55f1
| > 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 (12.02.2006, 03:17)
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.
Podobne wątki