sql_cmd 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (56) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +201 -0
  3. data/lib/optional_dependencies.rb +30 -0
  4. data/lib/sql_cmd/agent.rb +32 -0
  5. data/lib/sql_cmd/always_on.rb +267 -0
  6. data/lib/sql_cmd/azure.rb +80 -0
  7. data/lib/sql_cmd/backups.rb +276 -0
  8. data/lib/sql_cmd/config.rb +62 -0
  9. data/lib/sql_cmd/database.rb +618 -0
  10. data/lib/sql_cmd/format.rb +124 -0
  11. data/lib/sql_cmd/query.rb +350 -0
  12. data/lib/sql_cmd/security.rb +21 -0
  13. data/lib/sql_cmd/sql_helper.ps1 +89 -0
  14. data/lib/sql_cmd.rb +44 -0
  15. data/sql_scripts/Agent/CreateSQLJob.sql +81 -0
  16. data/sql_scripts/Agent/JobLastRunInfo.sql +70 -0
  17. data/sql_scripts/Agent/JobRunStatus.sql +21 -0
  18. data/sql_scripts/Agent/SQLAgentStatus.sql +8 -0
  19. data/sql_scripts/AlwaysOn/AddDatabaseToAvailabilityGroupOnSecondary.sql +72 -0
  20. data/sql_scripts/AlwaysOn/AddDatabaseToPrimaryAvailabilityGroup.sql +16 -0
  21. data/sql_scripts/AlwaysOn/AutomaticSeedingProgress.sql +34 -0
  22. data/sql_scripts/AlwaysOn/ConfigurePrimaryForAutomaticSeeding.sql +2 -0
  23. data/sql_scripts/AlwaysOn/ConfigurePrimaryForManualSeeding.sql +2 -0
  24. data/sql_scripts/AlwaysOn/ConfigureSecondaryForAutomaticSeeding.sql +1 -0
  25. data/sql_scripts/AlwaysOn/DropSecondary.sql +58 -0
  26. data/sql_scripts/AlwaysOn/RemoveDatabaseFromGroup.sql +2 -0
  27. data/sql_scripts/AlwaysOn/SynchronizationState.sql +14 -0
  28. data/sql_scripts/Database/BackupDatabase.sql +95 -0
  29. data/sql_scripts/Database/CompressAllTables.sql +100 -0
  30. data/sql_scripts/Database/CreateLogin.sql +16 -0
  31. data/sql_scripts/Database/DropDatabase.sql +51 -0
  32. data/sql_scripts/Database/GetBackupFiles.sql +31 -0
  33. data/sql_scripts/Database/GetBackupHeaders.sql +94 -0
  34. data/sql_scripts/Database/GetFileInfoFromBackup.sql +9 -0
  35. data/sql_scripts/Database/RestoreDatabase.sql +185 -0
  36. data/sql_scripts/Database/SetFullRecovery.sql +19 -0
  37. data/sql_scripts/Database/SetSQLCompatibility.sql +33 -0
  38. data/sql_scripts/Security/AssignDatabaseRoles.sql +44 -0
  39. data/sql_scripts/Security/CreateOrUpdateCredential.sql +11 -0
  40. data/sql_scripts/Security/CreateSqlLogin.sql +20 -0
  41. data/sql_scripts/Security/ExportDatabasePermissions.sql +757 -0
  42. data/sql_scripts/Security/GenerateCreateLoginsScript.sql +144 -0
  43. data/sql_scripts/Security/GenerateValidateLoginsScript.sql +83 -0
  44. data/sql_scripts/Security/GetUserSID.sql +3 -0
  45. data/sql_scripts/Security/UpdateSqlPassword.sql +24 -0
  46. data/sql_scripts/Security/ValidateDatabaseRoles.sql +12 -0
  47. data/sql_scripts/Status/ANSINullsOffTableCount.sql +13 -0
  48. data/sql_scripts/Status/ANSINullsOffTables.sql +9 -0
  49. data/sql_scripts/Status/BackupProgress.sql +17 -0
  50. data/sql_scripts/Status/DatabaseInfo.sql +199 -0
  51. data/sql_scripts/Status/DatabaseSize.sql +26 -0
  52. data/sql_scripts/Status/DiskSpace.sql +14 -0
  53. data/sql_scripts/Status/RestoreProgress.sql +17 -0
  54. data/sql_scripts/Status/SQLSettings.sql +182 -0
  55. data/sql_scripts/Status/UncompressedTableCount.sql +27 -0
  56. metadata +224 -0
@@ -0,0 +1,757 @@
1
+ DECLARE @DBName sysname = NULL,
2
+ @Principal sysname = NULL,
3
+ @Role sysname = NULL,
4
+ @Type nvarchar(30) = NULL,
5
+ @ObjectName sysname = NULL,
6
+ @Permission sysname = NULL,
7
+ @LoginName sysname = NULL,
8
+ @UseLikeSearch bit = 1,
9
+ @IncludeMSShipped bit = 1,
10
+ @DropTempTables bit = 1,
11
+ @Output varchar(30) = 'Default',
12
+ @Print bit = 0,
13
+ @IncludeTablePermissions bit = 0,
14
+ @newline nvarchar(2) = CHAR(13)+CHAR(10),
15
+ @sql_script nvarchar(max) = NULL
16
+
17
+ SET @sql_script = 'USE [$(' + 'databasename)]' + @newline -- Split up variable syntax in order to pass it through as a variable.
18
+
19
+ SET NOCOUNT ON
20
+
21
+ SET @DBName = '$(databasename)'
22
+ SET @Output = '$(output)' -- 'CreateOnly', 'DropOnly', 'ScriptOnly', 'Report', 'Default'
23
+ SET @IncludeTablePermissions = $(includetablepermissions)
24
+
25
+ DECLARE @Collation nvarchar(75)
26
+ SET @Collation = N' COLLATE ' + CAST(SERVERPROPERTY('Collation') AS nvarchar(50))
27
+
28
+ DECLARE @sql nvarchar(max)
29
+ DECLARE @sql2 nvarchar(max)
30
+ DECLARE @ObjectList nvarchar(max)
31
+ DECLARE @use nvarchar(500)
32
+ DECLARE @AllDBNames sysname
33
+
34
+ IF @DBName IS NULL OR @DBName = N'All'
35
+ BEGIN
36
+ SET @use = ''
37
+ IF @DBName IS NULL
38
+ SET @DBName = DB_NAME()
39
+ END
40
+ ELSE
41
+ -- IF EXISTS (SELECT 1 FROM sys.databases WHERE name = @DBName)
42
+ IF db_id(@DBName) IS NOT NULL
43
+ SET @use = N'USE ' + QUOTENAME(@DBName) + N';' + NCHAR(13)
44
+ ELSE
45
+ BEGIN
46
+ RAISERROR (N'%s is not a valid database name.',
47
+ 16,
48
+ 1,
49
+ @DBName)
50
+ RETURN
51
+ END
52
+
53
+ DECLARE @LikeOperator nvarchar(4)
54
+
55
+ IF @UseLikeSearch = 1
56
+ SET @LikeOperator = N'LIKE'
57
+ ELSE
58
+ SET @LikeOperator = N'='
59
+
60
+ IF @UseLikeSearch = 1
61
+ BEGIN
62
+ IF LEN(ISNULL(@Principal,'')) > 0
63
+ SET @Principal = N'%' + @Principal + N'%'
64
+
65
+ IF LEN(ISNULL(@Role,'')) > 0
66
+ SET @Role = N'%' + @Role + N'%'
67
+
68
+ IF LEN(ISNULL(@ObjectName,'')) > 0
69
+ SET @ObjectName = N'%' + @ObjectName + N'%'
70
+
71
+ IF LEN(ISNULL(@LoginName,'')) > 0
72
+ SET @LoginName = N'%' + @LoginName + N'%'
73
+ END
74
+
75
+ IF @Print = 1 AND @DBName = N'All'
76
+ BEGIN
77
+ PRINT 'DECLARE @AllDBNames sysname'
78
+ PRINT 'SET @AllDBNames = ''master'''
79
+ PRINT ''
80
+ END
81
+ --=========================================================================
82
+ -- Database Principals
83
+ SET @sql =
84
+ N'SELECT ' + CASE WHEN @DBName = 'All' THEN N'@AllDBNames' ELSE N'''' + @DBName + N'''' END + N' AS DBName,' +
85
+ N' DBPrincipals.principal_id AS DBPrincipalId, DBPrincipals.name AS DBPrincipal, SrvPrincipals.name AS SrvPrincipal, ' + NCHAR(13) +
86
+ N' DBPrincipals.type, DBPrincipals.type_desc, DBPrincipals.default_schema_name, DBPrincipals.create_date, ' + NCHAR(13) +
87
+ N' DBPrincipals.modify_date, DBPrincipals.is_fixed_role, ' + NCHAR(13) +
88
+ N' Authorizations.name AS RoleAuthorization, DBPrincipals.sid, ' + NCHAR(13) +
89
+ N' CASE WHEN DBPrincipals.is_fixed_role = 0 AND DBPrincipals.name NOT IN (''dbo'',''guest'', ''INFORMATION_SCHEMA'', ''public'', ''sys'') THEN ' + NCHAR(13) +
90
+ CASE WHEN @DBName = 'All' THEN N' ''USE '' + QUOTENAME(@AllDBNames) + ''; '' + ' + NCHAR(13) ELSE N'' END +
91
+ N' ''IF DATABASE_PRINCIPAL_ID('''''' + DBPrincipals.name + '''''') IS NOT NULL '' + ' + NCHAR(13) +
92
+ N' ''DROP '' + CASE DBPrincipals.[type] WHEN ''C'' THEN NULL ' + NCHAR(13) +
93
+ N' WHEN ''K'' THEN NULL ' + NCHAR(13) +
94
+ N' WHEN ''R'' THEN ''ROLE'' ' + NCHAR(13) +
95
+ N' WHEN ''A'' THEN ''APPLICATION ROLE'' ' + NCHAR(13) +
96
+ N' ELSE ''USER'' END + ' + NCHAR(13) +
97
+ N' '' ''+QUOTENAME(DBPrincipals.name' + @Collation + N') + '';'' ELSE NULL END AS DropScript, ' + NCHAR(13) +
98
+ N' CASE WHEN DBPrincipals.is_fixed_role = 0 AND DBPrincipals.name NOT IN (''dbo'',''guest'', ''INFORMATION_SCHEMA'', ''public'', ''sys'') THEN ' + NCHAR(13) +
99
+ CASE WHEN @DBName = 'All' THEN N' ''USE '' + QUOTENAME(@AllDBNames) + ''; '' + ' +NCHAR(13) ELSE N'' END +
100
+ N' ''IF DATABASE_PRINCIPAL_ID('''''' + DBPrincipals.name + '''''') IS NULL '' + ' + NCHAR(13) +
101
+ N' ''CREATE '' + CASE DBPrincipals.[type] WHEN ''C'' THEN NULL ' + NCHAR(13) +
102
+ N' WHEN ''K'' THEN NULL ' + NCHAR(13) +
103
+ N' WHEN ''R'' THEN ''ROLE'' ' + NCHAR(13) +
104
+ N' WHEN ''A'' THEN ''APPLICATION ROLE'' ' + NCHAR(13) +
105
+ N' ELSE ''USER'' END + ' + NCHAR(13) +
106
+ N' '' ''+QUOTENAME(DBPrincipals.name' + @Collation + N') END + ' + NCHAR(13) +
107
+ N' CASE WHEN DBPrincipals.[type] = ''R'' THEN ' + NCHAR(13) +
108
+ N' ISNULL('' AUTHORIZATION ''+QUOTENAME(Authorizations.name' + @Collation + N'),'''') ' + NCHAR(13) +
109
+ N' WHEN DBPrincipals.[type] = ''A'' THEN ' + NCHAR(13) +
110
+ N' '''' ' + NCHAR(13) +
111
+ N' WHEN DBPrincipals.[type] NOT IN (''C'',''K'') THEN ' + NCHAR(13) +
112
+ N' ISNULL('' FOR LOGIN '' +
113
+ QUOTENAME(SrvPrincipals.name' + @Collation + N'),'' WITHOUT LOGIN'') + ' + NCHAR(13) +
114
+ N' ISNULL('' WITH DEFAULT_SCHEMA = ''+
115
+ QUOTENAME(DBPrincipals.default_schema_name' + @Collation + N'),'''') ' + NCHAR(13) +
116
+ N' ELSE '''' ' + NCHAR(13) +
117
+ N' END + '';'' + ' + NCHAR(13) +
118
+ N' CASE WHEN DBPrincipals.[type] NOT IN (''C'',''K'',''R'',''A'') ' + NCHAR(13) +
119
+ N' AND SrvPrincipals.name IS NULL ' + NCHAR(13) +
120
+ N' AND DBPrincipals.sid IS NOT NULL ' + NCHAR(13) +
121
+ N' AND DBPrincipals.sid NOT IN (0x00, 0x01) ' + NCHAR(13) +
122
+ N' THEN '' -- Possible missing server principal'' ' + NCHAR(13) +
123
+ N' ELSE '''' END ' + NCHAR(13) +
124
+ N' AS CreateScript ' + NCHAR(13) +
125
+ N'FROM sys.database_principals DBPrincipals ' + NCHAR(13) +
126
+ N'LEFT OUTER JOIN sys.database_principals Authorizations ' + NCHAR(13) +
127
+ N' ON DBPrincipals.owning_principal_id = Authorizations.principal_id ' + NCHAR(13) +
128
+ N'LEFT OUTER JOIN sys.server_principals SrvPrincipals ' + NCHAR(13) +
129
+ N' ON DBPrincipals.sid = SrvPrincipals.sid ' + NCHAR(13) +
130
+ N' AND DBPrincipals.sid NOT IN (0x00, 0x01) ' + NCHAR(13) +
131
+ N'WHERE 1=1 '
132
+
133
+ IF LEN(ISNULL(@Principal,@Role)) > 0
134
+ IF @Print = 1
135
+ SET @sql = @sql + NCHAR(13) + N' AND DBPrincipals.name ' + @LikeOperator + N' ' +
136
+ ISNULL(QUOTENAME(@Principal,N''''),QUOTENAME(@Role,''''))
137
+ ELSE
138
+ SET @sql = @sql + NCHAR(13) + N' AND DBPrincipals.name ' + @LikeOperator + N' ISNULL(@Principal,@Role) '
139
+
140
+ IF LEN(@Type) > 0
141
+ IF @Print = 1
142
+ SET @sql = @sql + NCHAR(13) + N' AND DBPrincipals.type ' + @LikeOperator + N' ' + QUOTENAME(@Type,'''')
143
+ ELSE
144
+ SET @sql = @sql + NCHAR(13) + N' AND DBPrincipals.type ' + @LikeOperator + N' @Type'
145
+
146
+ IF LEN(@LoginName) > 0
147
+ IF @Print = 1
148
+ SET @sql = @sql + NCHAR(13) + N' AND SrvPrincipals.name ' + @LikeOperator + N' ' + QUOTENAME(@LoginName,'''')
149
+ ELSE
150
+ SET @sql = @sql + NCHAR(13) + N' AND SrvPrincipals.name ' + @LikeOperator + N' @LoginName'
151
+
152
+ IF LEN(@ObjectName) > 0
153
+ BEGIN
154
+ SET @sql = @sql + NCHAR(13) +
155
+ N' AND EXISTS (SELECT 1 ' + NCHAR(13) +
156
+ N' FROM sys.all_objects [Objects] ' + NCHAR(13) +
157
+ N' INNER JOIN sys.database_permissions Permission ' + NCHAR(13) +
158
+ N' ON Permission.major_id = [Objects].object_id ' + NCHAR(13) +
159
+ N' WHERE Permission.major_id = [Objects].object_id ' + NCHAR(13) +
160
+ N' AND Permission.grantee_principal_id = DBPrincipals.principal_id ' + NCHAR(13)
161
+
162
+ IF @Print = 1
163
+ SET @sql = @sql + N' AND [Objects].name ' + @LikeOperator + N' ' + QUOTENAME(@ObjectName,'''')
164
+ ELSE
165
+ SET @sql = @sql + N' AND [Objects].name ' + @LikeOperator + N' @ObjectName'
166
+
167
+ SET @sql = @sql + N')'
168
+ END
169
+
170
+ IF LEN(@Permission) > 0
171
+ BEGIN
172
+ SET @sql = @sql + NCHAR(13) +
173
+ N' AND EXISTS (SELECT 1 ' + NCHAR(13) +
174
+ N' FROM sys.database_permissions Permission ' + NCHAR(13) +
175
+ N' WHERE Permission.grantee_principal_id = DBPrincipals.principal_id ' + NCHAR(13)
176
+
177
+ IF @Print = 1
178
+ SET @sql = @sql + N' AND Permission.permission_name ' + @LikeOperator + N' ' + QUOTENAME(@Permission,'''')
179
+ ELSE
180
+ SET @sql = @sql + N' AND Permission.permission_name ' + @LikeOperator + N' @Permission'
181
+
182
+ SET @sql = @sql + N')'
183
+ END
184
+
185
+ IF @IncludeMSShipped = 0
186
+ SET @sql = @sql + NCHAR(13) + N' AND DBPrincipals.is_fixed_role = 0 ' + NCHAR(13) +
187
+ ' AND DBPrincipals.name NOT IN (''dbo'',''public'',''INFORMATION_SCHEMA'',''guest'',''sys'') '
188
+
189
+ IF @Print = 1
190
+ BEGIN
191
+ PRINT N'-- Database Principals'
192
+ PRINT CAST(@sql AS nvarchar(max))
193
+ PRINT '' -- Spacing before the next print
194
+ PRINT ''
195
+ END
196
+ ELSE
197
+ BEGIN
198
+ IF object_id('tempdb..#DBPrincipals') IS NOT NULL
199
+ DROP TABLE #DBPrincipals
200
+
201
+ -- Create temp table to store the data in
202
+ CREATE TABLE #DBPrincipals (
203
+ DBName sysname NULL,
204
+ DBPrincipalId int NULL,
205
+ DBPrincipal sysname NULL,
206
+ SrvPrincipal sysname NULL,
207
+ type char(1) NULL,
208
+ type_desc nchar(60) NULL,
209
+ default_schema_name sysname NULL,
210
+ create_date datetime NULL,
211
+ modify_date datetime NULL,
212
+ is_fixed_role bit NULL,
213
+ RoleAuthorization sysname NULL,
214
+ sid varbinary(85) NULL,
215
+ DropScript nvarchar(max) NULL,
216
+ CreateScript nvarchar(max) NULL
217
+ )
218
+
219
+ SET @sql = @use + N'INSERT INTO #DBPrincipals ' + NCHAR(13) + @sql
220
+
221
+ IF @DBName = 'All'
222
+ BEGIN
223
+ -- Declare a READ_ONLY cursor to loop through the databases
224
+ DECLARE cur_DBList CURSOR
225
+ READ_ONLY
226
+ FOR SELECT name FROM sys.databases ORDER BY name
227
+
228
+ OPEN cur_DBList
229
+
230
+ FETCH NEXT FROM cur_DBList INTO @AllDBNames
231
+ WHILE (@@fetch_status <> -1)
232
+ BEGIN
233
+ IF (@@fetch_status <> -2)
234
+ BEGIN
235
+ SET @sql2 = N'USE ' + QUOTENAME(@AllDBNames) + N';' + NCHAR(13) + @sql
236
+ EXEC sp_executesql @sql2,
237
+ N'@Principal sysname, @Role sysname, @Type nvarchar(30), @ObjectName sysname,
238
+ @AllDBNames sysname, @Permission sysname, @LoginName sysname',
239
+ @Principal, @Role, @Type, @ObjectName, @AllDBNames, @Permission, @LoginName
240
+ END
241
+ FETCH NEXT FROM cur_DBList INTO @AllDBNames
242
+ END
243
+
244
+ CLOSE cur_DBList
245
+ DEALLOCATE cur_DBList
246
+ END
247
+ ELSE
248
+ EXEC sp_executesql @sql, N'@Principal sysname, @Role sysname, @Type nvarchar(30),
249
+ @ObjectName sysname, @Permission sysname, @LoginName sysname',
250
+ @Principal, @Role, @Type, @ObjectName, @Permission, @LoginName
251
+ END
252
+ --=========================================================================
253
+ -- Database Role Members
254
+ SET @sql =
255
+ N'SELECT ' + CASE WHEN @DBName = 'All' THEN N'@AllDBNames' ELSE N'''' + @DBName + N'''' END + N' AS DBName,' +
256
+ N' Users.principal_id AS UserPrincipalId, Users.name AS UserName, Roles.name AS RoleName, ' + NCHAR(13) +
257
+ CASE WHEN @DBName = 'All' THEN N' ''USE '' + QUOTENAME(@AllDBNames) + ''; '' + ' + NCHAR(13) ELSE N'' END +
258
+ N' CASE WHEN Users.is_fixed_role = 0 AND Users.name <> ''dbo'' THEN ' + NCHAR(13) +
259
+ N' ''EXEC sp_droprolemember @rolename = ''+QUOTENAME(Roles.name' + @Collation +
260
+ N','''''''')+'', @membername = ''+QUOTENAME(CASE WHEN Users.name = ''dbo'' THEN NULL
261
+ ELSE Users.name END' + @Collation +
262
+ N','''''''')+'';'' END AS DropScript, ' + NCHAR(13) +
263
+ CASE WHEN @DBName = 'All' THEN N' ''USE '' + QUOTENAME(@AllDBNames) + ''; '' + ' + NCHAR(13) ELSE N'' END +
264
+ N' CASE WHEN Users.is_fixed_role = 0 AND Users.name <> ''dbo'' THEN ' + NCHAR(13) +
265
+ N' ''EXEC sp_addrolemember @rolename = ''+QUOTENAME(Roles.name' + @Collation +
266
+ N','''''''')+'', @membername = ''+QUOTENAME(CASE WHEN Users.name = ''dbo'' THEN NULL
267
+ ELSE Users.name END' + @Collation +
268
+ N','''''''')+'';'' END AS AddScript ' + NCHAR(13) +
269
+ N'FROM sys.database_role_members RoleMembers ' + NCHAR(13) +
270
+ N'JOIN sys.database_principals Users ' + NCHAR(13) +
271
+ N' ON RoleMembers.member_principal_id = Users.principal_id ' + NCHAR(13) +
272
+ N'JOIN sys.database_principals Roles ' + NCHAR(13) +
273
+ N' ON RoleMembers.role_principal_id = Roles.principal_id ' + NCHAR(13) +
274
+ N'WHERE 1=1 '
275
+
276
+ IF LEN(ISNULL(@Principal,'')) > 0
277
+ IF @Print = 1
278
+ SET @sql = @sql + NCHAR(13) + N' AND Users.name ' + @LikeOperator + N' '+QUOTENAME(@Principal,'''')
279
+ ELSE
280
+ SET @sql = @sql + NCHAR(13) + N' AND Users.name ' + @LikeOperator + N' @Principal'
281
+
282
+ IF LEN(ISNULL(@Role,'')) > 0
283
+ IF @Print = 1
284
+ SET @sql = @sql + NCHAR(13) + N' AND Roles.name ' + @LikeOperator + N' '+QUOTENAME(@Role,'''')
285
+ ELSE
286
+ SET @sql = @sql + NCHAR(13) + N' AND Roles.name ' + @LikeOperator + N' @Role'
287
+
288
+ IF LEN(@Type) > 0
289
+ IF @Print = 1
290
+ SET @sql = @sql + NCHAR(13) + N' AND Users.type ' + @LikeOperator + N' ' + QUOTENAME(@Type,'''')
291
+ ELSE
292
+ SET @sql = @sql + NCHAR(13) + N' AND Users.type ' + @LikeOperator + N' @Type'
293
+
294
+ IF LEN(@LoginName) > 0
295
+ BEGIN
296
+ SET @sql = @sql + NCHAR(13) +
297
+ N' AND EXISTS (SELECT 1 ' + NCHAR(13) +
298
+ N' FROM sys.server_principals SrvPrincipals ' + NCHAR(13) +
299
+ N' WHERE Users.sid NOT IN (0x00, 0x01) ' + NCHAR(13) +
300
+ N' AND SrvPrincipals.sid = Users.sid ' + NCHAR(13) +
301
+ N' AND Users.type NOT IN (''R'') ' + NCHAR(13)
302
+ IF @Print = 1
303
+ SET @sql = @sql + NCHAR(13) + ' AND SrvPrincipals.name ' + @LikeOperator + N' ' + QUOTENAME(@LoginName,'''')
304
+ ELSE
305
+ SET @sql = @sql + NCHAR(13) + ' AND SrvPrincipals.name ' + @LikeOperator + N' @LoginName'
306
+
307
+ SET @sql = @sql + N')'
308
+ END
309
+
310
+ IF LEN(@ObjectName) > 0
311
+ BEGIN
312
+ SET @sql = @sql + NCHAR(13) +
313
+ N' AND EXISTS (SELECT 1 ' + NCHAR(13) +
314
+ N' FROM sys.all_objects [Objects] ' + NCHAR(13) +
315
+ N' INNER JOIN sys.database_permissions Permission ' + NCHAR(13) +
316
+ N' ON Permission.major_id = [Objects].object_id ' + NCHAR(13) +
317
+ N' WHERE Permission.major_id = [Objects].object_id ' + NCHAR(13) +
318
+ N' AND Permission.grantee_principal_id = Users.principal_id ' + NCHAR(13)
319
+
320
+ IF @Print = 1
321
+ SET @sql = @sql + N' AND [Objects].name ' + @LikeOperator + N' ' + QUOTENAME(@ObjectName,'''')
322
+ ELSE
323
+ SET @sql = @sql + N' AND [Objects].name ' + @LikeOperator + N' @ObjectName'
324
+
325
+ SET @sql = @sql + N')'
326
+ END
327
+
328
+ IF LEN(@Permission) > 0
329
+ BEGIN
330
+ SET @sql = @sql + NCHAR(13) +
331
+ N' AND EXISTS (SELECT 1 ' + NCHAR(13) +
332
+ N' FROM sys.database_permissions Permission ' + NCHAR(13) +
333
+ N' WHERE Permission.grantee_principal_id = Users.principal_id ' + NCHAR(13)
334
+
335
+ IF @Print = 1
336
+ SET @sql = @sql + N' AND Permission.permission_name ' + @LikeOperator + N' ' + QUOTENAME(@Permission,'''')
337
+ ELSE
338
+ SET @sql = @sql + N' AND Permission.permission_name ' + @LikeOperator + N' @Permission'
339
+
340
+ SET @sql = @sql + N')'
341
+ END
342
+
343
+ IF @IncludeMSShipped = 0
344
+ SET @sql = @sql + NCHAR(13) + N' AND Users.is_fixed_role = 0 ' + NCHAR(13) +
345
+ ' AND Users.name NOT IN (''dbo'',''public'',''INFORMATION_SCHEMA'',''guest'',''sys'') '
346
+
347
+ IF @Print = 1
348
+ BEGIN
349
+ PRINT N'-- Database Role Members'
350
+ PRINT CAST(@sql AS nvarchar(max))
351
+ PRINT '' -- Spacing before the next print
352
+ PRINT ''
353
+ END
354
+ ELSE
355
+ BEGIN
356
+ IF object_id('tempdb..#DBRoles') IS NOT NULL
357
+ DROP TABLE #DBRoles
358
+
359
+ -- Create temp table to store the data in
360
+ CREATE TABLE #DBRoles (
361
+ DBName sysname NULL,
362
+ UserPrincipalId int NULL,
363
+ UserName sysname NULL,
364
+ RoleName sysname NULL,
365
+ DropScript nvarchar(max) NULL,
366
+ AddScript nvarchar(max) NULL
367
+ )
368
+
369
+ SET @sql = @use + NCHAR(13) + 'INSERT INTO #DBRoles ' + NCHAR(13) + @sql
370
+
371
+ IF @DBName = 'All'
372
+ BEGIN
373
+ -- Declare a READ_ONLY cursor to loop through the databases
374
+ DECLARE cur_DBList CURSOR
375
+ READ_ONLY
376
+ FOR SELECT name FROM sys.databases ORDER BY name
377
+
378
+ OPEN cur_DBList
379
+
380
+ FETCH NEXT FROM cur_DBList INTO @AllDBNames
381
+ WHILE (@@fetch_status <> -1)
382
+ BEGIN
383
+ IF (@@fetch_status <> -2)
384
+ BEGIN
385
+ SET @sql2 = 'USE ' + QUOTENAME(@AllDBNames) + ';' + NCHAR(13) + @sql
386
+ EXEC sp_executesql @sql2,
387
+ N'@Principal sysname, @Role sysname, @Type nvarchar(30), @ObjectName sysname,
388
+ @AllDBNames sysname, @Permission sysname, @LoginName sysname',
389
+ @Principal, @Role, @Type, @ObjectName, @AllDBNames, @Permission, @LoginName
390
+ END
391
+ FETCH NEXT FROM cur_DBList INTO @AllDBNames
392
+ END
393
+
394
+ CLOSE cur_DBList
395
+ DEALLOCATE cur_DBList
396
+ END
397
+ ELSE
398
+ EXEC sp_executesql @sql, N'@Principal sysname, @Role sysname, @Type nvarchar(30),
399
+ @ObjectName sysname, @Permission sysname, @LoginName sysname',
400
+ @Principal, @Role, @Type, @ObjectName, @Permission, @LoginName
401
+ END
402
+
403
+ --=========================================================================
404
+ -- Database & object Permissions
405
+ SET @ObjectList =
406
+ N'; WITH ObjectList AS (' + NCHAR(13) +
407
+ N' SELECT NULL AS SchemaName , ' + NCHAR(13) +
408
+ N' name ' + @Collation + ' AS name, ' + NCHAR(13) +
409
+ N' database_id AS id, ' + NCHAR(13) +
410
+ N' ''DATABASE'' AS class_desc,' + NCHAR(13) +
411
+ N' '''' AS class ' + NCHAR(13) +
412
+ N' FROM master.sys.databases' + NCHAR(13) +
413
+ N' UNION ALL' + NCHAR(13) +
414
+ N' SELECT SCHEMA_NAME(sys.all_objects.schema_id) ' + @Collation + N' AS SchemaName,' + NCHAR(13) +
415
+ N' name ' + @Collation + N' AS name, ' + NCHAR(13) +
416
+ N' object_id AS id, ' + NCHAR(13) +
417
+ N' ''OBJECT_OR_COLUMN'' AS class_desc,' + NCHAR(13) +
418
+ N' ''OBJECT'' AS class ' + NCHAR(13) +
419
+ N' FROM sys.all_objects' + NCHAR(13) +
420
+ N' UNION ALL' + NCHAR(13) +
421
+ N' SELECT name ' + @Collation + N' AS SchemaName, ' + NCHAR(13) +
422
+ N' NULL AS name, ' + NCHAR(13) +
423
+ N' schema_id AS id, ' + NCHAR(13) +
424
+ N' ''SCHEMA'' AS class_desc,' + NCHAR(13) +
425
+ N' ''SCHEMA'' AS class ' + NCHAR(13) +
426
+ N' FROM sys.schemas' + NCHAR(13) +
427
+ N' UNION ALL' + NCHAR(13) +
428
+ N' SELECT NULL AS SchemaName, ' + NCHAR(13) +
429
+ N' name ' + @Collation + N' AS name, ' + NCHAR(13) +
430
+ N' principal_id AS id, ' + NCHAR(13) +
431
+ N' ''DATABASE_PRINCIPAL'' AS class_desc,' + NCHAR(13) +
432
+ N' CASE type_desc ' + NCHAR(13) +
433
+ N' WHEN ''APPLICATION_ROLE'' THEN ''APPLICATION ROLE'' ' + NCHAR(13) +
434
+ N' WHEN ''DATABASE_ROLE'' THEN ''ROLE'' ' + NCHAR(13) +
435
+ N' ELSE ''USER'' END AS class ' + NCHAR(13) +
436
+ N' FROM sys.database_principals' + NCHAR(13) +
437
+ N' UNION ALL' + NCHAR(13) +
438
+ N' SELECT NULL AS SchemaName, ' + NCHAR(13) +
439
+ N' name ' + @Collation + N' AS name, ' + NCHAR(13) +
440
+ N' assembly_id AS id, ' + NCHAR(13) +
441
+ N' ''ASSEMBLY'' AS class_desc,' + NCHAR(13) +
442
+ N' ''ASSEMBLY'' AS class ' + NCHAR(13) +
443
+ N' FROM sys.assemblies' + NCHAR(13) +
444
+ N' UNION ALL' + NCHAR(13)
445
+
446
+ SET @ObjectList = @ObjectList +
447
+ N' SELECT SCHEMA_NAME(sys.types.schema_id) ' + @Collation + N' AS SchemaName, ' + NCHAR(13) +
448
+ N' name ' + @Collation + N' AS name, ' + NCHAR(13) +
449
+ N' user_type_id AS id, ' + NCHAR(13) +
450
+ N' ''TYPE'' AS class_desc,' + NCHAR(13) +
451
+ N' ''TYPE'' AS class ' + NCHAR(13) +
452
+ N' FROM sys.types' + NCHAR(13) +
453
+ N' UNION ALL' + NCHAR(13) +
454
+ N' SELECT SCHEMA_NAME(schema_id) ' + @Collation + N' AS SchemaName, ' + NCHAR(13) +
455
+ N' name ' + @Collation + N' AS name, ' + NCHAR(13) +
456
+ N' xml_collection_id AS id, ' + NCHAR(13) +
457
+ N' ''XML_SCHEMA_COLLECTION'' AS class_desc,' + NCHAR(13) +
458
+ N' ''XML SCHEMA COLLECTION'' AS class ' + NCHAR(13) +
459
+ N' FROM sys.xml_schema_collections' + NCHAR(13) +
460
+ N' UNION ALL' + NCHAR(13) +
461
+ N' SELECT NULL AS SchemaName, ' + NCHAR(13) +
462
+ N' name ' + @Collation + N' AS name, ' + NCHAR(13) +
463
+ N' message_type_id AS id, ' + NCHAR(13) +
464
+ N' ''MESSAGE_TYPE'' AS class_desc,' + NCHAR(13) +
465
+ N' ''MESSAGE TYPE'' AS class ' + NCHAR(13) +
466
+ N' FROM sys.service_message_types' + NCHAR(13) +
467
+ N' UNION ALL' + NCHAR(13) +
468
+ N' SELECT NULL AS SchemaName, ' + NCHAR(13) +
469
+ N' name ' + @Collation + N' AS name, ' + NCHAR(13) +
470
+ N' service_contract_id AS id, ' + NCHAR(13) +
471
+ N' ''SERVICE_CONTRACT'' AS class_desc,' + NCHAR(13) +
472
+ N' ''CONTRACT'' AS class ' + NCHAR(13) +
473
+ N' FROM sys.service_contracts' + NCHAR(13) +
474
+ N' UNION ALL' + NCHAR(13) +
475
+ N' SELECT NULL AS SchemaName, ' + NCHAR(13) +
476
+ N' name ' + @Collation + N' AS name, ' + NCHAR(13) +
477
+ N' service_id AS id, ' + NCHAR(13) +
478
+ N' ''SERVICE'' AS class_desc,' + NCHAR(13) +
479
+ N' ''SERVICE'' AS class ' + NCHAR(13) +
480
+ N' FROM sys.services' + NCHAR(13) +
481
+ N' UNION ALL' + NCHAR(13) +
482
+ N' SELECT NULL AS SchemaName, ' + NCHAR(13) +
483
+ N' name ' + @Collation + N' AS name, ' + NCHAR(13) +
484
+ N' remote_service_binding_id AS id, ' + NCHAR(13) +
485
+ N' ''REMOTE_SERVICE_BINDING'' AS class_desc,' + NCHAR(13) +
486
+ N' ''REMOTE SERVICE BINDING'' AS class ' + NCHAR(13) +
487
+ N' FROM sys.remote_service_bindings' + NCHAR(13) +
488
+ N' UNION ALL' + NCHAR(13) +
489
+ N' SELECT NULL AS SchemaName, ' + NCHAR(13) +
490
+ N' name ' + @Collation + N' AS name, ' + NCHAR(13) +
491
+ N' route_id AS id, ' + NCHAR(13) +
492
+ N' ''ROUTE'' AS class_desc,' + NCHAR(13) +
493
+ N' ''ROUTE'' AS class ' + NCHAR(13) +
494
+ N' FROM sys.routes' + NCHAR(13) +
495
+ N' UNION ALL' + NCHAR(13) +
496
+ N' SELECT NULL AS SchemaName, ' + NCHAR(13) +
497
+ N' name ' + @Collation + N' AS name, ' + NCHAR(13) +
498
+ N' fulltext_catalog_id AS id, ' + NCHAR(13) +
499
+ N' ''FULLTEXT_CATALOG'' AS class_desc,' + NCHAR(13) +
500
+ N' ''FULLTEXT CATALOG'' AS class ' + NCHAR(13) +
501
+ N' FROM sys.fulltext_catalogs' + NCHAR(13) +
502
+ N' UNION ALL' + NCHAR(13) +
503
+ N' SELECT NULL AS SchemaName, ' + NCHAR(13) +
504
+ N' name ' + @Collation + N' AS name, ' + NCHAR(13) +
505
+ N' symmetric_key_id AS id, ' + NCHAR(13) +
506
+ N' ''SYMMETRIC_KEYS'' AS class_desc,' + NCHAR(13) +
507
+ N' ''SYMMETRIC KEY'' AS class ' + NCHAR(13) +
508
+ N' FROM sys.symmetric_keys' + NCHAR(13) +
509
+ N' UNION ALL' + NCHAR(13) +
510
+ N' SELECT NULL AS SchemaName, ' + NCHAR(13) +
511
+ N' name ' + @Collation + N' AS name, ' + NCHAR(13) +
512
+ N' certificate_id AS id, ' + NCHAR(13) +
513
+ N' ''CERTIFICATE'' AS class_desc,' + NCHAR(13) +
514
+ N' ''CERTIFICATE'' AS class ' + NCHAR(13) +
515
+ N' FROM sys.certificates' + NCHAR(13) +
516
+ N' UNION ALL' + NCHAR(13) +
517
+ N' SELECT NULL AS SchemaName, ' + NCHAR(13) +
518
+ N' name ' + @Collation + N' AS name, ' + NCHAR(13) +
519
+ N' asymmetric_key_id AS id, ' + NCHAR(13) +
520
+ N' ''ASYMMETRIC_KEY'' AS class_desc,' + NCHAR(13) +
521
+ N' ''ASYMMETRIC KEY'' AS class ' + NCHAR(13) +
522
+ N' FROM sys.asymmetric_keys' + NCHAR(13) +
523
+ N' ) ' + NCHAR(13)
524
+
525
+ SET @sql =
526
+ N'SELECT ' + CASE WHEN @DBName = 'All' THEN N'@AllDBNames' ELSE N'''' + @DBName + N'''' END + N' AS DBName,' + NCHAR(13) +
527
+ N' Grantee.principal_id AS GranteePrincipalId, Grantee.name AS GranteeName, Grantor.name AS GrantorName, ' + NCHAR(13) +
528
+ N' Permission.class_desc, Permission.permission_name, ' + NCHAR(13) +
529
+ N' ObjectList.name AS ObjectName, ' + NCHAR(13) +
530
+ N' ObjectList.SchemaName, ' + NCHAR(13) +
531
+ N' Permission.state_desc, ' + NCHAR(13) +
532
+ N' CASE WHEN Grantee.is_fixed_role = 0 AND Grantee.name <> ''dbo'' THEN ' + NCHAR(13) +
533
+ CASE WHEN @DBName = 'All' THEN N' ''USE '' + QUOTENAME(@AllDBNames) + ''; '' + ' + NCHAR(13) ELSE N'' END +
534
+ N' ''REVOKE '' + ' + NCHAR(13) +
535
+ N' CASE WHEN Permission.[state] = ''W'' THEN ''GRANT OPTION FOR '' ELSE '''' END + ' + NCHAR(13) +
536
+ N' '' '' + Permission.permission_name' + @Collation + N' + ' + NCHAR(13) +
537
+ N' CASE WHEN Permission.major_id <> 0 THEN '' ON '' + ' + NCHAR(13) +
538
+ N' ObjectList.class + ''::'' + ' + NCHAR(13) +
539
+ N' ISNULL(QUOTENAME(ObjectList.SchemaName),'''') + ' + NCHAR(13) +
540
+ N' CASE WHEN ObjectList.SchemaName + ObjectList.name IS NULL THEN '''' ELSE ''.'' END + ' + NCHAR(13) +
541
+ N' ISNULL(QUOTENAME(ObjectList.name),'''') ' + NCHAR(13) +
542
+ N' ' + @Collation + ' + '' '' ELSE '''' END + ' + NCHAR(13) +
543
+ N' '' FROM '' + QUOTENAME(Grantee.name' + @Collation + N') + ''; '' END AS RevokeScript, ' + NCHAR(13) +
544
+ N' CASE WHEN Grantee.is_fixed_role = 0 AND Grantee.name <> ''dbo'' THEN ' + NCHAR(13) +
545
+ CASE WHEN @DBName = 'All' THEN N' ''USE '' + QUOTENAME(@AllDBNames) + ''; '' + ' + NCHAR(13) ELSE N'' END +
546
+ N' CASE WHEN Permission.[state] = ''W'' THEN ''GRANT'' ELSE Permission.state_desc' + @Collation +
547
+ N' END + ' + NCHAR(13) +
548
+ N' '' '' + Permission.permission_name' + @Collation + N' + ' + NCHAR(13) +
549
+ N' CASE WHEN Permission.major_id <> 0 THEN '' ON '' + ' + NCHAR(13) +
550
+ N' ObjectList.class + ''::'' + ' + NCHAR(13) +
551
+ N' ISNULL(QUOTENAME(ObjectList.SchemaName),'''') + ' + NCHAR(13) +
552
+ N' CASE WHEN ObjectList.SchemaName + ObjectList.name IS NULL THEN '''' ELSE ''.'' END + ' + NCHAR(13) +
553
+ N' ISNULL(QUOTENAME(ObjectList.name),'''') ' + NCHAR(13) +
554
+ N' ' + @Collation + N' + '' '' ELSE '''' END + ' + NCHAR(13) +
555
+ N' '' TO '' + QUOTENAME(Grantee.name' + @Collation + N') + '' '' + ' + NCHAR(13) +
556
+ N' CASE WHEN Permission.[state] = ''W'' THEN '' WITH GRANT OPTION '' ELSE '''' END + ' + NCHAR(13) +
557
+ N' '' AS ''+ QUOTENAME(Grantor.name' + @Collation + N')+'';'' END AS GrantScript ' + NCHAR(13) +
558
+ N'FROM sys.database_permissions Permission ' + NCHAR(13) +
559
+ N'JOIN sys.database_principals Grantee ' + NCHAR(13) +
560
+ N' ON Permission.grantee_principal_id = Grantee.principal_id ' + NCHAR(13) +
561
+ N'JOIN sys.database_principals Grantor ' + NCHAR(13) +
562
+ N' ON Permission.grantor_principal_id = Grantor.principal_id ' + NCHAR(13) +
563
+ N'LEFT OUTER JOIN ObjectList ' + NCHAR(13) +
564
+ N' ON Permission.major_id = ObjectList.id ' + NCHAR(13) +
565
+ N' AND Permission.class_desc = ObjectList.class_desc ' + NCHAR(13) +
566
+ N'WHERE 1=1 '
567
+
568
+ IF LEN(ISNULL(@Principal,@Role)) > 0
569
+ IF @Print = 1
570
+ SET @sql = @sql + NCHAR(13) + N' AND Grantee.name ' + @LikeOperator + N' ' + ISNULL(QUOTENAME(@Principal,''''),QUOTENAME(@Role,''''))
571
+ ELSE
572
+ SET @sql = @sql + NCHAR(13) + N' AND Grantee.name ' + @LikeOperator + N' ISNULL(@Principal,@Role) '
573
+
574
+ IF LEN(@Type) > 0
575
+ IF @Print = 1
576
+ SET @sql = @sql + NCHAR(13) + N' AND Grantee.type ' + @LikeOperator + N' ' + QUOTENAME(@Type,'''')
577
+ ELSE
578
+ SET @sql = @sql + NCHAR(13) + N' AND Grantee.type ' + @LikeOperator + N' @Type'
579
+
580
+ IF LEN(@ObjectName) > 0
581
+ IF @Print = 1
582
+ SET @sql = @sql + NCHAR(13) + N' AND ObjectList.name ' + @LikeOperator + N' ' + QUOTENAME(@ObjectName,'''')
583
+ ELSE
584
+ SET @sql = @sql + NCHAR(13) + N' AND ObjectList.name ' + @LikeOperator + N' @ObjectName '
585
+
586
+ IF LEN(@Permission) > 0
587
+ IF @Print = 1
588
+ SET @sql = @sql + NCHAR(13) + N' AND Permission.permission_name ' + @LikeOperator + N' ' + QUOTENAME(@Permission,'''')
589
+ ELSE
590
+ SET @sql = @sql + NCHAR(13) + N' AND Permission.permission_name ' + @LikeOperator + N' @Permission'
591
+
592
+ IF LEN(@LoginName) > 0
593
+ BEGIN
594
+ SET @sql = @sql + NCHAR(13) +
595
+ N' AND EXISTS (SELECT 1 ' + NCHAR(13) +
596
+ N' FROM sys.server_principals SrvPrincipals ' + NCHAR(13) +
597
+ N' WHERE SrvPrincipals.sid = Grantee.sid ' + NCHAR(13) +
598
+ N' AND Grantee.sid NOT IN (0x00, 0x01) ' + NCHAR(13) +
599
+ N' AND Grantee.type NOT IN (''R'') ' + NCHAR(13)
600
+ IF @Print = 1
601
+ SET @sql = @sql + NCHAR(13) + N' AND SrvPrincipals.name ' + @LikeOperator + N' ' + QUOTENAME(@LoginName,'''')
602
+ ELSE
603
+ SET @sql = @sql + NCHAR(13) + N' AND SrvPrincipals.name ' + @LikeOperator + N' @LoginName'
604
+
605
+ SET @sql = @sql + ')'
606
+ END
607
+
608
+ IF @IncludeMSShipped = 0
609
+ SET @sql = @sql + NCHAR(13) + N' AND Grantee.is_fixed_role = 0 ' + NCHAR(13) +
610
+ ' AND Grantee.name NOT IN (''dbo'',''public'',''INFORMATION_SCHEMA'',''guest'',''sys'') '
611
+
612
+ IF @Print = 1
613
+ BEGIN
614
+ PRINT '-- Database & object Permissions'
615
+ PRINT CAST(@use AS nvarchar(max))
616
+ PRINT CAST(@ObjectList AS nvarchar(max))
617
+ PRINT CAST(@sql AS nvarchar(max))
618
+ END
619
+ ELSE
620
+ BEGIN
621
+ IF object_id('tempdb..#DBPermissions') IS NOT NULL
622
+ DROP TABLE #DBPermissions
623
+
624
+ -- Create temp table to store the data in
625
+ CREATE TABLE #DBPermissions (
626
+ DBName sysname NULL,
627
+ GranteePrincipalId int NULL,
628
+ GranteeName sysname NULL,
629
+ GrantorName sysname NULL,
630
+ class_desc nvarchar(60) NULL,
631
+ permission_name nvarchar(128) NULL,
632
+ ObjectName sysname NULL,
633
+ SchemaName sysname NULL,
634
+ state_desc nvarchar(60) NULL,
635
+ RevokeScript nvarchar(max) NULL,
636
+ GrantScript nvarchar(max) NULL
637
+ )
638
+
639
+ -- Add insert statement to @sql
640
+ SET @sql = @use + @ObjectList +
641
+ N'INSERT INTO #DBPermissions ' + NCHAR(13) +
642
+ @sql
643
+
644
+ IF @DBName = 'All'
645
+ BEGIN
646
+ -- Declare a READ_ONLY cursor to loop through the databases
647
+ DECLARE cur_DBList CURSOR
648
+ READ_ONLY
649
+ FOR SELECT name FROM sys.databases ORDER BY name
650
+
651
+ OPEN cur_DBList
652
+
653
+ FETCH NEXT FROM cur_DBList INTO @AllDBNames
654
+ WHILE (@@fetch_status <> -1)
655
+ BEGIN
656
+ IF (@@fetch_status <> -2)
657
+ BEGIN
658
+ SET @sql2 = 'USE ' + QUOTENAME(@AllDBNames) + ';' + NCHAR(13) + @sql
659
+ EXEC sp_executesql @sql2,
660
+ N'@Principal sysname, @Role sysname, @Type nvarchar(30), @ObjectName sysname,
661
+ @AllDBNames sysname, @Permission sysname, @LoginName sysname',
662
+ @Principal, @Role, @Type, @ObjectName, @AllDBNames, @Permission, @LoginName
663
+ END
664
+ FETCH NEXT FROM cur_DBList INTO @AllDBNames
665
+ END
666
+
667
+ CLOSE cur_DBList
668
+ DEALLOCATE cur_DBList
669
+ END
670
+ ELSE
671
+ BEGIN
672
+ EXEC sp_executesql @sql, N'@Principal sysname, @Role sysname, @Type nvarchar(30),
673
+ @ObjectName sysname, @Permission sysname, @LoginName sysname',
674
+ @Principal, @Role, @Type, @ObjectName, @Permission, @LoginName
675
+ END
676
+ END
677
+
678
+ IF @Print <> 1
679
+ BEGIN
680
+ IF @Output = 'None'
681
+ PRINT ''
682
+ ELSE IF @Output = 'CreateOnly'
683
+ BEGIN
684
+ SELECT @sql_script += CreateScript + @newline FROM #DBPrincipals WHERE CreateScript IS NOT NULL
685
+ SELECT @sql_script += AddScript + @newline FROM #DBRoles WHERE AddScript IS NOT NULL
686
+ SELECT @sql_script += GrantScript + @newline FROM #DBPermissions WHERE GrantScript IS NOT NULL AND class_desc != CASE WHEN @IncludeTablePermissions = 0 THEN 'OBJECT_OR_COLUMN' ELSE '' END
687
+ SELECT @sql_script AS [RestorePermissionsScript]
688
+ END
689
+ ELSE IF @Output = 'DropOnly'
690
+ BEGIN
691
+ SELECT @sql_script += DropScript + @newline FROM #DBPrincipals WHERE DropScript IS NOT NULL
692
+ SELECT @sql_script += DropScript + @newline FROM #DBRoles WHERE DropScript IS NOT NULL
693
+ SELECT @sql_script += RevokeScript + @newline FROM #DBPermissions WHERE RevokeScript IS NOT NULL AND class_desc != CASE WHEN @IncludeTablePermissions = 0 THEN 'OBJECT_OR_COLUMN' ELSE '' END
694
+ SELECT @sql_script AS [RestorePermissionsScript]
695
+ END
696
+ ELSE IF @Output = 'ScriptOnly'
697
+ BEGIN
698
+ SELECT DropScript, CreateScript FROM #DBPrincipals WHERE DropScript IS NOT NULL OR CreateScript IS NOT NULL
699
+ SELECT DropScript, AddScript FROM #DBRoles WHERE DropScript IS NOT NULL OR AddScript IS NOT NULL
700
+ SELECT RevokeScript, GrantScript FROM #DBPermissions WHERE RevokeScript IS NOT NULL OR GrantScript IS NOT NULL AND class_desc != CASE WHEN @IncludeTablePermissions = 0 THEN 'OBJECT_OR_COLUMN' ELSE '' END
701
+ SELECT @sql_script AS [RestorePermissionsScript]
702
+ END
703
+ ELSE IF @Output = 'Report'
704
+ BEGIN
705
+ SELECT DBName, DBPrincipal, SrvPrincipal, type, type_desc,
706
+ STUFF((SELECT ', ' + #DBRoles.RoleName
707
+ FROM #DBRoles
708
+ WHERE #DBPrincipals.DBName = #DBRoles.DBName
709
+ AND #DBPrincipals.DBPrincipalId = #DBRoles.UserPrincipalId
710
+ ORDER BY #DBRoles.RoleName
711
+ FOR XML PATH(''),TYPE).value('.','VARCHAR(MAX)')
712
+ , 1, 2, '') AS RoleMembership,
713
+ STUFF((SELECT ', ' + #DBPermissions.state_desc + ' ' + #DBPermissions.permission_name + ' on ' +
714
+ ISNULL('OBJECT:'+#DBPermissions.ObjectName, 'DATABASE:'+#DBPermissions.DBName)
715
+ FROM #DBPermissions
716
+ WHERE #DBPrincipals.DBName = #DBPermissions.DBName
717
+ AND #DBPrincipals.DBPrincipalId = #DBPermissions.GranteePrincipalId
718
+ ORDER BY #DBPermissions.state_desc, ISNULL(#DBPermissions.ObjectName, #DBPermissions.DBName), #DBPermissions.permission_name
719
+ FOR XML PATH(''),TYPE).value('.','VARCHAR(MAX)')
720
+ , 1, 2, '') AS DirectPermissions
721
+ FROM #DBPrincipals
722
+ ORDER BY DBName, type, DBPrincipal
723
+ END
724
+ ELSE -- 'Default' or no match
725
+ BEGIN
726
+ SELECT DBName, DBPrincipal, SrvPrincipal, type, type_desc, default_schema_name,
727
+ create_date, modify_date, is_fixed_role, RoleAuthorization, sid,
728
+ DropScript, CreateScript
729
+ FROM #DBPrincipals ORDER BY DBName, DBPrincipal
730
+ IF LEN(@Role) > 0
731
+ SELECT DBName, UserName, RoleName, DropScript, AddScript
732
+ FROM #DBRoles ORDER BY DBName, RoleName, UserName
733
+ ELSE
734
+ SELECT DBName, UserName, RoleName, DropScript, AddScript
735
+ FROM #DBRoles ORDER BY DBName, UserName, RoleName
736
+
737
+ IF LEN(@ObjectName) > 0
738
+ SELECT DBName, GranteeName, GrantorName, class_desc, permission_name, ObjectName,
739
+ SchemaName, state_desc, RevokeScript, GrantScript
740
+ FROM #DBPermissions
741
+ WHERE class_desc != CASE WHEN @IncludeTablePermissions = 0 THEN 'OBJECT_OR_COLUMN' ELSE '' END
742
+ ORDER BY DBName, ObjectName, GranteeName
743
+ ELSE
744
+ SELECT DBName, GranteeName, GrantorName, class_desc, permission_name, ObjectName,
745
+ SchemaName, state_desc, RevokeScript, GrantScript
746
+ FROM #DBPermissions
747
+ WHERE class_desc != CASE WHEN @IncludeTablePermissions = 0 THEN 'OBJECT_OR_COLUMN' ELSE '' END
748
+ ORDER BY DBName, GranteeName, ObjectName
749
+ END
750
+
751
+ IF @DropTempTables = 1
752
+ BEGIN
753
+ DROP TABLE #DBPrincipals
754
+ DROP TABLE #DBRoles
755
+ DROP TABLE #DBPermissions
756
+ END
757
+ END