-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathStoredProcedures.sql
More file actions
196 lines (154 loc) · 4.63 KB
/
StoredProcedures.sql
File metadata and controls
196 lines (154 loc) · 4.63 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
IF EXISTS (
SELECT *
FROM INFORMATION_SCHEMA.ROUTINES
WHERE SPECIFIC_SCHEMA = N'dbo'
AND SPECIFIC_NAME = N'USP_TableVersionChangeTracking'
)
DROP PROCEDURE dbo.USP_TableVersionChangeTracking
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
Create PROCEDURE USP_TableVersionChangeTracking
@VersionToStart Int = NULL -- Set it to null if you want to get chnage trackings as they are produced
AS
/*
This is the main stored procedure that is responsible for tracking the table changes and returning the change tracking information.
It track the changes and store the last processed version into LastVersionProcessed table so can track the future changes.
Alternatively, we can get specific version changes by supplying the @VersionToStart parameter.
Usage example:
DECLARE @VersionToStart int = null -- Set it to null if you want to get chnage trackings as they are produced
EXEC USP_TableVersionChangeTracking @VersionToStart
*/
BEGIN
/*
Just to instruct Entity framework to generate columns
*/
SET FMTONLY OFF
SET NOCOUNT ON;
-- Begin batch transaction
BEGIN TRANSACTION
DECLARE @LastProcessedVersion BIGINT;
SELECT @LastProcessedVersion = ISNULL([Version],-1) FROM LastVersionProcessed;
DECLARE @PreviousVersion BIGINT = COALESCE(@VersionToStart, @LastProcessedVersion, CHANGE_TRACKING_CURRENT_VERSION() );
BEGIN TRY
/*
Drop the temporary tables if exist at all
*/
IF OBJECT_ID(N'tempdb.dbo.#TablesWithChangeTracking', 'U') IS NOT NULL
BEGIN
DROP TABLE #TablesWithChangeTracking;
END;
IF OBJECT_ID(N'tempdb.dbo.#TableChanges', 'U') IS NOT NULL
BEGIN
DROP TABLE #TableChanges;
END;
/*
All the tables that change tracking is enabled for
*/
CREATE TABLE #TablesWithChangeTracking
(
Id INT Identity(1,1) Primary key,
Name varchar(500),
ObjectId int,
ChangeVersion int,
)
INSERT INTO #TablesWithChangeTracking
SELECT
st.name,
st.object_id,
ct.is_track_columns_updated_on
FROM sys.change_tracking_tables ct
JOIN sys.tables st
ON st.object_id = ct.object_id
DECLARE @tablename NVARCHAR(500),
@id int;
DECLARE @sql NVARCHAR(1000);
/*
Tables with change tracking records
*/
CREATE TABLE #TableChanges
(
Id INT Primary key IDENTITY(1,1),
Name varchar(500) NULL,
SysChangeOperation varchar(2) null,
SysChangeVersion int null
)
/*
For each table that tracking is enabled, find the changed records and insert into temp table
*/
While (SELECT COUNT(1) FROM #TablesWithChangeTracking) > 0
BEGIN
SELECT
@tablename = name,
@id = id
FROM #TablesWithChangeTracking
SET @sql =
N'
INSERT INTO #TableChanges (Name, SysChangeVersion, SysChangeOperation)
SELECT
''' + @tablename + ''',
Sys_change_version,
Sys_change_operation
FROM CHANGETABLE
(CHANGES ' + @tablename + ', ' + Cast(@PreviousVersion AS VARCHAR) + ' ) AS CT
'
EXECUTE (@sql)
-- Drope the row that is already processed
DELETE #TablesWithChangeTracking WHERE Id = @id
END
/*
Update the table to keep track of last processed tracking
*/
IF(SELECT COUNT(*) FROM #TableChanges WHERE SysChangeVersion IS NOT NULL) > 0 AND @VersionToStart IS NULL
BEGIN
DECLARE @LastVersionProcessed BIGINT = NULL;
SELECT @LastVersionProcessed = ISNULL([Version], -1) FROM LastVersionProcessed
Declare @SysChangeVersion BIGINT
Select @SysChangeVersion = Max(SysChangeVersion) FROM #TableChanges WHERE SysChangeVersion IS NOT NULL
IF(@LastVersionProcessed < 0)
INSERT INTO LastVersionProcessed VALUES(@SysChangeVersion);
ELSE
UPDATE LastVersionProcessed SET [Version] = @SysChangeVersion;
END
SELECT * FROM #TableChanges
WHERE SysChangeVersion IS NOT NULL
DROP TABLE #TablesWithChangeTracking
DROP table #TableChanges
-- Commit all changes
COMMIT;
END TRY
BEGIN Catch
-- Rollback transaction
ROLLBACK
SELECT
ERROR_NUMBER() AS ErrorNumber
,ERROR_SEVERITY() AS ErrorSeverity
,ERROR_STATE() AS ErrorState
,ERROR_PROCEDURE() AS ErrorProcedure
,ERROR_LINE() AS ErrorLine
,ERROR_MESSAGE() AS ErrorMessage;
END Catch
END
GO
IF EXISTS (
SELECT *
FROM INFORMATION_SCHEMA.ROUTINES
WHERE SPECIFIC_SCHEMA = N'dbo'
AND SPECIFIC_NAME = N'Usp_GetChangeTrackingVersion'
)
DROP PROCEDURE dbo.Usp_GetChangeTrackingVersion
GO
CREATE PROC Usp_GetChangeTrackingVersion
AS
/*
Returns the current change tracking version from the database
Usage example:
EXEC Usp_GetChangeTrackingVersion
*/
BEGIN
Select CHANGE_TRACKING_CURRENT_VERSION ()
END
GO