lab5/lab5.sql

193 lines
4.1 KiB
MySQL
Raw Normal View History

2022-11-22 10:23:06 +00:00
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
2022-11-29 10:15:04 +00:00
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