![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 5 Pomógł: 0 Dołączył: 10.04.2010 Ostrzeżenie: (0%) ![]() ![]() |
W MSQL Server 2008 nie działa mi:
--Napisz wyzwalacz nie pozwalający na obniżanie pensji pracownikom – w przypadku takiej próby ma zwracać odpowiedni komunikat. CREATE TRIGGER notupdate BEFORE UPDATE OF pensja ON pracownik2 REFERENCING NEW AS after_update OLD AS before_update FOR EACH ROW BEGIN IF after_update.pensja = before_update.pensja THEN RAISERROR 30002 'You cannot decrease a salary'; END IF; END wzorowałem się na skrypcie pokazującym jak napisać podobny wyzwalacz, błędy są takie: Msg 102, Level 15, State 1, Procedure notupdate, Line 1 Incorrect syntax near 'BEFORE'. Msg 156, Level 15, State 1, Procedure notupdate, Line 5 Incorrect syntax near the keyword 'THEN'. Msg 102, Level 15, State 1, Procedure notupdate, Line 7 Incorrect syntax near ';'. Jeszcze mam, jak dla mnie, trudniejsze zadanie: --Utwórz wyzwalacz Archiwizuj, który po usunięciu pracownika z tabeli pracownik automatycznie umieszcza jego dane w tabeli pracownik_archiwum, wraz z datą usunięcia i nazwą użytkownika dokonującego operacji usuwania (select user_name() zwraca nazwę aktualnego użytkownika). CREATE TRIGGER archiwizuj ON pracownik2 AFTER DELETE AS tu zastanawiałem się nad użyciem REFERENCING, nie mam pojęcia jak przekierować dane z tabeli pracownik do pracownik_archiwum |
|
|
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 171 Pomógł: 18 Dołączył: 13.03.2009 Skąd: lublin Ostrzeżenie: (0%) ![]() ![]() |
to nie ten dialekt SQL - przykład
|
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 5 Pomógł: 0 Dołączył: 10.04.2010 Ostrzeżenie: (0%) ![]() ![]() |
--Napisz wyzwalacz nie pozwalający na obniżanie pensji pracownikom – w przypadku takiej próby ma zwracać odpowiedni komunikat.
CREATE TRIGGER notupdate ON pracownik2 FOR UPDATE AS DECLARE @pensja DECIMAL(6,2); BEGIN SELECT @pensja=pensja FROM inserted; IF @pensja < pensja RAISERROR 30002 'You cannot decrease a salary'; END -- SELECT pensja FROM pracownik2 -- IF (@pensja<pensja) -- SELECT pensja FROM pracownik2 -- WHERE nr_pracownika IN (SELECT nr_pracownika FROM inserted WHERE @pensja<pensja) Kombinowalem jak się da z tym ciałem funkcji, ale mimo to wywołuje błąd lecz zmienia przy tym wartości pensji, może ktoś napisać jak zmodyfikować poprawnie? Byłbym wdzięczny za szybką odpowiedź --UPDATE pracownik2 SET pensja=pensja-50.00 |
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 171 Pomógł: 18 Dołączył: 13.03.2009 Skąd: lublin Ostrzeżenie: (0%) ![]() ![]() |
inserted jest wirtualną tabelą i musiał byś pracować kursorem lub operować zbiorami żeby określić to co uległo zmianie, a zmianie mogło ulec zarówno w przód jak i tył
np. zapytanie
zwróci ci zbiór tego co uległo zmianie jak policzysz rekordy z tego czegoś i dasz np.
a opakowanie tego w trigger zostawiam już tobie |
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 5 Pomógł: 0 Dołączył: 10.04.2010 Ostrzeżenie: (0%) ![]() ![]() |
Dzięki za pomoc.
Mam takie zadanie: --3.Napisz wyzwalacz, który uniemożliwi usunięcie rekordu z tabeli pracownik - powinien zostać wypisany komunikat: "Usuwanie rekordów z tabeli pracownik nie jest dozwolone". CREATE TRIGGER notdelete ON pracownik2 INSTEAD OF DELETE AS BEGIN SET NOCOUNT ON IF ((SELECT nr_pracownika FROM deleted) = (SELECT nr_pracownika FROM deleted)) RAISERROR 30001 'Usuwanie rekordów z tabeli pracownik nie jest dozwolone' END --DELETE FROM pracownik2 WHERE nr_pracownika='0012'; --DELETE FROM pracownik2 WHERE imie='JAREK'; powyżej mój pomysł na rozwiązanie, teoretycznie działa, lecz ten warunek nie do końca mi się podoba, może ktoś ma jakieś sugestie do korekty? |
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 171 Pomógł: 18 Dołączył: 13.03.2009 Skąd: lublin Ostrzeżenie: (0%) ![]() ![]() |
nie zrobiłeś rollbacka transakcji więc nastąpił (auto)Commit
|
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 1 Pomógł: 0 Dołączył: 22.05.2011 Ostrzeżenie: (0%) ![]() ![]() |
Jeszcze mam, jak dla mnie, trudniejsze zadanie: --Utwórz wyzwalacz Archiwizuj, który po usunięciu pracownika z tabeli pracownik automatycznie umieszcza jego dane w tabeli pracownik_archiwum, wraz z datą usunięcia i nazwą użytkownika dokonującego operacji usuwania (select user_name() zwraca nazwę aktualnego użytkownika). CREATE TRIGGER archiwizuj ON pracownik2 AFTER DELETE AS Czy ktoś byłby w stanie mnie naprowadzić jak napisać takiego triggera ? (mojego pierwszego triggera;)) |
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 12.06.2025 - 18:06 |