This procedure must be loaded into master. This will allow it to be used from any database.
1) To script all roles in MYDB, Exec MYDB..sp_ScriptRoles
2) To script role MyRole in MYDB, Exec MYDB..sp_ScriptRoles @Role='MyRole'
This procedure must be loaded into master. This will allow it to be used from any database.
1) To script all roles in MYDB, Exec MYDB..sp_ScriptRoles
2) To script role MyRole in MYDB, Exec MYDB..sp_ScriptRoles @Role='MyRole'
USE master
GO
if exists (select * FROM dbo.sysobjects where id = object_id(N'[dbo].[sp_ScriptRoles]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[sp_ScriptRoles]
GO
SET ANSI_NULLS ON
SET QUOTED_IDENTIFIER ON
GO
CREATE PROC [dbo].[sp_ScriptRoles]
@Role varchar(255) = '%'
-- Build statements to replicate authorities for Database Roles
--
-- This routine needs to be named 'sp_' so it can be hosted in master database and be able to script roles in any database
AS BEGIN
SET NOCOUNT ON
-- Display Audit information
PRINT '-- Generated on ' + Convert(char(20), Getdate(), 113) + ' by ' + SYSTEM_USER + ' on ' + @@servername
PRINT '-- Setup users, roles and privileges. sp_ScriptRoles v1.1'
-- Switch to current database
PRINT 'USE ' + db_name()
PRINT 'GO'
-- Add Users to Database
SELECT
'EXEC sp_grantdbaccess ''' + RTrim(l.name) + '''' as '-- Add Database Users'
FROM dbo.sysusers u
INNER JOIN master.dbo.syslogins l
ON u.sid = l.sid
WHERE u.islogin = 1
AND u.hasdbaccess = 1
AND u.name NOT IN ('dbo','guest')
AND u.name NOT LIKE '##%'
ORDER BY u.name
-- Create Database Roles
SELECT
'EXEC sp_addrole ''' + RTrim(r.name) + ''',dbo ' as '-- Create Roles'
FROM dbo.sysusers r
WHERE r.issqlrole = 1
AND r.gid > 0
AND r.name NOT IN ('RepositoryUser', 'TargetServersRole')
AND r.name LIKE @Role
ORDER BY r.name
-- Add Users to roles
SELECT
'EXEC sp_addrolemember ''' + RTrim(r.name) + ''',''' + RTrim(Coalesce(l.name,u.name)) + '''' as '-- Add Role Users'
FROM dbo.sysusers u
INNER JOIN sysmembers m
ON u.uid = m.memberuid
INNER JOIN sysusers r
ON m.groupuid = r.uid
LEFT OUTER JOIN master.dbo.syslogins l
ON u.sid = l.sid
WHERE r.issqlrole = 1
AND u.name <> 'dbo'
AND r.name LIKE '%'
ORDER BY r.name,u.name
-- Add Privileges to Roles
SELECT -- Object privileges
CASE
WHEN (p.protecttype = 204) OR (p.protecttype = 205) THEN
CASE
WHEN p.action = 26 THEN
'GRANT REFERENCES ON ' + RTRIM(s.name) + '.' + RTRIM(o.name) + ' TO ' + RTRIM(u.name)
WHEN p.action = 193 THEN
'GRANT SELECT ON ' + RTRIM(s.name) + '.' + RTRIM(o.name) + ' TO ' + RTRIM(u.name)
WHEN p.action = 195 THEN
'GRANT INSERT ON ' + RTRIM(s.name) + '.' + RTRIM(o.name) + ' TO ' + RTRIM(u.name)
WHEN p.action = 196 THEN
'GRANT DELETE ON ' + RTRIM(s.name) + '.' + RTRIM(o.name) + ' TO ' + RTRIM(u.name)
WHEN p.action = 197 THEN
'GRANT UPDATE ON ' + RTRIM(s.name) + '.' + RTRIM(o.name) + ' TO ' + RTRIM(u.name)
WHEN p.action = 224 THEN
'GRANT EXECUTE ON ' + RTRIM(s.name) + '.' + RTRIM(o.name) + ' TO ' + RTRIM(u.name)
END +
CASE
WHEN p.protecttype = 204 THEN
' WITH GRANT OPTION'
ELSE ''
END
WHEN p.protecttype = 206 THEN
CASE
WHEN p.action = 26 THEN
'DENY REFERENCES ON ' + RTRIM(s.name) + '.' + RTRIM(o.name) + ' TO ' + RTRIM(u.name)
WHEN p.action = 193 THEN
'DENY SELECT ON ' + RTRIM(s.name) + '.' + RTRIM(o.name) + ' TO ' + RTRIM(u.name)
WHEN p.action = 195 THEN
'DENY INSERT ON ' + RTRIM(s.name) + '.' + RTRIM(o.name) + ' TO ' + RTRIM(u.name)
WHEN p.action = 196 THEN
'DENY DELETE ON ' + RTRIM(s.name) + '.' + RTRIM(o.name) + ' TO ' + RTRIM(u.name)
WHEN p.action = 197 THEN
'DENY UPDATE ON ' + RTRIM(s.name) + '.' + RTRIM(o.name) + ' TO ' + RTRIM(u.name)
WHEN p.action = 224 THEN
'GRANT EXECUTE ON ' + RTRIM(s.name) + '.' + RTRIM(o.name) + ' TO ' + RTRIM(u.name)
END
END as '-- Setup Object privileges'
FROM dbo.sysobjects o
INNER JOIN sysusers s
ON o.uid = s.uid
INNER JOIN sysprotects p
ON o.id = p.id
INNER JOIN sysusers u
ON p.uid = u.uid
WHERE u.issqlrole = 1 -- Include Roles only
AND u.gid > 0 -- Exclude System Roles
AND u.name NOT IN ('RepositoryUser', 'TargetServersRole') -- Exclude Pseudo-system roles
AND u.name LIKE @Role
AND NOT (o.xtype = 'V' and o.category = 2) -- Exclude INFORMATION schema views
AND Coalesce(p.columns, 1) = 1 -- Exclude column-level privileges
ORDER BY u.name,s.name,o.name,p.action
SELECT -- Column privileges
CASE
WHEN (p.protecttype = 204) OR (p.protecttype = 205) THEN
CASE
WHEN p.action = 26 THEN
'GRANT REFERENCES ON ' + RTRIM(s.name) + '.' + RTRIM(o.name) + ' (' + RTRIM(c.name) + ') TO ' + RTRIM(u.name)
WHEN p.action = 193 THEN
'GRANT SELECT ON ' + RTRIM(s.name) + '.' + RTRIM(o.name) + ' (' + RTRIM(c.name) + ') TO ' + RTRIM(u.name)
WHEN p.action = 195 THEN
'GRANT INSERT ON ' + RTRIM(s.name) + '.' + RTRIM(o.name) + ' (' + RTRIM(c.name) + ') TO ' + RTRIM(u.name)
WHEN p.action = 196 THEN
'GRANT DELETE ON ' + RTRIM(s.name) + '.' + RTRIM(o.name) + ' (' + RTRIM(c.name) + ') TO ' + RTRIM(u.name)
WHEN p.action = 197 THEN
'GRANT UPDATE ON ' + RTRIM(s.name) + '.' + RTRIM(o.name) + ' (' + RTRIM(c.name) + ') TO ' + RTRIM(u.name)
END +
CASE
WHEN p.protecttype = 204 THEN
' WITH GRANT OPTION'
ELSE ''
END
WHEN p.protecttype = 206 THEN
CASE
WHEN p.action = 26 THEN
'DENY REFERENCES ON ' + RTRIM(s.name) + '.' + RTRIM(o.name) + ' (' + RTRIM(c.name) + ') TO ' + RTRIM(u.name)
WHEN p.action = 193 THEN
'DENY SELECT ON ' + RTRIM(s.name) + '.' + RTRIM(o.name) + ' (' + RTRIM(c.name) + ') TO ' + RTRIM(u.name)
WHEN p.action = 195 THEN
'DENY INSERT ON ' + RTRIM(s.name) + '.' + RTRIM(o.name) + ' (' + RTRIM(c.name) + ') TO ' + RTRIM(u.name)
WHEN p.action = 196 THEN
'DENY DELETE ON ' + RTRIM(s.name) + '.' + RTRIM(o.name) + ' (' + RTRIM(c.name) + ') TO ' + RTRIM(u.name)
WHEN p.action = 197 THEN
'DENY UPDATE ON ' + RTRIM(s.name) + '.' + RTRIM(o.name) + ' (' + RTRIM(c.name) + ') TO ' + RTRIM(u.name)
END
END as '-- Setup Column privileges'
FROM dbo.sysobjects o
INNER JOIN sysusers s
ON o.uid = s.uid
INNER JOIN sysprotects p
ON o.id = p.id
INNER JOIN sysusers u
ON p.uid = u.uid
INNER JOIN syscolumns c
ON c.id = o.id
AND c.id = p.id
INNER JOIN master.dbo.spt_values v
ON v.number = c.colid
WHERE u.issqlrole = 1 -- Include Roles only
AND u.gid > 0 -- Exclude System Roles
AND u.name NOT IN ('RepositoryUser', 'TargetServersRole') -- Exclude Pseudo-system roles
AND u.name LIKE @Role --and c.name = 'InstrumentID'
AND NOT (o.xtype = 'V' and o.category = 2) -- Exclude INFORMATION schema views
AND p.columns <> 1 -- Include only column-level privileges
AND CASE Substring(p.columns, 1, 1) & 1 -- Identify column for permission
WHEN 0 then Convert(tinyint, Substring(p.columns, v.low, 1))
ELSE (~Convert(tinyint, Coalesce(Substring(p.columns, v.low, 1),0)))
END & v.high <> 0
AND v.type = N'P'
ORDER BY u.name,s.name,o.name,p.action
PRINT '-- End of script'
END
GO