usp_SecurCreation.sql 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236
  1. IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[usp_SecurCreation]') AND OBJECTPROPERTY(id, N'IsProcedure') = 1)
  2. DROP PROCEDURE [dbo].[usp_SecurCreation]
  3. GO
  4. CREATE PROCEDURE usp_SecurCreation @user_name sysname = NULL, @dbname sysname = NULL
  5. --WITH ENCRYPTION
  6. AS
  7. -- Generates all database logins and their respective securables.
  8. --
  9. -- 2012-09-20 Pedro Lopes (Microsoft) [email protected] (http://aka.ms/sqlinsights/)
  10. -- 2013-01-11 - Fixed issue with generating all logins even when single database was chosen.
  11. -- 11/17/2016 - Fixed issue with permissions being repeated.
  12. --
  13. -- Does not deal with CERTIFICATE_MAPPED_LOGIN and ASYMMETRIC_KEY_MAPPED_LOGIN types
  14. --
  15. -- All users: EXEC usp_SecurCreation
  16. -- One user, All DBs: EXEC usp_SecurCreation '<User>'
  17. -- One user, One DBs: EXEC usp_SecurCreation '<User>', '<DBName>'
  18. -- All users, One DBs: EXEC usp_SecurCreation NULL, '<DBName>'
  19. --
  20. SET NOCOUNT ON;
  21. DECLARE @SC NVARCHAR(4000), @SCUser NVARCHAR(4000), @SCDB NVARCHAR(4000)
  22. CREATE TABLE #TempSecurables ([State] VARCHAR(100),
  23. [State2] VARCHAR(100),
  24. [PermName] VARCHAR(100),
  25. [Type] NVARCHAR(60),
  26. [Grantor] VARCHAR(100),
  27. [User] VARCHAR(100)
  28. )
  29. CREATE TABLE #TempSecurables2 ([DBName] sysname,
  30. [State] VARCHAR(1000)
  31. )
  32. IF @user_name IS NULL AND @dbname IS NULL
  33. BEGIN
  34. --Server level Privileges to User or User Group
  35. INSERT INTO #TempSecurables
  36. SELECT CASE CAST(p.state AS VARCHAR(100)) WHEN 'D' THEN 'DENY' WHEN 'R' THEN 'REVOKE' WHEN 'G' THEN 'GRANT' WHEN 'W' THEN 'GRANT' END,
  37. CASE CAST(p.state AS VARCHAR(100)) WHEN 'W' THEN 'WITH GRANT OPTION' ELSE '' END, CAST(p.permission_name AS VARCHAR(100)), RTRIM(p.class_desc),
  38. (SELECT [name] FROM sys.server_principals WHERE principal_id = p.grantor_principal_id), CAST(l.name AS VARCHAR(100))
  39. FROM sys.server_permissions p INNER JOIN sys.server_principals l ON p.grantee_principal_id = l.principal_id
  40. WHERE l.is_disabled = 0 AND l.type IN ('S', 'U', 'G', 'R')
  41. ORDER BY CAST(l.name AS VARCHAR(100))
  42. INSERT INTO #TempSecurables2
  43. EXEC master.dbo.sp_MSforeachdb @command1='USE [?]
  44. --Privileges for Procedures/Functions/CLR/Views to the User
  45. SELECT ''[?]'', CASE WHEN (b.state_desc COLLATE database_default) = ''GRANT_WITH_GRANT_OPTION'' THEN ''GRANT'' ELSE (b.state_desc COLLATE database_default) + '' '' END + + b.permission_name + ''ON ['' + c.name + ''].['' + a.name + ''] TO '' + QUOTENAME(USER_NAME(b.grantee_principal_id)) +
  46. CASE STATE WHEN ''W'' THEN '' WITH GRANT OPTION''
  47. ELSE '''' END FROM [?].sys.all_objects a, [?].sys.database_permissions b, [?].sys.schemas c
  48. WHERE a.OBJECT_ID = b.major_id AND a.type IN (''X'',''P'',''FN'',''AF'',''FS'',''FT'') AND b.grantee_principal_id <>0
  49. AND b.grantee_principal_id <>2 AND a.schema_id = c.schema_id
  50. ORDER BY c.name
  51. --Table and View Level Privileges to the User
  52. SELECT ''[?]'', ''GRANT '' + privilege_type + '' ON ['' + table_schema + ''].['' + table_name + ''] TO ['' + grantee + '']'' +
  53. CASE IS_GRANTABLE WHEN ''YES'' THEN '' WITH GRANT OPTION''
  54. ELSE '''' END FROM [?].INFORMATION_SCHEMA.TABLE_PRIVILEGES
  55. WHERE GRANTEE <> ''public''
  56. --Column Level Privileges to the User
  57. SELECT ''[?]'', ''GRANT '' + privilege_type + '' ON ['' + table_schema + ''].['' + table_name + ''] ('' + column_name + '') TO ['' + grantee + '']'' +
  58. CASE IS_GRANTABLE WHEN ''YES'' THEN '' WITH GRANT OPTION''
  59. ELSE '''' END FROM [?].INFORMATION_SCHEMA.COLUMN_PRIVILEGES
  60. WHERE GRANTEE <> ''public'''
  61. END
  62. ELSE IF @user_name IS NULL AND @dbname IS NOT NULL
  63. BEGIN
  64. --Server level Privileges to User or User Group
  65. SET @SCDB='SELECT DISTINCT CASE CAST(p.state AS VARCHAR(100)) WHEN ''D'' THEN ''DENY'' WHEN ''R'' THEN ''REVOKE'' WHEN ''G'' THEN ''GRANT'' WHEN ''W'' THEN ''GRANT'' END,
  66. CASE CAST(p.state AS VARCHAR(100)) WHEN ''W'' THEN ''WITH GRANT OPTION'' ELSE '''' END, CAST(p.permission_name AS VARCHAR(100)), RTRIM(p.class_desc),
  67. (SELECT [name] FROM sys.server_principals WHERE principal_id = p.grantor_principal_id), CAST(l.name AS VARCHAR(100))
  68. FROM sys.server_permissions AS p INNER JOIN sys.server_principals AS l ON p.grantee_principal_id = l.principal_id
  69. WHERE l.is_disabled = 0
  70. AND l.type IN (''S'', ''U'', ''G'', ''R'')
  71. AND l.sid IN (SELECT DISTINCT sid FROM [' + @dbname + '].sys.database_principals
  72. WHERE type IN (''S'', ''U'', ''G'', ''R'') AND sid IS NOT NULL AND name <> ''guest'')
  73. ORDER BY CAST(l.name AS VARCHAR(100))'
  74. INSERT INTO #TempSecurables
  75. EXEC master..sp_executesql @SCDB
  76. SET @SCDB='USE [' + @dbname + ']
  77. --Privileges for Procedures/Functions/CLR/Views to the User
  78. SELECT ''[' + @dbname + ']'', CASE WHEN (b.state_desc COLLATE database_default) = ''GRANT_WITH_GRANT_OPTION '' THEN ''GRANT '' ELSE (b.state_desc COLLATE database_default) + '' '' END + b.permission_name + '' ON ['' + c.name + ''].['' + a.name + ''] TO '' + QUOTENAME(USER_NAME(b.grantee_principal_id)) +
  79. CASE STATE WHEN ''W'' THEN '' WITH GRANT OPTION''
  80. ELSE '''' END FROM [' + @dbname + '].sys.all_objects a, [' + @dbname + '].sys.database_permissions b, [' + @dbname + '].sys.schemas c
  81. WHERE a.OBJECT_ID = b.major_id AND a.type IN (''X'',''P'',''FN'',''AF'',''FS'',''FT'') AND b.grantee_principal_id <>0
  82. AND b.grantee_principal_id <>2 AND a.schema_id = c.schema_id
  83. ORDER BY c.name
  84. --Table and View Level Privileges to the User
  85. SELECT ''[' + @dbname + ']'', ''GRANT '' + privilege_type + '' ON ['' + table_schema + ''].['' + table_name + ''] TO ['' + grantee + '']'' +
  86. CASE IS_GRANTABLE WHEN ''YES'' THEN '' WITH GRANT OPTION''
  87. ELSE '''' END FROM [' + @dbname + '].INFORMATION_SCHEMA.TABLE_PRIVILEGES
  88. WHERE GRANTEE <> ''public''
  89. --Column Level Privileges to the User
  90. SELECT ''[' + @dbname + ']'', ''GRANT '' + privilege_type + '' ON ['' + table_schema + ''].['' + table_name + ''] ('' + column_name + '') TO ['' + grantee + '']'' +
  91. CASE IS_GRANTABLE WHEN ''YES'' THEN '' WITH GRANT OPTION''
  92. ELSE '''' END FROM [' + @dbname + '].INFORMATION_SCHEMA.COLUMN_PRIVILEGES
  93. WHERE GRANTEE <> ''public'''
  94. INSERT INTO #TempSecurables2
  95. EXEC master..sp_executesql @SCDB
  96. END
  97. ELSE IF @user_name IS NOT NULL AND @dbname IS NULL
  98. BEGIN
  99. --Server level Privileges to User or User Group
  100. INSERT INTO #TempSecurables
  101. SELECT CASE CAST(p.state AS VARCHAR(100)) WHEN 'D' THEN 'DENY' WHEN 'R' THEN 'REVOKE' WHEN 'G' THEN 'GRANT' WHEN 'W' THEN 'GRANT' END,
  102. CASE CAST(p.state AS VARCHAR(100)) WHEN 'W' THEN 'WITH GRANT OPTION' ELSE '' END, CAST(p.[permission_name] AS VARCHAR(100)), RTRIM(p.class_desc),
  103. (SELECT [name] FROM sys.server_principals WHERE principal_id = p.grantor_principal_id), CAST(l.name AS VARCHAR(100))
  104. FROM sys.server_permissions p INNER JOIN sys.server_principals l ON p.grantee_principal_id = l.principal_id
  105. WHERE l.is_disabled = 0
  106. AND l.type IN ('S', 'U', 'G', 'R')
  107. AND QUOTENAME(l.name) = QUOTENAME(@user_name)
  108. SET @SCUser = 'USE [?]
  109. --Privileges for Procedures/Functions/CLR/Views to the User
  110. SELECT ''[?]'', CASE WHEN (b.state_desc COLLATE database_default) = ''GRANT_WITH_GRANT_OPTION '' THEN ''GRANT '' ELSE (b.state_desc COLLATE database_default) + '' '' END + b.permission_name + '' ON ['' + c.name + ''].['' + a.name + ''] TO '' + QUOTENAME(USER_NAME(b.grantee_principal_id)) +
  111. CASE STATE WHEN ''W'' THEN '' WITH GRANT OPTION''
  112. ELSE '''' END FROM [?].sys.all_objects a, [?].sys.database_permissions b, [?].sys.schemas c
  113. WHERE a.OBJECT_ID = b.major_id AND a.type IN (''X'',''P'',''FN'',''AF'',''FS'',''FT'') AND b.grantee_principal_id <>0
  114. AND b.grantee_principal_id <>2 AND a.schema_id = c.schema_id
  115. AND QUOTENAME(USER_NAME(b.grantee_principal_id)) = ''[' + @user_name + ']''
  116. ORDER BY c.name
  117. --Table and View Level Privileges to the User
  118. SELECT ''[?]'', ''GRANT '' + privilege_type + '' ON ['' + table_schema + ''].['' + table_name + ''] TO ['' + grantee + '']'' +
  119. CASE IS_GRANTABLE WHEN ''YES'' THEN '' WITH GRANT OPTION''
  120. ELSE '''' END FROM [?].INFORMATION_SCHEMA.TABLE_PRIVILEGES
  121. WHERE grantee <> ''public''
  122. AND grantee = ''[' + @user_name + ']''
  123. --Column Level Privileges to the User
  124. SELECT ''[?]'', ''GRANT '' + privilege_type + '' ON ['' + table_schema + ''].['' + table_name + ''] ('' + column_name + '') TO ['' + grantee + '']'' +
  125. CASE IS_GRANTABLE WHEN ''YES'' THEN '' WITH GRANT OPTION''
  126. ELSE '''' END FROM [?].INFORMATION_SCHEMA.COLUMN_PRIVILEGES
  127. WHERE grantee <> ''public''
  128. AND grantee = ''[' + @user_name + ']'''
  129. INSERT INTO #TempSecurables2
  130. EXEC master.dbo.sp_MSforeachdb @command1=@SCUser
  131. END
  132. ELSE IF @user_name IS NOT NULL AND @dbname IS NOT NULL
  133. BEGIN
  134. --Server level Privileges to User or User Group
  135. SET @SCDB='SELECT DISTINCT CASE CAST(p.state AS VARCHAR(100)) WHEN ''D'' THEN ''DENY'' WHEN ''R'' THEN ''REVOKE'' WHEN ''G'' THEN ''GRANT'' WHEN ''W'' THEN ''GRANT'' END,
  136. CASE CAST(p.state AS VARCHAR(100)) WHEN ''W'' THEN ''WITH GRANT OPTION'' ELSE '''' END, CAST(p.permission_name AS VARCHAR(100)), RTRIM(p.class_desc),
  137. (SELECT [name] FROM sys.server_principals WHERE principal_id = p.grantor_principal_id), CAST(l.name AS VARCHAR(100))
  138. FROM sys.server_permissions AS p INNER JOIN sys.server_principals AS l ON p.grantee_principal_id = l.principal_id
  139. WHERE l.is_disabled = 0
  140. AND l.type IN (''S'', ''U'', ''G'', ''R'')
  141. AND QUOTENAME(l.name) = ''' + QUOTENAME(@user_name) + '''
  142. AND l.sid IN (SELECT DISTINCT sid FROM [' + @dbname + '].sys.database_principals
  143. WHERE type IN (''S'', ''U'', ''G'', ''R'') AND sid IS NOT NULL AND name <> ''guest'')
  144. ORDER BY CAST(l.name AS VARCHAR(100))'
  145. INSERT INTO #TempSecurables
  146. EXEC master..sp_executesql @SCDB
  147. SET @SCDB='USE [' + @dbname + ']
  148. --Privileges for Procedures/Functions/CLR/Views to the User
  149. SELECT ''[' + @dbname + ']'', CASE WHEN (b.state_desc COLLATE database_default) = ''GRANT_WITH_GRANT_OPTION '' THEN ''GRANT '' ELSE (b.state_desc COLLATE database_default) + '' '' END + b.permission_name + '' ON ['' + c.name + ''].['' + a.name + ''] TO '' + QUOTENAME(USER_NAME(b.grantee_principal_id)) +
  150. CASE STATE WHEN ''W'' THEN '' WITH GRANT OPTION''
  151. ELSE '''' END FROM [' + @dbname + '].sys.all_objects a, [' + @dbname + '].sys.database_permissions b, [' + @dbname + '].sys.schemas c
  152. WHERE a.OBJECT_ID = b.major_id AND a.type IN (''X'',''P'',''FN'',''AF'',''FS'',''FT'') AND b.grantee_principal_id <>0
  153. AND b.grantee_principal_id <>2 AND a.schema_id = c.schema_id
  154. AND QUOTENAME(USER_NAME(b.grantee_principal_id)) = ''[' + @user_name + ']''
  155. ORDER BY c.name
  156. --Table and View Level Privileges to the User
  157. SELECT ''[' + @dbname + ']'', ''GRANT '' + privilege_type + '' ON ['' + table_schema + ''].['' + table_name + ''] TO ['' + grantee + '']'' +
  158. CASE IS_GRANTABLE WHEN ''YES'' THEN '' WITH GRANT OPTION''
  159. ELSE '''' END FROM [' + @dbname + '].INFORMATION_SCHEMA.TABLE_PRIVILEGES
  160. WHERE grantee <> ''public''
  161. AND grantee = ''[' + @user_name + ']''
  162. --Column Level Privileges to the User
  163. SELECT ''[' + @dbname + ']'', ''GRANT '' + privilege_type + '' ON ['' + table_schema + ''].['' + table_name + ''] ('' + column_name + '') TO ['' + grantee + '']'' +
  164. CASE IS_GRANTABLE WHEN ''YES'' THEN '' WITH GRANT OPTION''
  165. ELSE '''' END FROM [' + @dbname + '].INFORMATION_SCHEMA.COLUMN_PRIVILEGES
  166. WHERE grantee <> ''public''
  167. AND grantee = ''[' + @user_name + ']'''
  168. INSERT INTO #TempSecurables2
  169. EXEC master..sp_executesql @SCDB
  170. END
  171. PRINT '/* usp_SecurCreation script '
  172. PRINT '** Generated ' + CONVERT (VARCHAR, GETDATE()) + ' on ' + @@SERVERNAME + ' */' + CHAR(10)
  173. PRINT CHAR(13) + '--##### Server level Privileges to User or User Group #####' + CHAR(13)
  174. DECLARE cSC CURSOR FAST_FORWARD FOR SELECT 'USE [master];' + CHAR(10) + RTRIM(ts.[State]) + ' ' + RTRIM(ts.[PermName]) + ' TO ' + QUOTENAME(RTRIM(ts.[User])) + ' ' + RTRIM(ts.[State2]) + ';' + CHAR(10) + 'GO' FROM #TempSecurables ts WHERE RTRIM([Type]) = 'SERVER'
  175. OPEN cSC
  176. FETCH NEXT FROM cSC INTO @SC
  177. WHILE @@FETCH_STATUS = 0
  178. BEGIN
  179. PRINT @SC
  180. FETCH NEXT FROM cSC INTO @SC
  181. END
  182. CLOSE cSC
  183. DEALLOCATE cSC
  184. DECLARE cSC CURSOR FAST_FORWARD FOR SELECT 'USE [master];' + CHAR(10) + RTRIM(ts.[State]) + ' ' + RTRIM(ts.[PermName]) + ' ON ' + CASE WHEN RTRIM(ts.[Type]) = 'SERVER_PRINCIPAL' THEN 'LOGIN' ELSE 'ENDPOINT' END + '::' + QUOTENAME(RTRIM(ts.[Grantor])) + ' TO ' + QUOTENAME(RTRIM(ts.[User])) + ' ' +RTRIM(ts.[State2]) + ';' + CHAR(10) + 'GO' FROM #TempSecurables ts WHERE RTRIM([Type]) <> 'SERVER'
  185. OPEN cSC
  186. FETCH NEXT FROM cSC INTO @SC
  187. WHILE @@FETCH_STATUS = 0
  188. BEGIN
  189. PRINT @SC
  190. FETCH NEXT FROM cSC INTO @SC
  191. END
  192. CLOSE cSC
  193. DEALLOCATE cSC
  194. DROP TABLE #TempSecurables
  195. PRINT CHAR(13) + '--##### Procedures/Functions/CLR/Views, Table and Column Level Privileges to the User #####' + CHAR(13)
  196. DECLARE cSC CURSOR FAST_FORWARD FOR SELECT 'USE ' + ts2.DBName +';' + CHAR(10) + RTRIM(ts2.[State]) + ';' + CHAR(10) + 'GO' FROM #TempSecurables2 ts2
  197. OPEN cSC
  198. FETCH NEXT FROM cSC INTO @SC
  199. WHILE @@FETCH_STATUS = 0
  200. BEGIN
  201. PRINT @SC
  202. FETCH NEXT FROM cSC INTO @SC
  203. END
  204. CLOSE cSC
  205. DEALLOCATE cSC
  206. DROP TABLE #TempSecurables2
  207. GO