-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtrigger.sql
More file actions
160 lines (149 loc) · 4.38 KB
/
trigger.sql
File metadata and controls
160 lines (149 loc) · 4.38 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
USE BankDatabase
/*
Wyzwalacz na operacji na aktualizacji danych w tabeli Currency który nowe zaktualizowane wartości walut dodaje do tabeli z historią wartości walut
*/
CREATE TRIGGER OnCurrencyUpdate ON Currency
AFTER UPDATE
AS
BEGIN
DECLARE @iter int = 1
DECLARE @val int = (SELECT COUNT(C.currencyID) FROM Inserted C)
WHILE (@iter <= @val)
BEGIN
DECLARE @currencyID nvarchar(3) = (
SELECT TOP 1 A.currencyID FROM (
SELECT TOP(@iter) * FROM Inserted I
ORDER BY I.currencyID ASC
) A ORDER BY A.currencyID DESC
)
DECLARE @buyRate decimal(7,5) = (
SELECT TOP 1 A.buyRate FROM (
SELECT TOP(@iter) * FROM Inserted I
ORDER BY I.currencyID ASC
) A ORDER BY A.currencyID DESC
)
DECLARE @sellRate decimal(7,5) = (
SELECT TOP 1 A.sellRate FROM (
SELECT TOP(@iter) * FROM Inserted I
ORDER BY I.currencyID ASC
) A ORDER BY A.currencyID DESC
)
EXEC AddRatesHistory @currencyID, @buyRate, @sellRate
SET @iter = @iter + 1
END
END
GO
/*
Wyzwalacz na operacji na dodaniu danych do tabeli Currency który nowe dodane wartości nowej walut dodaje do tabeli z historią wartości walut
*/
CREATE TRIGGER OnCurrencyInsert ON Currency
AFTER INSERT
AS
BEGIN
DECLARE @iter int = 1
DECLARE @val int = (SELECT COUNT(C.currencyID) FROM Inserted C)
WHILE (@iter <= @val)
BEGIN
DECLARE @currencyID nvarchar(3) = (
SELECT TOP 1 A.currencyID FROM (
SELECT TOP(@iter) * FROM Inserted I
ORDER BY I.currencyID ASC
) A ORDER BY A.currencyID DESC
)
DECLARE @buyRate decimal(7,5) = (
SELECT TOP 1 A.buyRate FROM (
SELECT TOP(@iter) * FROM Inserted I
ORDER BY I.currencyID ASC
) A ORDER BY A.currencyID DESC
)
DECLARE @sellRate decimal(7,5) = (
SELECT TOP 1 A.sellRate FROM (
SELECT TOP(@iter) * FROM Inserted I
ORDER BY I.currencyID ASC
) A ORDER BY A.currencyID DESC
)
EXEC AddRatesHistory @currencyID, @buyRate, @sellRate
SET @iter = @iter + 1
END
END
GO
/*
Wyzwalacz na operacji dodania danych do tabeli z loginami klientów, który sprawdza czy nowy login nie istnieje juz w tabeli i zwraca ewentualną informację o niedostępności loginu
*/
CREATE TRIGGER LoginCheck ON LogInData
INSTEAD OF INSERT
AS
SELECT L.customerLogin FROM LogInData L WHERE L.customerLogin = (SELECT TOP 1 A.customerLogin FROM Inserted A)
IF (@@ROWCOUNT > 0)
BEGIN
RAISERROR('Login niedostepny', 16, 1)
ROLLBACK TRANSACTION
END
ELSE
BEGIN
INSERT INTO LogInData SELECT * FROM Inserted
END
GO
/*
Sprawdza czy wprowadzona do danych klienta (CustomerData) data urodzenia jest zgodna z numerem PESEL.
W przypadku błędnych danych operacja wstawiania nowego klienta jest wycofywana.
*/
CREATE TRIGGER peselCheck ON CustomerData
INSTEAD OF INSERT
AS
BEGIN
DECLARE @pesel char(11), @dateOfBirth date, @year int, @month int, @day int;
SELECT @pesel = pesel FROM INSERTED;
SET @year = CAST(SUBSTRING(@pesel, 1, 2) AS INT);
SET @month = CAST(SUBSTRING(@pesel, 3, 2) AS INT);
SET @day = CAST(SUBSTRING(@pesel, 5, 2) AS INT);
IF @month > 20
BEGIN
SET @year = @year + 2000;
SET @month = @month - 20;
END
ELSE
BEGIN
SET @year = @year + 1900;
END
SET @dateOfBirth = DATEFROMPARTS(@year, @month, @day);
IF @dateOfBirth <> (SELECT dateOfBirth FROM Inserted)
BEGIN
RAISERROR('Niepoprawny PESEL lub data urodzenia', 16, 1)
ROLLBACK TRANSACTION
END
ELSE
BEGIN
INSERT INTO CustomerData SELECT * FROM Inserted;
END
END
GO
/*
Fakt otworzenia lokaty (dodanie wiersza do Deposits) jest zapisywany w historii klienta (CustomerHistory).
*/
CREATE TRIGGER insertDeposit ON Deposits
AFTER INSERT
AS
BEGIN
DECLARE @accountID int, @customerID int;
SELECT @accountID = accountID FROM Inserted;
SET @customerID = (SELECT TOP 1 customerID FROM CustomerAccount WHERE accountID = @accountID); -- jesli wiecej wlascicieli, wez pierwszego
INSERT INTO CustomerHistory VALUES (@customerID, 3, 2, GETDATE()); -- 2-'OPEN DEPOSIT'
END
GO
/*
Zamknięcie lokaty, analogicznie jak insertDeposit.
*/
CREATE TRIGGER deleteDeposit ON Deposits
AFTER DELETE
AS
BEGIN
DECLARE @accountID int, @customerID int;
SELECT @accountID = accountID FROM Deleted;
IF @accountID IS NOT NULL
BEGIN
SET @customerID = (SELECT TOP 1 customerID FROM CustomerAccount WHERE accountID = @accountID); -- jesli wiecej wlascicieli, wez pierwszego
INSERT INTO CustomerHistory VALUES (@customerID, 4, 2, GETDATE()); -- 2-'CLOSE DEPOSIT'
END
END
GO