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 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 -- 7. Korzystając z tabeli produkty stwórz transakcję, która przeniesie wszystkie -- produkty z magazynu nr 1 do magazynu nr 2. Maksymalna pojemność magazynu -- nr 2 wynosi 500. Jeżeli powyższa operacja spowoduje przepełnienie magazynu -- należy ją wycofać i przenieść produkty do magazynu nr 3. CREATE TABLE PRODUKTY ( ID_PRODUKT INT IDENTITY(1,1), ILOSC DECIMAL(8, 2), NR_MAGAZYNU INT ) -- ILOSC NR_MAGAZYNU INSERT INTO PRODUKTY VALUES (250, 1) INSERT INTO PRODUKTY VALUES (250, 2) INSERT INTO PRODUKTY VALUES (250, 3) SELECT * FROM PRODUKTY BEGIN TRANSACTION zmiana SAVE TRANSACTION p1 UPDATE PRODUKTY SET NR_MAGAZYNU=2 WHERE NR_MAGAZYNU=1 IF (SELECT sum(ILOSC) FROM PRODUKTY WHERE NR_MAGAZYNU=2) > 500 ROLLBACK TRANSACTION p1 UPDATE PRODUKTY SET NR_MAGAZYNU=3 WHERE NR_MAGAZYNU=1 COMMIT TRANSACTION