Dodawanie triggerów do bazy danych

Dodawanie triggerów do bazy danych
RE
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 10
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?

Kopiuj
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'."

PA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 288
1

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

RE
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 10
0
pavarotti napisał(a):

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

Nie, nazwy kolumn są poprawne

PA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 288
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

RE
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 10
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

RE
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 10
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

RA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 374
4

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

RE
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 10
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?

RA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 374
1

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

WL
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1084
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.

Kopiuj
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
PA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 3891
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:

Kopiuj
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

Marcin.Miga
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2794
0

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

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.