diff --git a/lab5.sql b/lab5.sql index 8953e97..ef44796 100644 --- a/lab5.sql +++ b/lab5.sql @@ -43,4 +43,151 @@ RETURN @i DECLARE @z int EXEC @z=ilosc -PRINT @z \ No newline at end of file +PRINT @z + + + + +USE w65567_FIRMA; + +-- 0. przygotuj komunikat 'Jest X sprzedawców' +DECLARE @b int +SELECT @b=count(*) FROM Pracownicy WHERE STANOWISKO='Sprzedawca' +PRINT 'Jest '+cast(@b AS varchar)+' sprzedawcow' + +-- 1. Zarobki poniżej 3 tys należy zwiększyć o 20%, a zarobki powyżej 3 tys +-- należy obniżyć o 10% +UPDATE Pracownicy +SET PENSJA=( + CASE + WHEN PENSJA < 3000 THEN PENSJA*1.2 + WHEN PENSJA > 3000 THEN PENSJA*0.9 + ELSE PENSJA + END +) + +SELECT * FROM Pracownicy + + +-- 2. Stwórz procedurę która wypisze najwcześniej zatrudnione osoby, w każdym +-- departamencie. Identyfikator departamentu powinien być przekazanym jako +-- argument procedur. Natomiast data zatrudnienia przekazywana jest przez +-- drugi argument, który jest zadeklarowany jako wyjściowy. +CREATE PROC zad2 ( + @d int, + @data date OUTPUT +) AS +SELECT @data=min(data_zatrud) FROM Pracownicy +WHERE KOD_dzialu=@d + + +DECLARE @data DATE +EXEC zad2 10, @data OUTPUT +PRINT @data + +CREATE PROC ilosc +AS +DECLARE @i int +SELECT @i=count(identyfikator) FROM Pracownicy +RETURN @i + +DECLARE @z int +EXEC @z=ilosc +PRINT @z + + +-- triggery +CREATE TRIGGER tr1 +ON PRACOWNICY +AFTER INSERT, DELETE, UPDATE +AS +BEGIN + SELECT * FROM inserted + SELECT * FROM deleted +END + +INSERT INTO PRACOWNICY (nazwisko, imie) VALUES ('Zdzichowski', 'Zdzichu') +DELETE FROM PRACOWNICY WHERE IDENTYFIKATOR=16 + +UPDATE PRACOWNICY SET PENSJA = 3000 WHERE IDENTYFIKATOR=17 + +DROP TRIGGER tr1 + +-- 4. Zdefiniuj wyzwalacz, który zabroni zmniejszania pensji pracownikom +CREATE TRIGGER tr2 +ON PRACOWNICY +AFTER UPDATE +AS +BEGIN + IF UPDATE(PENSJA) + BEGIN + DECLARE @nowa DECIMAL(10,2 ), @stara DECIMAL(10, 2) + SELECT @nowa = PENSJA FROM inserted + SELECT @stara = PENSJA FROM deleted + IF @nowa < @stara + ROLLBACK + END +END + +SELECT * FROM PRACOWNICY +UPDATE PRACOWNICY SET PENSJA=4000 WHERE IDENTYFIKATOR=17 + +CREATE TRIGGER tr3 +ON PRACOWNICY +AFTER UPDATE +AS +BEGIN + IF UPDATE(PENSJA) + BEGIN + UPDATE PRACOWNICY SET PENSJA=deleted.PENSJA + FROM PRACOWNICY INNER JOIN deleted + ON PRACOWNICY.IDENTYFIKATOR = deleted.IDENTYFIKATOR + WHERE PRACOWNICY.PENSJA < deleted.PENSJA + END +END + + +-- 5. Dla relacji Pracownicy stwórz wyzwalacz, który w przypadku braku prowizji +-- zamieni wartość NULL na 10. +CREATE TRIGGER tr5 +ON PRACOWNICY +AFTER INSERT, UPDATE +AS +BEGIN + IF UPDATE(PROWIZJA) + BEGIN + DECLARE @test DECIMAL(10, 2) + SELECT @test = PROWIZJA FROM inserted + IF @test IS NULL + BEGIN + UPDATE PRACOWNICY SET PROWIZJA=10 + FROM PRACOWNICY + INNER JOIN inserted + ON Pracownicy.IDENTYFIKATOR = inserted.IDENTYFIKATOR + END + END +END + +INSERT INTO PRACOWNICY (nazwisko, imie) VALUES ('Zdzichowski', 'Zdzichu') +UPDATE PRACOWNICY SET PROWIZJA=null WHERE IDENTYFIKATOR=13 + + +-- 6. Zapisz w tabeli LOG informacje o tym kto skasował którego klienta. +CREATE TABLE REJESTR ( + kto VARCHAR(30), + kogo VARCHAR(30), + kiedy DATE +) + +CREATE TRIGGER TR_REJESTR +ON PRACOWNICY +AFTER DELETE +AS +BEGIN + INSERT INTO REJESTR VALUES (suser_name(), (SELECT nazwisko FROM deleted), getdate()) +END + +SELECT * FROM REJESTR +SELECT * FROM PRACOWNICY + +DELETE FROM PRACOWNICY WHERE IDENTYFIKATOR=17 \ No newline at end of file