Dodawanie triggerów do bazy danych

0

Tworzę bazę w SQL Server Management Studio 2012, w której chcę zrobić trigger odpowiadający za aktualizację danych. W tabeli o nazwie klient znajdują się informację o obecnych klientach oraz informacja o tym jaki obecnie rodzaj karty członkowskiej posiadają. Chcę aby na podstawie dokonanych rezerwacji, (które zapisywane są w tabeli Rezerwacje) a dokładniej mówiąc po przekroczeniu konkretnej ilości rezerwacji aktualizowała się informacja w tabeli klient na temat tej karty członkowskiej. Ilość rezerwacji, pobieram ze stworzonego widoku -ranking Klientów, który pokazuje liczbę zakończonych rezerwacji przez wszystkich klientów. Mam taki kod i nie potrafię powiedzieć dlaczego wyskakuję błąd. Może ktoś pomoże?

create trigger AktualizacjaKarty on Klient
after insert, update
as
	declare @ID_klienta int, @LiczbaRezerwacji int,@Karta_Sympatyka int =6, @Karta_Zawodowca int= 8

	select @ID_klienta= inserted.Klient_ID from inserted
	select @LiczbaRezerwacji= [ilośćRezerwacji] from rankingKlientów where @ID_klienta=Klient_ID

if update (ilośćRezerwacji)
begin 
	if (@LiczbaRezerwacji) > 5
		update Klient
		set Rodzaj_karty = @Karta_Sympatyka
		where @ID_klienta=Klient_ID

	if (@LiczbaRezerwacji) > 10
		update Klient
		set Rodzaj_karty = @Karta_Zawodowca
		where @ID_klienta=Klient_ID
	end

Błąd, który się pokazuję wygląda następująco: "Msg 207, Level 16, State 1, Procedure AktualizacjaKarty, Line 9
Invalid column name 'ilośćRezerwacji'."

1

Ta Twoja kolumna nie nazywa się przypadkiem iloscRezerwacji zamiast ilośćRezerwacji?

0
pavarotti napisał(a):

Ta Twoja kolumna nie nazywa się przypadkiem iloscRezerwacji zamiast ilośćRezerwacji?

Nie, nazwy kolumn są poprawne

1
rezwol napisał(a):
pavarotti napisał(a):

Ta Twoja kolumna nie nazywa się przypadkiem iloscRezerwacji zamiast ilośćRezerwacji?

Nie, nazwy kolumn są poprawne

Nie, nie są.

Invalid column name 'ilośćRezerwacji'."

W tłumaczeniu na polski: zła nazwa kolumny "ilośćRezerwacji". Wątpię, żebyś miał w bazie nazwy kolumn z polskimi literami: ą, ę, itd

0
pavarotti napisał(a):
rezwol napisał(a):
pavarotti napisał(a):

Ta Twoja kolumna nie nazywa się przypadkiem iloscRezerwacji zamiast ilośćRezerwacji?

Nie, nazwy kolumn są poprawne

Nie, nie są.

Invalid column name 'ilośćRezerwacji'."

W tłumaczeniu na polski: zła nazwa kolumny "ilośćRezerwacji". Wątpię, żebyś miał w bazie nazwy kolumn z polskimi literami: ą, ę, itd

Przy dodawaniu ich nie było problemu. Po rozwinięciu kolumn chociażby w Object Explorer nazwy kolumn widnieją z polskimi znakami

0
rezwol napisał(a):
pavarotti napisał(a):
rezwol napisał(a):
pavarotti napisał(a):

Ta Twoja kolumna nie nazywa się przypadkiem iloscRezerwacji zamiast ilośćRezerwacji?

Nie, nazwy kolumn są poprawne

Nie, nie są.

Invalid column name 'ilośćRezerwacji'."

W tłumaczeniu na polski: zła nazwa kolumny "ilośćRezerwacji". Wątpię, żebyś miał w bazie nazwy kolumn z polskimi literami: ą, ę, itd

Przy dodawaniu ich nie było problemu. Po rozwinięciu kolumn chociażby w Object Explorer nazwy kolumn widnieją z polskimi znakami

screenshot-20200629120332.png

screenshot-20200629120346.png

4

Naprawdę używasz polskich liter w kodzie? Proponuje zmienic przyzwyczajenia.

0
ralf napisał(a):

Naprawdę używasz polskich liter w kodzie? Proponuje zmienic przyzwyczajenia.

Ale skoro nazwy zostały wcześniej zaakceptowane to raczej nie mogą stanowić problemu w tym przypadku tak?

1

Zrób to samo bez polskich liter to wtedy się okaże czy nie stanowią problemu.

1

Uparty jesteś: Tworzenie triggerów

0

Tak zrób jak poniżej i zadziała; i tak tak, polskie krzaki są poprawne w nazwach kolumn/tabel itd.
Nawet jakbyś napisał Ilość Rezerwacji to też będzie to poprawna nazwa kolumny dla MSSQL.

Ale to upierdliwe i dlatego się tego raczej nie stosuje.
A jak już ktoś stosuje, to niech do jasnej cholery zrozumie co robi.
To z kolei do Ciebie @rezwol bo wyklikałeś sobie tabelkę a potem masz problem z pisaniem zapytań.
Ponieważ zwyczajnie nie rozumiesz absolutnych podstaw.

create trigger AktualizacjaKarty on Klient
after insert, update
as
    declare @ID_klienta int, @LiczbaRezerwacji int,@Karta_Sympatyka int =6, @Karta_Zawodowca int= 8

-- to jest proszenie się o kłopoty taka pisania.
-- Nie zakładaj że w inserted będzie zawsze jeden rekord.
select @ID_klienta= inserted.Klient_ID from inserted

select @LiczbaRezerwacji= [ilośćRezerwacji] from rankingKlientów where @ID_klienta=Klient_ID

-- doczytaj czym są owe nawiasy kwadratowe...
if update ([ilośćRezerwacji])
begin 
    if (@LiczbaRezerwacji) > 5
        update Klient
        set Rodzaj_karty = @Karta_Sympatyka
        where @ID_klienta=Klient_ID

    if (@LiczbaRezerwacji) > 10
        update Klient
        set Rodzaj_karty = @Karta_Zawodowca
        where @ID_klienta=Klient_ID
    end
1

To się wywali jak zrobisz update kliku rekordów, co do zasady taki trigger to jest bezsensowne ukrywanie logiki w bazie, ale to można jednym zapytaniem, bez zmiennych:

create trigger AktualizacjaKarty on Klient
after insert, update
as
if update ([ilośćRezerwacji])
begin 
    update
        klient
    set Rodzaj_karty = case 
                        when [ilośćRezerwacji] > 10 then 8
                        when [ilośćRezerwacji] > 5 then 6
                        else Rodzaj_karty
                        end
    from
        klient k
        inner join inserted i on i.Klient_ID=k.Klient 
end

Uwaga Triggery w MS SQL ZAWSZE musisz pisać tak, żeby przewidzieć, że w inserted będziesz miał więcej niż jeden rekord

0

W ogóle na to nie jest potrzebny trigger, tylko View.

1 użytkowników online, w tym zalogowanych: 0, gości: 1