-
Notifications
You must be signed in to change notification settings - Fork 1
/
0030_DeployTargetDatabaseObjects.sql
164 lines (139 loc) · 4.73 KB
/
0030_DeployTargetDatabaseObjects.sql
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
-- Don't forget to connect to the target database
ALTER TABLE dim.Employee SET (SYSTEM_VERSIONING=OFF);
GO
DROP TABLE IF EXISTS dim.Employee;
DROP TABLE IF EXISTS dim.Employee_History;
DROP PROCEDURE IF EXISTS dim.Load_Employee;
DROP TYPE IF EXISTS dim.EmployeeType;
GO
DROP SCHEMA dim;
GO
DROP TABLE IF EXISTS Audit.OperationsEventLog;
DROP PROCEDURE IF EXISTS Audit.InsertOperationsEventLog;
GO
DROP SCHEMA Audit;
GO
CREATE SCHEMA Audit;
GO
CREATE TABLE Audit.OperationsEventLog
(
OpsSK int IDENTITY,
EventDateTime datetime DEFAULT GETDATE(),
EventState varchar(100),
SourceType varchar(100),
-- stored procedure, data factory pipeline, etc
SourceName varchar(100),
ErrorNumber int NULL,
ErrorMessage varchar(8000) NULL,
StatusMessage varchar(8000) NOT NULL
);
GO
CREATE SCHEMA dim;
GO
CREATE TABLE dim.Employee
(
EmployeeSK int identity NOT NULL,
SourceKey int NOT NULL,
firstName varchar(100) NOT NULL,
lastName varchar(100) NOT NULL,
[_ValidFrom] datetime2(0) GENERATED ALWAYS AS ROW START CONSTRAINT DF_ValidFrom DEFAULT (DATEADD(second, (-1), sysutcdatetime())) NOT NULL,
[_ValidTo] datetime2(0) GENERATED ALWAYS AS ROW END CONSTRAINT DF_ValidTo DEFAULT '9999.12.31 23.:59:59.99' NOT NULL,
CONSTRAINT PK_dim_Employee PRIMARY KEY NONCLUSTERED ([firstName], [lastName]),
CONSTRAINT UQ_dim_Employee UNIQUE (firstName, lastName),
PERIOD FOR SYSTEM_TIME ([_ValidFrom], [_ValidTo])
)
WITH (SYSTEM_VERSIONING = ON(HISTORY_TABLE=[dim].[Employee_History], DATA_CONSISTENCY_CHECK=ON));
GO
DROP PROCEDURE IF EXISTS dim.Load_Employee;
GO
DROP TYPE IF EXISTS dim.EmployeeType;
GO
DROP PROCEDURE IF EXISTS Audit.InsertOperationsEventLog;
GO
CREATE PROCEDURE Audit.InsertOperationsEventLog
@EventState varchar(100),
@SourceType varchar(100),
-- stored procedure, data factory pipeline, etc
@SourceName varchar(100),
@ErrorNumber int,
@ErrorMessage varchar(8000),
@StatusMessage varchar(8000)
AS
BEGIN
BEGIN TRY
INSERT INTO Audit.OperationsEventLog
([EventState], [SourceType], [SourceName], [ErrorNumber], [ErrorMessage], [StatusMessage])
VALUES
(@EventState, @SourceType, @SourceName, @ErrorNumber, @ErrorMessage, @StatusMessage)
END TRY
BEGIN CATCH
SELECT ERROR_NUMBER() as ErrorNumber,
ERROR_MESSAGE() as ErrorMessage;
THROW;
END CATCH
END
GO
CREATE TYPE dim.EmployeeType AS TABLE(
id int NOT NULL,
firstName varchar(100) NOT NULL,
lastName varchar(100) NOT NULL
);
GO
CREATE PROCEDURE dim.Load_Employee
@Employee as dim.EmployeeType READONLY
AS
BEGIN
DECLARE @ErrorNumber int = NULL;
DECLARE @ErrorMessage varchar(8000) = NULL;
DECLARE @StatusMessage varchar(8000) = NULL;
DECLARE @SourceRowCount int = 0;
BEGIN TRY
SELECT @SourceRowCount = ISNULL(COUNT(*), 0)
FROM @Employee
SET @StatusMessage = 'Starting load of dim.Employee. Source rowcount: ' + CONVERT(varchar(8000), @SourceRowCount)
EXEC Audit.InsertOperationsEventLog
@EventState = 'Information',
@SourceType = 'Stored Procedure',
@SourceName = '[dim].[Load_Employee]',
@ErrorNumber = NULL,
@ErrorMessage = NULL,
@StatusMessage = @StatusMessage;
MERGE INTO dim.Employee as TARGET
USING @Employee as SOURCE
ON TARGET.SourceKey = SOURCE.id
WHEN MATCHED AND
( SOURCE.firstName <> TARGET.firstName OR
SOURCE.lastName <> TARGET.lastName
)
THEN UPDATE SET
target.firstName = source.firstName,
target.lastName = source.lastName
WHEN NOT MATCHED BY TARGET THEN
INSERT(SourceKey, firstName, LastName)
VALUES (source.id, source.firstName, source.lastName)
WHEN NOT MATCHED BY SOURCE THEN
DELETE;
EXEC Audit.InsertOperationsEventLog
@EventState = 'Success',
@SourceType = 'Stored Procedure',
@SourceName = '[dim].[Load_Employee]',
@ErrorNumber = NULL,
@ErrorMessage = NULL,
@StatusMessage = 'Finished load of dim.Employee'
END TRY
BEGIN CATCH
SELECT ERROR_NUMBER() as ErrorNumber,
ERROR_MESSAGE() as ErrorMessage;
SET @ErrorNumber = ERROR_NUMBER();
SET @ErrorMessage = ERROR_MESSAGE();
EXEC Audit.InsertOperationsEventLog
@EventState = 'Failure',
@SourceType = 'Stored Procedure',
@SourceName = '[dim].[Load_Employee]',
@ErrorNumber = @ErrorNumber,
@ErrorMessage = @ErrorMessage,
@StatusMessage = 'Load of dim.Employee failed';
THROW;
END CATCH
END
GO