-
Notifications
You must be signed in to change notification settings - Fork 113
Expand file tree
/
Copy pathtSQLt.UndoTestDoubles.ssp.sql
More file actions
243 lines (221 loc) · 7.44 KB
/
tSQLt.UndoTestDoubles.ssp.sql
File metadata and controls
243 lines (221 loc) · 7.44 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
230
231
232
233
234
235
236
237
238
239
240
241
242
IF OBJECT_ID('tSQLt.UndoTestDoubles') IS NOT NULL DROP PROCEDURE tSQLt.UndoTestDoubles;
GO
---Build+
GO
CREATE PROCEDURE tSQLt.UndoTestDoubles
@Force BIT = 0
AS
BEGIN
DECLARE @cmd NVARCHAR(MAX);
DECLARE @ErrorMessageTableList NVARCHAR(MAX);
DECLARE @ErrorMessage NVARCHAR(MAX) = '';
/*-- Two non-temp objects, the first of which should be renamed to the second --*/
SELECT @ErrorMessage = @ErrorMessage + ISNULL(REPLACE('Attempting to remove object(s) that is/are not marked as temporary. Use @Force = 1 to override. (%s)','%s',Collisions.List),'')
FROM
(
SELECT
STUFF (
(
SELECT
', ' + QUOTENAME(OBJECT_SCHEMA_NAME(TestDouble.object_id))+'.'+QUOTENAME(TestDouble.name)
FROM tSQLt.Private_RenamedObjectLog AS ROL
JOIN sys.objects AS TestDouble
ON TestDouble.object_id = OBJECT_ID(QUOTENAME(OBJECT_SCHEMA_NAME(ROL.ObjectId))+'.'+QUOTENAME(PARSENAME(ROL.OriginalName,1)))
LEFT JOIN sys.extended_properties AS EP
ON EP.class_desc = 'OBJECT_OR_COLUMN'
AND EP.major_id = TestDouble.object_id
AND EP.name = 'tSQLt.IsTempObject'
AND EP.value = 1
WHERE EP.value IS NULL
ORDER BY 1
FOR XML PATH (''), TYPE
).value('.','NVARCHAR(MAX)'),
1,2,'')
) Collisions(List)
/*-- Attempting to rename two or more non-temp objects to the same name --*/
IF(EXISTS(
SELECT O.schema_id, ROL.OriginalName, COUNT(1) cnt
FROM tSQLt.Private_RenamedObjectLog ROL
JOIN sys.objects O
ON ROL.ObjectId = O.object_id
LEFT JOIN sys.extended_properties AS EP
ON EP.class_desc = 'OBJECT_OR_COLUMN'
AND EP.major_id = O.object_id
AND EP.name = 'tSQLt.IsTempObject'
AND EP.value = 1
WHERE EP.value IS NULL
GROUP BY O.schema_id, ROL.OriginalName
HAVING COUNT(1)>1
))
BEGIN
WITH S AS(
SELECT
C.Id,
C.OriginalName,
C.CurrentName,
C.SchemaName
FROM(
SELECT ROL.OriginalName, ROL.Id, O.name CurrentName, SCHEMA_NAME(O.schema_id) SchemaName, COUNT(1)OVER(PARTITION BY O.schema_id, ROL.OriginalName) Cnt
FROM tSQLt.Private_RenamedObjectLog ROL
JOIN sys.objects O
ON ROL.ObjectId = O.object_id
LEFT JOIN sys.extended_properties AS EP
ON EP.class_desc = 'OBJECT_OR_COLUMN'
AND EP.major_id = O.object_id
AND EP.name = 'tSQLt.IsTempObject'
AND EP.value = 1
WHERE EP.value IS NULL
)C
WHERE C.Cnt>1
),
ErrorTableLists AS(
SELECT
'{'+C.CList+'}-->' + QUOTENAME(SO.SchemaName)+'.'+QUOTENAME(PARSENAME(SO.OriginalName,1)) ErrorTableList,
QUOTENAME(SO.SchemaName)+'.'+QUOTENAME(PARSENAME(SO.OriginalName,1)) FullOriginalName
FROM (SELECT DISTINCT SchemaName, OriginalName FROM S) SO
CROSS APPLY (
SELECT (
STUFF(
(
SELECT ', '+QUOTENAME(SC.CurrentName)
FROM S AS SC
WHERE SC.OriginalName = SO.OriginalName
AND SC.SchemaName = SO.SchemaName
ORDER BY SC.Id
FOR XML PATH(''),TYPE
).value('.','NVARCHAR(MAX)'),
1,2,'')
) CList
)C
)
SELECT @ErrorMessageTableList = (
STUFF(
(
SELECT '; '+ETL.ErrorTableList
FROM ErrorTableLists ETL
ORDER BY ETL.FullOriginalName
FOR XML PATH(''),TYPE
).value('.','NVARCHAR(MAX)'),
1,2,''
)
);
SELECT @ErrorMessage = @ErrorMessage + REPLACE('Attempting to rename two or more objects to the same name. Use @Force = 1 to override, only first object of each rename survives. (%s)','%s',@ErrorMessageTableList);
END;
IF(@ErrorMessage <> '')
BEGIN
IF (@Force = 1)
BEGIN
SET @ErrorMessage = 'WARNING: @Force has been set to 1. Overriding the following error(s):'+@ErrorMessage;
EXEC tSQLt.Private_Print @Message = @ErrorMessage;
END;
ELSE
BEGIN
RAISERROR(@ErrorMessage,16,10);
END;
END;
SELECT TOP(0)A.* INTO #RenamedObjects FROM tSQLt.Private_RenamedObjectLog A RIGHT JOIN tSQLt.Private_RenamedObjectLog X ON 1=0;
BEGIN TRAN;
INSERT INTO #RenamedObjects
SELECT * FROM tSQLt.Private_RenamedObjectLog;
TRUNCATE TABLE tSQLt.Private_RenamedObjectLog;
WITH MarkedTestDoubles AS
(
SELECT
TempO.Name,
SCHEMA_NAME(TempO.schema_id) SchemaName,
TempO.type ObjectType
FROM sys.objects TempO
JOIN sys.extended_properties AS EP
ON EP.class_desc = 'OBJECT_OR_COLUMN'
AND EP.major_id = TempO.object_id
AND EP.name = 'tSQLt.IsTempObject'
AND EP.value = 1
)
SELECT @cmd =
(
SELECT
DC.cmd+';'
FROM MarkedTestDoubles MTD
CROSS APPLY tSQLt.Private_GetDropItemCmd(QUOTENAME(MTD.SchemaName)+'.'+QUOTENAME(MTD.Name),MTD.ObjectType) DC
FOR XML PATH(''),TYPE
).value('.','NVARCHAR(MAX)');
EXEC(@cmd);
SELECT @cmd =
(
SELECT
DC.cmd+';'
FROM(
SELECT
*
FROM(
SELECT
ROL.OriginalName,
O.object_id,
O.type ObjectType,
SCHEMA_NAME(O.schema_id) SchemaName,
O.name CurrentName,
ROW_NUMBER()OVER(PARTITION BY O.schema_id, ROL.OriginalName ORDER BY ROL.Id) RN
FROM #RenamedObjects AS ROL
JOIN sys.objects O
ON O.object_id = ROL.ObjectId
)ROLI
WHERE ROLI.RN>1
)Deletables
CROSS APPLY tSQLt.Private_GetDropItemCmd(QUOTENAME(Deletables.SchemaName)+'.'+QUOTENAME(Deletables.CurrentName),Deletables.ObjectType) DC
FOR XML PATH(''),TYPE
).value('.','NVARCHAR(MAX)');
EXEC(@cmd);
WITH LL AS
(
SELECT
ROL.Id,
ParentROL.Id ParentId,
ISNULL(ParentROL.Id,ROL.Id) SortId,
ROL.ObjectId,
OBJECT_SCHEMA_NAME(ROL.ObjectId) SchemaName,
OBJECT_NAME(ROL.ObjectId) CurrentName,
PARSENAME(ROL.OriginalName,1) OriginalName
FROM #RenamedObjects ROL
JOIN sys.objects O
ON ROL.ObjectId = O.object_id
LEFT JOIN #RenamedObjects ParentROL
ON O.parent_object_id = ParentROL.ObjectId
),
L AS
(
SELECT
LL.Id,
LL.ParentId,
LL.SortId,
LL.ObjectId,
LL.SchemaName,
LL.CurrentName,
LL.OriginalName,
FakeO.type ObjectType,
CASE WHEN EP.value IS NOT NULL THEN 1 ELSE 0 END IsTempObject
FROM LL
LEFT JOIN sys.objects FakeO
ON FakeO.object_id = OBJECT_ID(QUOTENAME(LL.SchemaName)+'.'+QUOTENAME(LL.OriginalName))
LEFT JOIN sys.extended_properties AS EP
ON EP.class_desc = 'OBJECT_OR_COLUMN'
AND EP.major_id = FakeO.object_id
AND EP.name = 'tSQLt.IsTempObject'
AND EP.value = 1
)
SELECT @cmd =
(
SELECT
ISNULL(CASE
WHEN L.ParentId IS NULL THEN DC.cmd+';'
ELSE NULL
END,'')+
'EXEC tSQLt.Private_RenameObject '''+L.SchemaName+''','''+L.CurrentName+''','''+L.OriginalName+''';'
FROM L
CROSS APPLY tSQLt.Private_GetDropItemCmd(QUOTENAME(L.SchemaName)+'.'+QUOTENAME(L.OriginalName),L.ObjectType) DC
ORDER BY L.SortId DESC, L.Id ASC
FOR XML PATH(''),TYPE
).value('.','NVARCHAR(MAX)');
EXEC(@cmd);
COMMIT;
END;
GO