lab5/lab5.sql

218 lines
5.0 KiB
Transact-SQL

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