-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathassignment2.sql
More file actions
229 lines (214 loc) · 5.9 KB
/
assignment2.sql
File metadata and controls
229 lines (214 loc) · 5.9 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
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
--Create a new database named db_{yourfirstname}.
CREATE DATABASE db_hetvi
GO
USE db_hetvi
GO
--Create Customer Table
CREATE TABLE dbo.Customer
(ID int IDENTITY(1, 1) NOT NULL PRIMARY KEY,
CustomerID int NOT NULL UNIQUE,
FirstName NVARCHAR(50) NOT NULL,
LastName NVARCHAR(50) NOT NULL)
GO
--Create Orders Table
CREATE TABLE dbo.Orders
(OrderID int IDENTITY(1, 1) NOT NULL PRIMARY KEY,
CustomerID int NOT NULL,
OrderDate DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP)
GO
--Prevent deletion of a customer if they have existing orders.
--Create a custom error message using RAISEERROR to notify if the deletion of a customer with orders fails.
IF EXISTS (
SELECT 1
FROM sys.triggers
WHERE name = N'PreventCustomerDeletion'
)
DROP TRIGGER PreventCustomerDeletion;
GO
CREATE TRIGGER PreventCustomerDeletion ON dbo.Customer
INSTEAD OF DELETE
AS
IF EXISTS ( SELECT 1 FROM dbo.Orders WHERE CustomerID IN (SELECT CustomerID FROM deleted) )
BEGIN
RAISERROR ('Cannot delete customer with existing orders.',16,1);
RETURN;
END
DELETE FROM dbo.Customer WHERE CustomerID IN (SELECT CustomerID FROM deleted);
GO
--Ensure CustomerID update in Customer table updates related rows in Orders table
IF EXISTS (
SELECT 1
FROM sys.triggers
WHERE name = N'UpdateCustomerIDInOrders'
)
DROP TRIGGER UpdateCustomerIDInOrders;
GO
CREATE TRIGGER UpdateCustomerIDInOrders ON dbo.Customer
AFTER UPDATE
AS
IF UPDATE (CustomerID)
BEGIN
UPDATE Orders
SET CustomerID = i.CustomerID
FROM Orders o
JOIN inserted i ON o.CustomerID = (SELECT CustomerID FROM deleted)
WHERE o.CustomerID = (SELECT CustomerID FROM deleted)
END
GO
--When inserting or updating records in the Orders table, validate that the CustomerID exists in the Customer table. If not, use RAISEERROR to display an appropriate message.
IF EXISTS (
SELECT 1
FROM sys.triggers
WHERE name = N'ValidateCustomerIDInOrders'
)
DROP TRIGGER ValidateCustomerIDInOrders;
GO
CREATE TRIGGER ValidateCustomerIDInOrders ON dbo.Orders
FOR INSERT, UPDATE
AS
IF NOT EXISTS (SELECT 1 FROM Customer WHERE CustomerID IN (SELECT CustomerID FROM inserted))
BEGIN
RAISERROR ('Invalid CustomerID. Customer does not exist.', 16, 1);
ROLLBACK TRANSACTION;
END
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
--Create a Scalar Function
CREATE FUNCTION fn_CheckName
(
@FirstName NVARCHAR(50), @LastName NVARCHAR(50)
)
RETURNS BIT
AS
BEGIN
IF @FirstName = @LastName
RETURN 0;
RETURN 1;
END;
GO
--Create a Stored Procedure
CREATE PROCEDURE sp_InsertCustomer
@FirstName NVARCHAR(50),
@LastName NVARCHAR(50),
@CustomerID INT = NULL
AS
BEGIN
IF dbo.fn_CheckName(@FirstName, @LastName) = 0
BEGIN
RAISERROR ('First Name and Last Name cannot be identical.', 16, 1);
RETURN;
END;
IF @CustomerID IS NULL
BEGIN
SELECT @CustomerID = MAX(CustomerID) + 1 FROM dbo.Customer;
END
INSERT INTO Customer (CustomerID, FirstName, LastName)
VALUES (@CustomerID, @FirstName, @LastName);
END
GO
--Audit Logging
CREATE TABLE CusAudit (
AuditID INT IDENTITY(1,1) PRIMARY KEY,
CustomerIDOldValue INT,
CustomerIDNewValue INT,
FirstNameOldValue NVARCHAR(255),
FirstNameNewValue NVARCHAR(255),
LastNameOldValue NVARCHAR(255),
LastNameNewValue NVARCHAR(255),
ChangeDate DATETIME DEFAULT CURRENT_TIMESTAMP,
LoginName NVARCHAR(50) DEFAULT SYSTEM_USER
);
GO
CREATE TRIGGER Audit_Logging
ON dbo.Customer
AFTER INSERT, UPDATE, DELETE
AS
BEGIN
DECLARE @CustomerIDOld INT, @CustomerIDNew INT;
DECLARE @FirstNameOld NVARCHAR(255), @FirstNameNew NVARCHAR(255);
DECLARE @LastNameOld NVARCHAR(255), @LastNameNew NVARCHAR(255);
IF EXISTS (SELECT * FROM inserted) AND NOT EXISTS (SELECT * FROM deleted)
BEGIN
SELECT
@CustomerIDNew = i.CustomerID,
@FirstNameNew = i.FirstName,
@LastNameNew = i.LastName
FROM inserted i;
INSERT INTO dbo.CusAudit (
CustomerIDOldValue,
CustomerIDNewValue,
FirstNameOldValue,
FirstNameNewValue,
LastNameOldValue,
LastNameNewValue,
LoginName
)
SELECT
NULL,
@CustomerIDNew,
NULL,
@FirstNameNew,
NULL,
@LastNameNew,
SYSTEM_USER;
END
IF EXISTS (SELECT * FROM inserted) AND EXISTS (SELECT * FROM deleted)
BEGIN
SELECT
@CustomerIDOld = d.CustomerID,
@FirstNameOld = d.FirstName,
@LastNameOld = d.LastName
FROM deleted d;
SELECT
@CustomerIDNew = i.CustomerID,
@FirstNameNew = i.FirstName,
@LastNameNew = i.LastName
FROM inserted i;
INSERT INTO dbo.CusAudit (
CustomerIDOldValue,
CustomerIDNewValue,
FirstNameOldValue,
FirstNameNewValue,
LastNameOldValue,
LastNameNewValue,
LoginName
)
SELECT
@CustomerIDOld,
@CustomerIDNew,
@FirstNameOld,
@FirstNameNew,
@LastNameOld,
@LastNameNew,
SYSTEM_USER;
END
IF EXISTS (SELECT * FROM deleted) AND NOT EXISTS (SELECT * FROM inserted)
BEGIN
SELECT
@CustomerIDOld = d.CustomerID,
@FirstNameOld = d.FirstName,
@LastNameOld = d.LastName
FROM deleted d;
INSERT INTO dbo.CusAudit (
CustomerIDOldValue,
CustomerIDNewValue,
FirstNameOldValue,
FirstNameNewValue,
LastNameOldValue,
LastNameNewValue,
LoginName
)
SELECT
@CustomerIDOld,
NULL,
@FirstNameOld,
NULL,
@LastNameOld,
NULL,
SYSTEM_USER;
END
END
GO