<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
		>
<channel>
	<title>Comments on: How to Script User and Role Object Permissions in SQL Server</title>
	<atom:link href="http://www.sql-server-performance.com/2002/object-permission-scripts/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.sql-server-performance.com/2002/object-permission-scripts/</link>
	<description>SQL Server Performance Tuning</description>
	<lastBuildDate>Fri, 17 May 2013 13:31:24 +0000</lastBuildDate>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.5.1</generator>
	<item>
		<title>By: Grant Fidler</title>
		<link>http://www.sql-server-performance.com/2002/object-permission-scripts/#comment-2908</link>
		<dc:creator>Grant Fidler</dc:creator>
		<pubDate>Tue, 15 Jan 2013 08:31:14 +0000</pubDate>
		<guid isPermaLink="false">http://www.sql-server-performance.com/?=408#comment-2908</guid>
		<description><![CDATA[Useful stuff.  However, in the database role script (possibly the other one as well, I didn&#039;t use that), you need to substitute SCHEMA_NAME() for USER_NAME() when generating the cursors list of objects.]]></description>
		<content:encoded><![CDATA[<p>Useful stuff.  However, in the database role script (possibly the other one as well, I didn&#8217;t use that), you need to substitute SCHEMA_NAME() for USER_NAME() when generating the cursors list of objects.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Robb Keller</title>
		<link>http://www.sql-server-performance.com/2002/object-permission-scripts/#comment-2667</link>
		<dc:creator>Robb Keller</dc:creator>
		<pubDate>Wed, 12 Dec 2012 16:41:52 +0000</pubDate>
		<guid isPermaLink="false">http://www.sql-server-performance.com/?=408#comment-2667</guid>
		<description><![CDATA[Here is a fixed version with replacing the user to fix SID issues:
SET NOCOUNT ON
DECLARE
@errStatement [varchar](8000),
@msgStatement [varchar](8000),
@DatabaseUserID [smallint],
@ServerUserName [sysname],
@RoleName [varchar](8000),
@ObjectID [int],
@ObjectName [varchar](261),
@DBUserName [varchar](255),
@DatabaseUserName [sysname]
SET @msgStatement = &#039;--Security creation script for users and roles &#039; + CHAR(13) +
&#039;--Created At: &#039; + CONVERT(varchar, GETDATE(), 112) + REPLACE(CONVERT(varchar, GETDATE(), 108), &#039;:&#039;, &#039;&#039;) + CHAR(13) +
&#039;--Created By: &#039; + SUSER_NAME() + CHAR(13) + CHAR(13) +
&#039;USE [&#039; + DB_NAME() + &#039;]&#039; + CHAR(13)
PRINT @msgStatement
DECLARE dbUsers CURSOR
FOR
SELECT [name] FROM sys.database_principals WHERE type  &#039;R&#039; ORDER BY [name]
OPEN dbUsers
FETCH NEXT FROM dbUsers INTO @DBUserName
WHILE @@FETCH_STATUS = 0
BEGIN
	SET @DatabaseUserName = @DBUserName
	SELECT	@DatabaseUserID = [sysusers].[uid],
			@ServerUserName = [master].[dbo].[syslogins].[loginname]
	FROM	[dbo].[sysusers]
			INNER JOIN [master].[dbo].[syslogins]
				ON [sysusers].[sid] = [master].[dbo].[syslogins].[sid]
	WHERE	[sysusers].[name] = @DatabaseUserName
	IF LEN(@ServerUserName) &gt; 0 AND LEN(@DatabaseUserName) &gt; 0
	BEGIN
		SET @msgStatement = &#039;IF EXISTS (SELECT name FROM sys.database_principals WHERE name = &#039;&#039;&#039; + @DatabaseUserName + &#039;&#039;&#039;)
	BEGIN
		EXEC sp_dropuser &#039;&#039;&#039; + @DatabaseUserName + &#039;&#039;&#039;
	END&#039; + CHAR(13) + CHAR(13) +
		&#039;--Add User To Database&#039; + CHAR(13) +
		&#039;EXEC [sp_grantdbaccess]&#039; + CHAR(13) +
		CHAR(9) + &#039;@loginame = &#039;&#039;&#039; + @ServerUserName + &#039;&#039;&#039;,&#039; + CHAR(13) +
		CHAR(9) + &#039;@name_in_db = &#039;&#039;&#039; + @DatabaseUserName + &#039;&#039;&#039;&#039; + CHAR(13) + CHAR(13) +
		&#039;--Add User To Roles&#039;
	END
	PRINT @msgStatement
	DECLARE _sysusers CURSOR LOCAL FORWARD_ONLY READ_ONLY
	FOR
	SELECT	[name]
	FROM	[dbo].[sysusers]
	WHERE	[uid] IN(	SELECT	[groupuid]
						FROM	[dbo].[sysmembers]
						WHERE	[memberuid] = @DatabaseUserID)
	OPEN _sysusers
	FETCH NEXT FROM _sysusers INTO @RoleName
	WHILE @@FETCH_STATUS = 0
		BEGIN
			IF LEN(@RoleName) &gt; 0 AND LEN(@DatabaseUserName) &gt; 0
				BEGIN
					SET @msgStatement = &#039;EXEC [sp_addrolemember]&#039; + CHAR(13) +
					CHAR(9) + &#039;@rolename = &#039;&#039;&#039; + @RoleName + &#039;&#039;&#039;,&#039; + CHAR(13) +
					CHAR(9) + &#039;@membername = &#039;&#039;&#039; + @DatabaseUserName + &#039;&#039;&#039;&#039; + CHAR(13) +
					CHAR(13) + &#039;--Set Object Specific Permissions&#039;
					PRINT @msgStatement
				END
			FETCH NEXT FROM _sysusers INTO @RoleName
		END
	CLOSE _sysusers
	DEALLOCATE _sysusers
	DECLARE _sysobjects CURSOR LOCAL FORWARD_ONLY READ_ONLY
	FOR
	SELECT DISTINCT([sysobjects].[id]),
			&#039;[&#039; + USER_NAME([sysobjects].[uid]) + &#039;].[&#039; + [sysobjects].[name] + &#039;]&#039;
	FROM	[dbo].[sysprotects]
			INNER JOIN [dbo].[sysobjects]
				ON [sysprotects].[id] = [sysobjects].[id]
	WHERE	[sysprotects].[uid] = @DatabaseUserID
	OPEN _sysobjects
	FETCH NEXT FROM _sysobjects INTO @ObjectID, @ObjectName
	WHILE @@FETCH_STATUS = 0
		BEGIN
			SET @msgStatement = &#039;&#039;
			IF EXISTS(SELECT * FROM [dbo].[sysprotects] WHERE [id] = @ObjectID AND [uid] = @DatabaseUserID AND [action] = 193 AND [protecttype] = 205)
			SET @msgStatement = @msgStatement + &#039;SELECT,&#039;
			IF EXISTS(SELECT * FROM [dbo].[sysprotects] WHERE [id] = @ObjectID AND [uid] = @DatabaseUserID AND [action] = 195 AND [protecttype] = 205)
			SET @msgStatement = @msgStatement + &#039;INSERT,&#039;
			IF EXISTS(SELECT * FROM [dbo].[sysprotects] WHERE [id] = @ObjectID AND [uid] = @DatabaseUserID AND [action] = 197 AND [protecttype] = 205)
			SET @msgStatement = @msgStatement + &#039;UPDATE,&#039;
			IF EXISTS(SELECT * FROM [dbo].[sysprotects] WHERE [id] = @ObjectID AND [uid] = @DatabaseUserID AND [action] = 196 AND [protecttype] = 205)
			SET @msgStatement = @msgStatement + &#039;DELETE,&#039;
			IF EXISTS(SELECT * FROM [dbo].[sysprotects] WHERE [id] = @ObjectID AND [uid] = @DatabaseUserID AND [action] = 224 AND [protecttype] = 205)
			SET @msgStatement = @msgStatement + &#039;EXECUTE,&#039;
			IF EXISTS(SELECT * FROM [dbo].[sysprotects] WHERE [id] = @ObjectID AND [uid] = @DatabaseUserID AND [action] = 26 AND [protecttype] = 205)
			SET @msgStatement = @msgStatement + &#039;REFERENCES,&#039;
			IF LEN(@msgStatement) &gt; 0
			BEGIN
				IF RIGHT(@msgStatement, 1) = &#039;,&#039;
				SET @msgStatement = LEFT(@msgStatement, LEN(@msgStatement) - 1)
				SET @msgStatement = &#039;GRANT&#039; + CHAR(13) +
				CHAR(9) + @msgStatement + CHAR(13) +
				CHAR(9) + &#039;ON &#039; + @ObjectName + CHAR(13) +
				CHAR(9) + &#039;TO [&#039; + @DatabaseUserName + &#039;]&#039;
				PRINT @msgStatement
			END
			SET @msgStatement = &#039;&#039;
			IF EXISTS(SELECT * FROM [dbo].[sysprotects] WHERE [id] = @ObjectID AND [uid] = @DatabaseUserID AND [action] = 193 AND [protecttype] = 206)
			SET @msgStatement = @msgStatement + &#039;SELECT,&#039;
			IF EXISTS(SELECT * FROM [dbo].[sysprotects] WHERE [id] = @ObjectID AND [uid] = @DatabaseUserID AND [action] = 195 AND [protecttype] = 206)
			SET @msgStatement = @msgStatement + &#039;INSERT,&#039;
			IF EXISTS(SELECT * FROM [dbo].[sysprotects] WHERE [id] = @ObjectID AND [uid] = @DatabaseUserID AND [action] = 197 AND [protecttype] = 206)
			SET @msgStatement = @msgStatement + &#039;UPDATE,&#039;
			IF EXISTS(SELECT * FROM [dbo].[sysprotects] WHERE [id] = @ObjectID AND [uid] = @DatabaseUserID AND [action] = 196 AND [protecttype] = 206)
			SET @msgStatement = @msgStatement + &#039;DELETE,&#039;
			IF EXISTS(SELECT * FROM [dbo].[sysprotects] WHERE [id] = @ObjectID AND [uid] = @DatabaseUserID AND [action] = 224 AND [protecttype] = 206)
			SET @msgStatement = @msgStatement + &#039;EXECUTE,&#039;
			IF EXISTS(SELECT * FROM [dbo].[sysprotects] WHERE [id] = @ObjectID AND [uid] = @DatabaseUserID AND [action] = 26 AND [protecttype] = 206)
			SET @msgStatement = @msgStatement + &#039;REFERENCES,&#039;
			IF LEN(@msgStatement) &gt; 0
			BEGIN
				IF RIGHT(@msgStatement, 1) = &#039;,&#039;
				SET @msgStatement = LEFT(@msgStatement, LEN(@msgStatement) - 1)
				SET @msgStatement = &#039;DENY&#039; + CHAR(13) +
				CHAR(9) + @msgStatement + CHAR(13) +
				CHAR(9) + &#039;ON &#039; + @ObjectName + CHAR(13) +
				CHAR(9) + &#039;TO [&#039; + @DatabaseUserName + &#039;]&#039;
				PRINT @msgStatement
			END
			FETCH NEXT FROM _sysobjects INTO @ObjectID, @ObjectName
		END
	CLOSE _sysobjects
	DEALLOCATE _sysobjects
	FETCH NEXT FROM dbUsers INTO @DBUserName
END
CLOSE dbUsers
DEALLOCATE dbUsers]]></description>
		<content:encoded><![CDATA[<p>Here is a fixed version with replacing the user to fix SID issues:</p>
<p>SET NOCOUNT ON</p>
<p>DECLARE<br />
@errStatement [varchar](8000),<br />
@msgStatement [varchar](8000),<br />
@DatabaseUserID [smallint],<br />
@ServerUserName [sysname],<br />
@RoleName [varchar](8000),<br />
@ObjectID [int],<br />
@ObjectName [varchar](261),<br />
@DBUserName [varchar](255),<br />
@DatabaseUserName [sysname]</p>
<p>SET @msgStatement = &#8216;&#8211;Security creation script for users and roles &#8216; + CHAR(13) +<br />
&#8216;&#8211;Created At: &#8216; + CONVERT(varchar, GETDATE(), 112) + REPLACE(CONVERT(varchar, GETDATE(), 108), &#8216;:&#8217;, &#8221;) + CHAR(13) +<br />
&#8216;&#8211;Created By: &#8216; + SUSER_NAME() + CHAR(13) + CHAR(13) +<br />
&#8216;USE [' + DB_NAME() + ']&#8216; + CHAR(13)</p>
<p>PRINT @msgStatement</p>
<p>DECLARE dbUsers CURSOR<br />
FOR<br />
SELECT [name] FROM sys.database_principals WHERE type  &#8216;R&#8217; ORDER BY [name]</p>
<p>OPEN dbUsers</p>
<p>FETCH NEXT FROM dbUsers INTO @DBUserName</p>
<p>WHILE @@FETCH_STATUS = 0<br />
BEGIN</p>
<p>	SET @DatabaseUserName = @DBUserName</p>
<p>	SELECT	@DatabaseUserID = [sysusers].[uid],<br />
			@ServerUserName = [master].[dbo].[syslogins].[loginname]<br />
	FROM	[dbo].[sysusers]<br />
			INNER JOIN [master].[dbo].[syslogins]<br />
				ON [sysusers].[sid] = [master].[dbo].[syslogins].[sid]<br />
	WHERE	[sysusers].[name] = @DatabaseUserName</p>
<p>	IF LEN(@ServerUserName) &gt; 0 AND LEN(@DatabaseUserName) &gt; 0<br />
	BEGIN<br />
		SET @msgStatement = &#8216;IF EXISTS (SELECT name FROM sys.database_principals WHERE name = &#8221;&#8217; + @DatabaseUserName + &#8221;&#8217;)<br />
	BEGIN<br />
		EXEC sp_dropuser &#8221;&#8217; + @DatabaseUserName + &#8221;&#8217;<br />
	END&#8217; + CHAR(13) + CHAR(13) +<br />
		&#8216;&#8211;Add User To Database&#8217; + CHAR(13) +<br />
		&#8216;EXEC [sp_grantdbaccess]&#8216; + CHAR(13) +<br />
		CHAR(9) + &#8216;@loginame = &#8221;&#8217; + @ServerUserName + &#8221;&#8217;,&#8217; + CHAR(13) +<br />
		CHAR(9) + &#8216;@name_in_db = &#8221;&#8217; + @DatabaseUserName + &#8221;&#8221; + CHAR(13) + CHAR(13) +<br />
		&#8216;&#8211;Add User To Roles&#8217;<br />
	END</p>
<p>	PRINT @msgStatement</p>
<p>	DECLARE _sysusers CURSOR LOCAL FORWARD_ONLY READ_ONLY</p>
<p>	FOR</p>
<p>	SELECT	[name]<br />
	FROM	[dbo].[sysusers]<br />
	WHERE	[uid] IN(	SELECT	[groupuid]<br />
						FROM	[dbo].[sysmembers]<br />
						WHERE	[memberuid] = @DatabaseUserID)</p>
<p>	OPEN _sysusers</p>
<p>	FETCH NEXT FROM _sysusers INTO @RoleName</p>
<p>	WHILE @@FETCH_STATUS = 0<br />
		BEGIN<br />
			IF LEN(@RoleName) &gt; 0 AND LEN(@DatabaseUserName) &gt; 0<br />
				BEGIN<br />
					SET @msgStatement = &#8216;EXEC [sp_addrolemember]&#8216; + CHAR(13) +<br />
					CHAR(9) + &#8216;@rolename = &#8221;&#8217; + @RoleName + &#8221;&#8217;,&#8217; + CHAR(13) +<br />
					CHAR(9) + &#8216;@membername = &#8221;&#8217; + @DatabaseUserName + &#8221;&#8221; + CHAR(13) +<br />
					CHAR(13) + &#8216;&#8211;Set Object Specific Permissions&#8217;</p>
<p>					PRINT @msgStatement<br />
				END</p>
<p>			FETCH NEXT FROM _sysusers INTO @RoleName<br />
		END</p>
<p>	CLOSE _sysusers<br />
	DEALLOCATE _sysusers</p>
<p>	DECLARE _sysobjects CURSOR LOCAL FORWARD_ONLY READ_ONLY</p>
<p>	FOR</p>
<p>	SELECT DISTINCT([sysobjects].[id]),<br />
			&#8216;[' + USER_NAME([sysobjects].[uid]) + &#8216;].[' + [sysobjects].[name] + &#8216;]&#8217;<br />
	FROM	[dbo].[sysprotects]<br />
			INNER JOIN [dbo].[sysobjects]<br />
				ON [sysprotects].[id] = [sysobjects].[id]<br />
	WHERE	[sysprotects].[uid] = @DatabaseUserID</p>
<p>	OPEN _sysobjects</p>
<p>	FETCH NEXT FROM _sysobjects INTO @ObjectID, @ObjectName</p>
<p>	WHILE @@FETCH_STATUS = 0<br />
		BEGIN<br />
			SET @msgStatement = &#8221;<br />
			IF EXISTS(SELECT * FROM [dbo].[sysprotects] WHERE [id] = @ObjectID AND [uid] = @DatabaseUserID AND [action] = 193 AND [protecttype] = 205)<br />
			SET @msgStatement = @msgStatement + &#8216;SELECT,&#8217;<br />
			IF EXISTS(SELECT * FROM [dbo].[sysprotects] WHERE [id] = @ObjectID AND [uid] = @DatabaseUserID AND [action] = 195 AND [protecttype] = 205)<br />
			SET @msgStatement = @msgStatement + &#8216;INSERT,&#8217;<br />
			IF EXISTS(SELECT * FROM [dbo].[sysprotects] WHERE [id] = @ObjectID AND [uid] = @DatabaseUserID AND [action] = 197 AND [protecttype] = 205)<br />
			SET @msgStatement = @msgStatement + &#8216;UPDATE,&#8217;<br />
			IF EXISTS(SELECT * FROM [dbo].[sysprotects] WHERE [id] = @ObjectID AND [uid] = @DatabaseUserID AND [action] = 196 AND [protecttype] = 205)<br />
			SET @msgStatement = @msgStatement + &#8216;DELETE,&#8217;<br />
			IF EXISTS(SELECT * FROM [dbo].[sysprotects] WHERE [id] = @ObjectID AND [uid] = @DatabaseUserID AND [action] = 224 AND [protecttype] = 205)<br />
			SET @msgStatement = @msgStatement + &#8216;EXECUTE,&#8217;<br />
			IF EXISTS(SELECT * FROM [dbo].[sysprotects] WHERE [id] = @ObjectID AND [uid] = @DatabaseUserID AND [action] = 26 AND [protecttype] = 205)<br />
			SET @msgStatement = @msgStatement + &#8216;REFERENCES,&#8217;</p>
<p>			IF LEN(@msgStatement) &gt; 0<br />
			BEGIN<br />
				IF RIGHT(@msgStatement, 1) = &#8216;,&#8217;<br />
				SET @msgStatement = LEFT(@msgStatement, LEN(@msgStatement) &#8211; 1)<br />
				SET @msgStatement = &#8216;GRANT&#8217; + CHAR(13) +<br />
				CHAR(9) + @msgStatement + CHAR(13) +<br />
				CHAR(9) + &#8216;ON &#8216; + @ObjectName + CHAR(13) +<br />
				CHAR(9) + &#8216;TO [' + @DatabaseUserName + ']&#8216;</p>
<p>				PRINT @msgStatement<br />
			END</p>
<p>			SET @msgStatement = &#8221;</p>
<p>			IF EXISTS(SELECT * FROM [dbo].[sysprotects] WHERE [id] = @ObjectID AND [uid] = @DatabaseUserID AND [action] = 193 AND [protecttype] = 206)<br />
			SET @msgStatement = @msgStatement + &#8216;SELECT,&#8217;<br />
			IF EXISTS(SELECT * FROM [dbo].[sysprotects] WHERE [id] = @ObjectID AND [uid] = @DatabaseUserID AND [action] = 195 AND [protecttype] = 206)<br />
			SET @msgStatement = @msgStatement + &#8216;INSERT,&#8217;<br />
			IF EXISTS(SELECT * FROM [dbo].[sysprotects] WHERE [id] = @ObjectID AND [uid] = @DatabaseUserID AND [action] = 197 AND [protecttype] = 206)<br />
			SET @msgStatement = @msgStatement + &#8216;UPDATE,&#8217;<br />
			IF EXISTS(SELECT * FROM [dbo].[sysprotects] WHERE [id] = @ObjectID AND [uid] = @DatabaseUserID AND [action] = 196 AND [protecttype] = 206)<br />
			SET @msgStatement = @msgStatement + &#8216;DELETE,&#8217;<br />
			IF EXISTS(SELECT * FROM [dbo].[sysprotects] WHERE [id] = @ObjectID AND [uid] = @DatabaseUserID AND [action] = 224 AND [protecttype] = 206)<br />
			SET @msgStatement = @msgStatement + &#8216;EXECUTE,&#8217;<br />
			IF EXISTS(SELECT * FROM [dbo].[sysprotects] WHERE [id] = @ObjectID AND [uid] = @DatabaseUserID AND [action] = 26 AND [protecttype] = 206)</p>
<p>			SET @msgStatement = @msgStatement + &#8216;REFERENCES,&#8217;</p>
<p>			IF LEN(@msgStatement) &gt; 0<br />
			BEGIN<br />
				IF RIGHT(@msgStatement, 1) = &#8216;,&#8217;<br />
				SET @msgStatement = LEFT(@msgStatement, LEN(@msgStatement) &#8211; 1)<br />
				SET @msgStatement = &#8216;DENY&#8217; + CHAR(13) +<br />
				CHAR(9) + @msgStatement + CHAR(13) +<br />
				CHAR(9) + &#8216;ON &#8216; + @ObjectName + CHAR(13) +<br />
				CHAR(9) + &#8216;TO [' + @DatabaseUserName + ']&#8216;</p>
<p>				PRINT @msgStatement</p>
<p>			END</p>
<p>			FETCH NEXT FROM _sysobjects INTO @ObjectID, @ObjectName<br />
		END</p>
<p>	CLOSE _sysobjects<br />
	DEALLOCATE _sysobjects</p>
<p>	FETCH NEXT FROM dbUsers INTO @DBUserName<br />
END</p>
<p>CLOSE dbUsers<br />
DEALLOCATE dbUsers</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Custom Software Mark</title>
		<link>http://www.sql-server-performance.com/2002/object-permission-scripts/#comment-1654</link>
		<dc:creator>Custom Software Mark</dc:creator>
		<pubDate>Thu, 08 Mar 2012 17:20:31 +0000</pubDate>
		<guid isPermaLink="false">http://www.sql-server-performance.com/?=408#comment-1654</guid>
		<description><![CDATA[Both scripts a great.
Can I offer a formatting suggestion? When you copy your scripts from the web site into Query Analyzer, you have to changes A LOT OF things! The quotes, minus signs, double quotes, spacing get messed up.
But after I cleaned all of that up, scripts work great!]]></description>
		<content:encoded><![CDATA[<p>Both scripts a great.</p>
<p>Can I offer a formatting suggestion? When you copy your scripts from the web site into Query Analyzer, you have to changes A LOT OF things! The quotes, minus signs, double quotes, spacing get messed up. </p>
<p>But after I cleaned all of that up, scripts work great!</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Jigar Bhatt</title>
		<link>http://www.sql-server-performance.com/2002/object-permission-scripts/#comment-508</link>
		<dc:creator>Jigar Bhatt</dc:creator>
		<pubDate>Wed, 03 Aug 2011 11:36:29 +0000</pubDate>
		<guid isPermaLink="false">http://www.sql-server-performance.com/?=408#comment-508</guid>
		<description><![CDATA[The script helped me alot and it saved my manual work. Thanks a lot dude.]]></description>
		<content:encoded><![CDATA[<p>The script helped me alot and it saved my manual work. Thanks a lot dude.</p>
]]></content:encoded>
	</item>
</channel>
</rss>
