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
|
|
|
|
|
2022-12-06 09:17:16 +00:00
|
|
|
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
|