<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://sqlblog.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Search results matching tags 'T-SQL', 'SQL Server 2008 R2', and 'good practices'</title><link>http://sqlblog.com/search/SearchResults.aspx?o=DateDescending&amp;tag=T-SQL,SQL+Server+2008+R2,good+practices&amp;orTags=0</link><description>Search results matching tags 'T-SQL', 'SQL Server 2008 R2', and 'good practices'</description><dc:language>en-US</dc:language><generator>CommunityServer 2.1 SP2 (Build: 61129.1)</generator><item><title>Server level permissions for developers–why you should read books</title><link>http://sqlblog.com/blogs/piotr_rodak/archive/2012/01/01/server-level-permissions-for-developers-why-you-should-read-books.aspx</link><pubDate>Mon, 02 Jan 2012 03:05:00 GMT</pubDate><guid isPermaLink="false">21093a07-8b3d-42db-8cbf-3350fcbf5496:40715</guid><dc:creator>rodak.p@gmail.com</dc:creator><description>&lt;p&gt;It is quite difficult recently for me to find some time to write a new post, so I don’t seem to be leading the rankings of the most frequent bloggers. I rarely recently have opportunity to lay my hands on the code too, so natural sources of ‘inspiration’ are less often. Hopefully this will change in 2012 and I will have more opportunities to write something useful.&lt;/p&gt;  &lt;p&gt;In a big enterprise the roles of server users are usually more distinguished than in smaller companies. You have DBAs, developers and business users. Each of these roles has generally different goals and different rights when it comes to connecting to the database servers. Large organizations tend to implement service oriented approach to processes, which means that various teams are responsible for executing various tasks ordered by other teams. In the case of developers and DBAs, the latter are responsible for all maintenance and management tasks on servers which are ‘owned’ by developers. Such organisation of work often results in sealing off developers from the maintenance related activities, such as creating databases or snapshots, running traces, viewing server state and troubleshooting blocks and deadlocks. This approach unfortunately, while imposes more order to the server utilization and prevents accidental failures, tends to slow down the development process, sometimes preventing any work from being done by significant number of developers for time anything from few minutes to few hours. This is a waste of time and money of course. In my case, development team wanted to have right to kill user sessions on development servers. You know, sometimes there is a process that takes a lot of time and locks, or there is an open transaction keeping schema locks all over the place and and the owner of it is gone for the day without committing it.&lt;/p&gt;  &lt;p&gt;Problem is, that to be able to kill a session, you have to be a sysadmin, processadmin, or have ALTER ANY CONNECTION right granted to you at server level. Obviously, in certain environments these permissions are not the ones DBAs want to give to &lt;strike&gt;random people&lt;/strike&gt; developers. If you GRANT ALTER ANY CONNECTION to a login, this login can kill some important sessions, not only the runaway ones. It may break audit, scheduled maintenance, backups, other teams ETL processes – just imagine your mailbox – it ain’t gonna look pretty. It would be much better to be able to grant login right to kill only spids belonging to certain users or working on certain databases. How can you eat the cake and have the cake?&lt;/p&gt;  &lt;p&gt;I remembered that I had read about this idea in one of the books, namely &lt;a target="_blank" href="http://www.amazon.com/exec/obidos/ASIN/159059729X/ref=nosim/apre-20"&gt;Expert SQL Server 2005 Development&lt;/a&gt; by &lt;a target="_blank" href="http://sqlblog.com/blogs/adam_machanic/"&gt;Adam Machanic&lt;/a&gt;, &lt;a target="_blank" href="http://sqlblog.com/blogs/lara_rubbelke/"&gt;Lara Rubbelke&lt;/a&gt; and &lt;a target="_blank" href="http://sqlblog.com/blogs/hugo_kornelis/"&gt;Hugo Kornelis&lt;/a&gt;. This is an excellent book, you should really read it if you haven’t yet done so. There is a chapter in the book, discussing the security features introduced in SQL Server 2005. These features allow architects to design more versatile and complex applications without jeopardizing security requirements. As you know, the security model in SQL Server 2005 has been completely revamped, for example the notion of the &lt;b&gt;&lt;a target="_blank" href="http://msdn.microsoft.com/en-us/library/ms190387%28v=SQL.90%29.aspx"&gt;schema&lt;/a&gt;&lt;/b&gt; was separated from the ownership and database user. There are more features, one of most important probably is the ability to sign stored procedures with certificates and to create logins and users from the certificates. The discussion about security architecture and certificates is huge and going beyond scope of this post. One of the starting points you can check out is the MSDN article "&lt;a target="_blank" href="http://msdn.microsoft.com/en-us/library/bb283235.aspx"&gt;Securing SQL Server&lt;/a&gt;”.&lt;/p&gt;  &lt;p&gt;In short, if you were to grant server wide elevated rights to certain groups of users, how would you do it? Here’s a little shopping list:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Create a certificate &lt;/li&gt;    &lt;li&gt;Create a login &lt;b&gt;from the certificate&lt;/b&gt; &lt;/li&gt;    &lt;li&gt;Grant ALTER ANY CONNECTION to the login &lt;/li&gt;    &lt;li&gt;If you want to have the procedure in database other than master, you must copy the certificate to this database. You do it with backup-restore technique.&lt;/li&gt;    &lt;li&gt;Create a user for the login &lt;/li&gt;    &lt;li&gt;Create stored procedure that will issue KILL command &lt;/li&gt;    &lt;li&gt;Sign the procedure with the certificate &lt;/li&gt;    &lt;li&gt;Grant EXECUTE on the procedure to developers. &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;Here are some highlights of the solution. I attach the testing code at the end of the post as usual.&lt;/p&gt;  &lt;p&gt;Sample code for creating certificate and the login is as follows.&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:f93dc5b1-ded6-4fc1-9dd3-f16da8d75066" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:'Courier New', Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#ddd;max-height:400px;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2.5em;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#008000;"&gt;---create certificate that the procedure will be signed with&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#0000ff;"&gt;create&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;certificate&lt;/span&gt; kill_session_certificate&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000ff;"&gt;encryption&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;by&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;password&lt;/span&gt; &lt;span style="color:#808080;"&gt;=&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;'1410SomeReallyStrongPassword2011!'&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000ff;"&gt;with&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;subject&lt;/span&gt; &lt;span style="color:#808080;"&gt;=&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;'Enable KILL through procedure'&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;go&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#008000;"&gt;---create login that will be granted right to kill sessions&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;create&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;login&lt;/span&gt; kill_login &lt;span style="color:#0000ff;"&gt;from&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;certificate&lt;/span&gt; kill_session_certificate&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#0000ff;"&gt;go&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#008000;"&gt;--licence to kill&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;grant&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;ALTER&lt;/span&gt; &lt;span style="color:#808080;"&gt;ANY&lt;/span&gt; CONNECTION &lt;span style="color:#0000ff;"&gt;to&lt;/span&gt; kill_login&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;This is the stored procedure developers can call to kill sessions.&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:410bd5b7-2e04-4537-b97b-1b3c519ad81b" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:'Courier New', Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#ddd;max-height:400px;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2.5em;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;create&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;procedure&lt;/span&gt; killsession&lt;span style="color:#808080;"&gt;(&lt;/span&gt;@sessionid &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt;&lt;span style="color:#808080;"&gt;)&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#0000ff;"&gt;as&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;begin&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;/* Piotr Rodak: procedure calls KILL command. Must be signed by certificate to work.*/&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000ff;"&gt;print&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;'killsession: executing as '&lt;/span&gt; &lt;span style="color:#808080;"&gt;+&lt;/span&gt; &lt;span style="color:#ff00ff;"&gt;suser_name&lt;/span&gt;&lt;span style="color:#808080;"&gt;()&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000ff;"&gt;declare&lt;/span&gt; @command &lt;span style="color:#0000ff;"&gt;varchar&lt;/span&gt;&lt;span style="color:#808080;"&gt;(&lt;/span&gt;300&lt;span style="color:#808080;"&gt;)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000ff;"&gt;set&lt;/span&gt; @command &lt;span style="color:#808080;"&gt;=&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;'kill '&lt;/span&gt; &lt;span style="color:#808080;"&gt;+&lt;/span&gt; &lt;span style="color:#ff00ff;"&gt;convert&lt;/span&gt;&lt;span style="color:#808080;"&gt;(&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;varchar&lt;/span&gt;&lt;span style="color:#808080;"&gt;,&lt;/span&gt; @sessionid&lt;span style="color:#808080;"&gt;)&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000ff;"&gt;print&lt;/span&gt; @command&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;---you can filter only sessions running on certain databases here.. &lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000ff;"&gt;exec&lt;/span&gt;&lt;span style="color:#808080;"&gt;(&lt;/span&gt;@command&lt;span style="color:#808080;"&gt;)&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;---you can add logging here.. &lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000ff;"&gt;print&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;'killed session '&lt;/span&gt; &lt;span style="color:#808080;"&gt;+&lt;/span&gt; &lt;span style="color:#ff00ff;"&gt;convert&lt;/span&gt;&lt;span style="color:#808080;"&gt;(&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;varchar&lt;/span&gt;&lt;span style="color:#808080;"&gt;,&lt;/span&gt; @sessionid&lt;span style="color:#808080;"&gt;)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;end&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;You can create the procedure in any database, but if you choose a database different than master you have to copy the certificate from master to the target database.&lt;/p&gt;  &lt;p&gt;And here’s code to sign the procedure:&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:56e9ab18-9eb8-4807-8ff2-563406307332" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:'Courier New', Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#ddd;max-height:500px;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2em;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#008000;"&gt;---sign the procedure with the certificate&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#0000ff;"&gt;add&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;signature&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;to&lt;/span&gt; killsession &lt;span style="color:#0000ff;"&gt;by&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;certificate&lt;/span&gt; kill_session_certificate&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;with&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;password&lt;/span&gt; &lt;span style="color:#808080;"&gt;=&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;'1410SomeReallyStrongPassword2011!'&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;Since you are executing the command wrapped into a stored procedure, you have potential to implement additional audit, like grab execution plan or some other performance indicators of the server at the moment when the command is issued. This can be extremely helpful for troubleshooting reasons. I think this is pretty cool.&lt;/p&gt;            &lt;p&gt;Here’s the testing &lt;a target="_blank" href="https://docs.google.com/open?id=0B5ayjYKh-6TxNjYxYWM3YzItMmM2ZC00ZTA2LTg3ZWEtNmU4MzYzNTg0NmRh"&gt;script&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Enjoy.&lt;/p&gt;</description></item><item><title>Security – how to assign rights to database objects</title><link>http://sqlblog.com/blogs/piotr_rodak/archive/2011/04/10/security-how-to-assign-rights-to-database-objects.aspx</link><pubDate>Sun, 10 Apr 2011 09:23:00 GMT</pubDate><guid isPermaLink="false">21093a07-8b3d-42db-8cbf-3350fcbf5496:34777</guid><dc:creator>rodak.p@gmail.com</dc:creator><description>&lt;p&gt;A few days ago my team mate asked me to check out why one of the logins doesn’t have right to execute to a few stored procedures. Allegedly it had the right before. After a few minutes of digging in the source control it turned out that these procedures were scripted with explicit EXECUTE rights to them. However, some later updates to the code did not contain the rights scripted. Developers rarely pay too much attention to the security design of the code they write. It is not common that the code is implemented with least possible access level in mind. A classic example of this is TRUNCATE TABLE. While this is very handy command and can be very useful in certain scenarios, developers don’t realize that the user account executing it has to have some elevated rights. &lt;/p&gt;  &lt;p&gt;I have seen many databases which implement explicit rights to objects. This is to some degree a legacy issue, as in SQL Server 2000 and before security model was completely different and more difficult to manage. The common practice at the time was to script rights to objects, and to make things simple everyone who had right to connect to database could do everything in it. Even recently I saw a table with explicit rights like this:&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:24860838-d6c2-428e-87c3-6d211242970e" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:'Courier New', Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#ddd;max-height:400px;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2.5em;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;create&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;table&lt;/span&gt; dbo&lt;span style="color:#808080;"&gt;.&lt;/span&gt;sometable&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#808080;"&gt;(&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    column1 &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt;&lt;span style="color:#808080;"&gt;,&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    columnt2 &lt;span style="color:#0000ff;"&gt;char&lt;/span&gt;&lt;span style="color:#808080;"&gt;(&lt;/span&gt;1&lt;span style="color:#808080;"&gt;),&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    column3 &lt;span style="color:#0000ff;"&gt;varchar&lt;/span&gt;&lt;span style="color:#808080;"&gt;(&lt;/span&gt;255&lt;span style="color:#808080;"&gt;)&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#808080;"&gt;)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;go&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;grant&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;select&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;on&lt;/span&gt; dbo&lt;span style="color:#808080;"&gt;.&lt;/span&gt;sometable &lt;span style="color:#0000ff;"&gt;to&lt;/span&gt; [public]&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#0000ff;"&gt;grant&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;delete&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;on&lt;/span&gt; dbo&lt;span style="color:#808080;"&gt;.&lt;/span&gt;sometable &lt;span style="color:#0000ff;"&gt;to&lt;/span&gt; [public]&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;grant&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;insert&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;on&lt;/span&gt; dbo&lt;span style="color:#808080;"&gt;.&lt;/span&gt;sometable &lt;span style="color:#0000ff;"&gt;to&lt;/span&gt; [public]&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#0000ff;"&gt;grant&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;update&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;on&lt;/span&gt; dbo&lt;span style="color:#808080;"&gt;.&lt;/span&gt;sometable &lt;span style="color:#0000ff;"&gt;to&lt;/span&gt; [public]&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#0000ff;"&gt;go&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&lt;font size="1"&gt;&lt;strong&gt;This is definitely a bad practice.&lt;/strong&gt;&lt;/font&gt;&amp;#160; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Let’s examine slightly different scenario, the one that I mentioned at the beginning of this post. Let’s analyse what options you have when you need to give user rights to execute a stored procedure but do don’t want to give rights to public role:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Assign explicit rights for the user to the procedure. &lt;/li&gt;    &lt;li&gt;Assign explicit rights to a role and assign user to that role &lt;/li&gt;    &lt;li&gt;Create the procedure within a separate schema, assign user to specific role and assign rights for the schema to the role. &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;The above three options have their pros and cons. The first option is in most cases an aftermath of legacy design and while it is most granular, it is also hardest to manage and monitor.&lt;/p&gt;  &lt;p&gt;Second option is also very granular, the only difference is after all that the rights are assigned to a database role. Main advantage of this solution is that you can assign more than one user to the database role and they will be automatically granted required access to the objects.&lt;/p&gt;  &lt;p&gt;The third option requires some consideration regarding design of the database. You may need to change some code calling the procedures. You may still want to create a database role and assign rights for the schema to the role. This gives you best flexibility.&lt;/p&gt;  &lt;p&gt;Let’s examine some of the effects each of these options brings in when implemented. I created script file that examines six scenarios you may come across in your database. This is definitely not a complete list, bear in mind.&lt;/p&gt;  &lt;p&gt;First, let’s create test database and login that we will use to test the solutions. I will also create a sample table and stored procedure in the database.&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:f94218d3-9808-4161-be7b-f62611ef092a" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:'Courier New', Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#ddd;max-height:400px;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2.5em;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;use&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;master&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#0000ff;"&gt;go&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;create&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;login&lt;/span&gt; RemoteLogin &lt;span style="color:#0000ff;"&gt;with&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;password&lt;/span&gt;&lt;span style="color:#808080;"&gt;=&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;&amp;#39;Str()ngPwd&amp;#39;&lt;/span&gt;&lt;span style="color:#808080;"&gt;,&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;check_policy&lt;/span&gt;&lt;span style="color:#808080;"&gt;=&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;off&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#0000ff;"&gt;go&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;create&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;database&lt;/span&gt; testExecRights&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#0000ff;"&gt;go&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;use&lt;/span&gt; testExecRights&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#0000ff;"&gt;go&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;create&lt;/span&gt; &lt;span style="color:#ff00ff;"&gt;user&lt;/span&gt; [RemoteUser] &lt;span style="color:#0000ff;"&gt;from&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;login&lt;/span&gt; [RemoteLogin]&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#0000ff;"&gt;go&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;create&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;table&lt;/span&gt; dbo&lt;span style="color:#808080;"&gt;.&lt;/span&gt;tTest&lt;span style="color:#808080;"&gt;(&lt;/span&gt;a &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt;&lt;span style="color:#808080;"&gt;,&lt;/span&gt; b &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt;&lt;span style="color:#808080;"&gt;)&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#0000ff;"&gt;go&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;create&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;procedure&lt;/span&gt; dbo&lt;span style="color:#808080;"&gt;.&lt;/span&gt;pTestInsert&lt;span style="color:#808080;"&gt;(&lt;/span&gt;@a &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt;&lt;span style="color:#808080;"&gt;,&lt;/span&gt; @b &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt;&lt;span style="color:#808080;"&gt;)&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#0000ff;"&gt;as&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;begin&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="color:#0000ff;"&gt;insert&lt;/span&gt; dbo&lt;span style="color:#808080;"&gt;.&lt;/span&gt;tTest&lt;span style="color:#808080;"&gt;(&lt;/span&gt;a&lt;span style="color:#808080;"&gt;,&lt;/span&gt; b&lt;span style="color:#808080;"&gt;)&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;values&lt;/span&gt;&lt;span style="color:#808080;"&gt;(&lt;/span&gt;@a&lt;span style="color:#808080;"&gt;,&lt;/span&gt; @b&lt;span style="color:#808080;"&gt;)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;end&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#0000ff;"&gt;go&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;The first scenario shows what happens when you create an user in the database, but you don’t assign any specific rights for it.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:c51af934-ccfe-4e92-8163-e69c009f58cd" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:'Courier New', Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#ddd;max-height:400px;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2.5em;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#008000;"&gt;---Scenario 1: user has public right to the database&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#0000ff;"&gt;execute&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;as&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;login&lt;/span&gt;&lt;span style="color:#808080;"&gt;=&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;&amp;#39;RemoteLogin&amp;#39;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;select&lt;/span&gt; &lt;span style="color:#ff00ff;"&gt;suser_name&lt;/span&gt;&lt;span style="color:#808080;"&gt;()&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#0000ff;"&gt;go&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="color:#0000ff;"&gt;begin&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;try&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#008000;"&gt;---should fail&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        &lt;span style="color:#0000ff;"&gt;exec&lt;/span&gt; dbo&lt;span style="color:#808080;"&gt;.&lt;/span&gt;pTestInsert&lt;span style="color:#0000ff;"&gt; &lt;/span&gt;1&lt;span style="color:#808080;"&gt;,&lt;/span&gt; 1&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt;&lt;span style="color:#808080;"&gt;;&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="color:#0000ff;"&gt;end&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;try&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff;"&gt;begin&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;catch&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        &lt;span style="color:#0000ff;"&gt;declare&lt;/span&gt; @errormsg &lt;span style="color:#0000ff;"&gt;nvarchar&lt;/span&gt;&lt;span style="color:#808080;"&gt;(&lt;/span&gt;2000&lt;span style="color:#808080;"&gt;)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff;"&gt;set&lt;/span&gt; @errormsg &lt;span style="color:#808080;"&gt;=&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;N&amp;#39;Scenario 1: Exception occured in &amp;#39;&lt;/span&gt; &lt;span style="color:#808080;"&gt;+&lt;/span&gt; &lt;span style="color:#ff00ff;"&gt;error_procedure&lt;/span&gt;&lt;span style="color:#808080;"&gt;()&lt;/span&gt; &lt;span style="color:#808080;"&gt;+&lt;/span&gt; &lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;            &lt;span style="color:#ff0000;"&gt;N&amp;#39;: &amp;#39;&lt;/span&gt; &lt;span style="color:#808080;"&gt;+&lt;/span&gt; &lt;span style="color:#ff00ff;"&gt;error_message&lt;/span&gt;&lt;span style="color:#808080;"&gt;()&lt;/span&gt; &lt;span style="color:#808080;"&gt;+&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;N&amp;#39; (&amp;#39;&lt;/span&gt; &lt;span style="color:#808080;"&gt;+&lt;/span&gt; &lt;span style="color:#ff00ff;"&gt;convert&lt;/span&gt;&lt;span style="color:#808080;"&gt;(&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;nvarchar&lt;/span&gt;&lt;span style="color:#808080;"&gt;,&lt;/span&gt; &lt;span style="color:#ff00ff;"&gt;error_number&lt;/span&gt;&lt;span style="color:#808080;"&gt;())&lt;/span&gt; &lt;span style="color:#808080;"&gt;+&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;N&amp;#39;)&amp;#39;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff;"&gt;raiserror&lt;/span&gt;&lt;span style="color:#808080;"&gt;(&lt;/span&gt;@errormsg&lt;span style="color:#808080;"&gt;,&lt;/span&gt; 16&lt;span style="color:#808080;"&gt;,&lt;/span&gt; 1&lt;span style="color:#808080;"&gt;)&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="color:#0000ff;"&gt;end&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;catch&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;This code throws an exception, as expected:&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:f4187380-52b0-4f01-9ed4-c7af4382eed7" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:'Courier New', Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background-color:#ffffff;max-height:400px;overflow:auto;padding:2px 5px;"&gt;Msg 50000, Level 16, State 1, Line 10&lt;br&gt; Scenario 1: Exception occured in pTestInsert: The EXECUTE permission was denied on the object &amp;#39;pTestInsert&amp;#39;, database &amp;#39;testExecRights&amp;#39;, schema &amp;#39;dbo&amp;#39;. (229)&lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;Let’s have a look what we’ll get when we assign the right to execute the stored procedure explicitly:&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:c98a1426-26b6-49f7-9c76-0d3975f059cf" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:'Courier New', Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#ddd;max-height:400px;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2.5em;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#008000;"&gt;---Scenario 2: user has explicit right to execute the procedure&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#008000;"&gt;---this is executed at sa/dbo level&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;grant&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;execute&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;on&lt;/span&gt; dbo&lt;span style="color:#808080;"&gt;.&lt;/span&gt;pTestInsert &lt;span style="color:#0000ff;"&gt;to&lt;/span&gt; [RemoteUser]&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#0000ff;"&gt;go&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;execute&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;as&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;login&lt;/span&gt;&lt;span style="color:#808080;"&gt;=&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;&amp;#39;RemoteLogin&amp;#39;&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#0000ff;"&gt;select&lt;/span&gt; &lt;span style="color:#ff00ff;"&gt;suser_name&lt;/span&gt;&lt;span style="color:#808080;"&gt;()&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;go&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="color:#0000ff;"&gt;begin&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;try&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#008000;"&gt;---should succeed&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        &lt;span style="color:#0000ff;"&gt;exec&lt;/span&gt; dbo&lt;span style="color:#808080;"&gt;.&lt;/span&gt;pTestInsert&lt;span style="color:#0000ff;"&gt; &lt;/span&gt;1&lt;span style="color:#808080;"&gt;,&lt;/span&gt; 1&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt;&lt;span style="color:#808080;"&gt;;&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="color:#0000ff;"&gt;end&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;try&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff;"&gt;begin&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;catch&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        &lt;span style="color:#0000ff;"&gt;declare&lt;/span&gt; @errormsg &lt;span style="color:#0000ff;"&gt;nvarchar&lt;/span&gt;&lt;span style="color:#808080;"&gt;(&lt;/span&gt;2000&lt;span style="color:#808080;"&gt;)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff;"&gt;set&lt;/span&gt; @errormsg &lt;span style="color:#808080;"&gt;=&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;N&amp;#39;Scenario 2: Exception occured in &amp;#39;&lt;/span&gt; &lt;span style="color:#808080;"&gt;+&lt;/span&gt; &lt;span style="color:#ff00ff;"&gt;error_procedure&lt;/span&gt;&lt;span style="color:#808080;"&gt;()&lt;/span&gt; &lt;span style="color:#808080;"&gt;+&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;N&amp;#39;: &amp;#39;&lt;/span&gt; &lt;span style="color:#808080;"&gt;+&lt;/span&gt; &lt;span style="color:#ff00ff;"&gt;error_message&lt;/span&gt;&lt;span style="color:#808080;"&gt;()&lt;/span&gt; &lt;span style="color:#808080;"&gt;+&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;N&amp;#39; (&amp;#39;&lt;/span&gt; &lt;span style="color:#808080;"&gt;+&lt;/span&gt; &lt;span style="color:#ff00ff;"&gt;convert&lt;/span&gt;&lt;span style="color:#808080;"&gt;(&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;nvarchar&lt;/span&gt;&lt;span style="color:#808080;"&gt;,&lt;/span&gt; &lt;span style="color:#ff00ff;"&gt;error_number&lt;/span&gt;&lt;span style="color:#808080;"&gt;())&lt;/span&gt; &lt;span style="color:#808080;"&gt;+&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;N&amp;#39;)&amp;#39;&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        &lt;span style="color:#0000ff;"&gt;raiserror&lt;/span&gt;&lt;span style="color:#808080;"&gt;(&lt;/span&gt;@errormsg&lt;span style="color:#808080;"&gt;,&lt;/span&gt; 16&lt;span style="color:#808080;"&gt;,&lt;/span&gt; 1&lt;span style="color:#808080;"&gt;)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff;"&gt;end&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;catch&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#0000ff;"&gt;go&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;revert&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#0000ff;"&gt;select&lt;/span&gt; &lt;span style="color:#ff00ff;"&gt;suser_name&lt;/span&gt;&lt;span style="color:#808080;"&gt;()&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#008000;"&gt;--revoke granted right&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#0000ff;"&gt;revoke&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;execute&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;on&lt;/span&gt; dbo&lt;span style="color:#808080;"&gt;.&lt;/span&gt;pTestInsert &lt;span style="color:#0000ff;"&gt;to&lt;/span&gt; [RemoteUser]&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;go&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;In line 3 in the above snippet you see the command to grant execute right on the stored procedure to the RemoteUser. Please note that the user still has no other rights – he can’t insert rows to the tTest table directly, he even can’t select from the table. Since the above snippet is part of the bigger script, at the end of it, in line 22 you can see command 'REVOKE’ to – revoke the right granted in the line 3. So, how the above code works? Yes, it works OK. It doesn’t throw exception because the permissions are right.&lt;/p&gt;  &lt;p&gt;As I mentioned before, there were procedures which the remote login mysteriously lost ability to call. In my case, the issue was caused by a release script, which did not re-establish appropriate rights to them. There are two ways you can modify a procedure during release. One is obviously ALTER PROCEDURE, which does not change the security configuration of the procedure, the other is a sequence of DROP and CREATE statements. Scenarios 3 and 4 are shown in the below scripts.&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:761217c3-1ddb-47dd-b8c8-dcaa989e15d5" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:'Courier New', Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#ddd;max-height:400px;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2.5em;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#008000;"&gt;---Scenario 3: user has explicit right to execute the procedure but the stored procedure is ALTERED&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#008000;"&gt;--- in subsequent release&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;go&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#008000;"&gt;---this is executed at sa/dbo level&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;grant&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;execute&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;on&lt;/span&gt; dbo&lt;span style="color:#808080;"&gt;.&lt;/span&gt;pTestInsert &lt;span style="color:#0000ff;"&gt;to&lt;/span&gt; [RemoteUser]&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#0000ff;"&gt;go&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;go&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#008000;"&gt;---now ALTER the procedure&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;alter&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;procedure&lt;/span&gt; dbo&lt;span style="color:#808080;"&gt;.&lt;/span&gt;pTestInsert&lt;span style="color:#0000ff;"&gt; &lt;/span&gt;&lt;span style="color:#808080;"&gt;(&lt;/span&gt;@a &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt;&lt;span style="color:#808080;"&gt;,&lt;/span&gt; @b &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt;&lt;span style="color:#808080;"&gt;)&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#0000ff;"&gt;as&lt;/span&gt; &lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;begin&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="color:#0000ff;"&gt;insert&lt;/span&gt; dbo&lt;span style="color:#808080;"&gt;.&lt;/span&gt;tTest&lt;span style="color:#808080;"&gt;(&lt;/span&gt;a&lt;span style="color:#808080;"&gt;,&lt;/span&gt; b&lt;span style="color:#808080;"&gt;)&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;values &lt;/span&gt;&lt;span style="color:#808080;"&gt;(&lt;/span&gt;@a&lt;span style="color:#808080;"&gt;,&lt;/span&gt; @a &lt;span style="color:#808080;"&gt;*&lt;/span&gt; @b&lt;span style="color:#808080;"&gt;)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;end&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#0000ff;"&gt;go&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;execute&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;as&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;login&lt;/span&gt;&lt;span style="color:#808080;"&gt;=&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;&amp;#39;RemoteLogin&amp;#39;&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#0000ff;"&gt;select&lt;/span&gt; &lt;span style="color:#ff00ff;"&gt;suser_name&lt;/span&gt;&lt;span style="color:#808080;"&gt;()&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;go&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="color:#0000ff;"&gt;begin&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;try&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#008000;"&gt;---should succeed&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        &lt;span style="color:#0000ff;"&gt;exec&lt;/span&gt; dbo&lt;span style="color:#808080;"&gt;.&lt;/span&gt;pTestInsert&lt;span style="color:#0000ff;"&gt; &lt;/span&gt;1&lt;span style="color:#808080;"&gt;,&lt;/span&gt; 1&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt;&lt;span style="color:#808080;"&gt;;&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="color:#0000ff;"&gt;end&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;try&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff;"&gt;begin&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;catch&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        &lt;span style="color:#0000ff;"&gt;declare&lt;/span&gt; @errormsg &lt;span style="color:#0000ff;"&gt;nvarchar&lt;/span&gt;&lt;span style="color:#808080;"&gt;(&lt;/span&gt;2000&lt;span style="color:#808080;"&gt;)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff;"&gt;set&lt;/span&gt; @errormsg &lt;span style="color:#808080;"&gt;=&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;N&amp;#39;Scenario 3: Exception occured in &amp;#39;&lt;/span&gt; &lt;span style="color:#808080;"&gt;+&lt;/span&gt; &lt;span style="color:#ff00ff;"&gt;error_procedure&lt;/span&gt;&lt;span style="color:#808080;"&gt;()&lt;/span&gt; &lt;span style="color:#808080;"&gt;+&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;N&amp;#39;: &amp;#39;&lt;/span&gt; &lt;span style="color:#808080;"&gt;+&lt;/span&gt; &lt;span style="color:#ff00ff;"&gt;error_message&lt;/span&gt;&lt;span style="color:#808080;"&gt;()&lt;/span&gt; &lt;span style="color:#808080;"&gt;+&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;N&amp;#39; (&amp;#39;&lt;/span&gt; &lt;span style="color:#808080;"&gt;+&lt;/span&gt; &lt;span style="color:#ff00ff;"&gt;convert&lt;/span&gt;&lt;span style="color:#808080;"&gt;(&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;nvarchar&lt;/span&gt;&lt;span style="color:#808080;"&gt;,&lt;/span&gt; &lt;span style="color:#ff00ff;"&gt;error_number&lt;/span&gt;&lt;span style="color:#808080;"&gt;())&lt;/span&gt; &lt;span style="color:#808080;"&gt;+&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;N&amp;#39;)&amp;#39;&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        &lt;span style="color:#0000ff;"&gt;raiserror&lt;/span&gt;&lt;span style="color:#808080;"&gt;(&lt;/span&gt;@errormsg&lt;span style="color:#808080;"&gt;,&lt;/span&gt; 16&lt;span style="color:#808080;"&gt;,&lt;/span&gt; 1&lt;span style="color:#808080;"&gt;)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff;"&gt;end&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;catch&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#0000ff;"&gt;go&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;revert&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#0000ff;"&gt;select&lt;/span&gt; &lt;span style="color:#ff00ff;"&gt;suser_name&lt;/span&gt;&lt;span style="color:#808080;"&gt;()&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#0000ff;"&gt;go&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#008000;"&gt;--revoke granted right&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#0000ff;"&gt;revoke&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;execute&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;on&lt;/span&gt; dbo&lt;span style="color:#808080;"&gt;.&lt;/span&gt;pTestInsert &lt;span style="color:#0000ff;"&gt;to&lt;/span&gt; [RemoteUser]&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;go&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:182d9d6c-288a-4eef-a3b1-4a346bde04f3" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:'Courier New', Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#ddd;max-height:500px;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2.5em;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#008000;"&gt;---Scenario 4: user has explicit right to execute the procedure but the stored procedure is &lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#008000;"&gt;---DROPPED an CREATED in subsequent release&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;go&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#008000;"&gt;---this is executed at sa/dbo level&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;grant&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;execute&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;on&lt;/span&gt; dbo&lt;span style="color:#808080;"&gt;.&lt;/span&gt;pTestInsert &lt;span style="color:#0000ff;"&gt;to&lt;/span&gt; [RemoteUser]&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#0000ff;"&gt;go&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;go&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#008000;"&gt;---now DROP and CREATE the procedure&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;drop&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;procedure&lt;/span&gt; dbo&lt;span style="color:#808080;"&gt;.&lt;/span&gt;pTestInsert &lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#0000ff;"&gt;go&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;create&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;procedure&lt;/span&gt; dbo&lt;span style="color:#808080;"&gt;.&lt;/span&gt;pTestInsert&lt;span style="color:#0000ff;"&gt; &lt;/span&gt;&lt;span style="color:#808080;"&gt;(&lt;/span&gt;@a &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt;&lt;span style="color:#808080;"&gt;,&lt;/span&gt; @b &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt;&lt;span style="color:#808080;"&gt;)&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#0000ff;"&gt;as&lt;/span&gt; &lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;begin&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="color:#0000ff;"&gt;insert&lt;/span&gt; dbo&lt;span style="color:#808080;"&gt;.&lt;/span&gt;tTest&lt;span style="color:#808080;"&gt;(&lt;/span&gt;a&lt;span style="color:#808080;"&gt;,&lt;/span&gt; b&lt;span style="color:#808080;"&gt;)&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;values &lt;/span&gt;&lt;span style="color:#808080;"&gt;(&lt;/span&gt;@a&lt;span style="color:#808080;"&gt;,&lt;/span&gt; @a &lt;span style="color:#808080;"&gt;*&lt;/span&gt; @b&lt;span style="color:#808080;"&gt;)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;end&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#0000ff;"&gt;go&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;execute&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;as&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;login&lt;/span&gt;&lt;span style="color:#808080;"&gt;=&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;&amp;#39;RemoteLogin&amp;#39;&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#0000ff;"&gt;select&lt;/span&gt; &lt;span style="color:#ff00ff;"&gt;suser_name&lt;/span&gt;&lt;span style="color:#808080;"&gt;()&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;go&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="color:#0000ff;"&gt;begin&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;try&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#008000;"&gt;---should fail&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        &lt;span style="color:#0000ff;"&gt;exec&lt;/span&gt; dbo&lt;span style="color:#808080;"&gt;.&lt;/span&gt;pTestInsert&lt;span style="color:#0000ff;"&gt; &lt;/span&gt;1&lt;span style="color:#808080;"&gt;,&lt;/span&gt; 1&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt;&lt;span style="color:#808080;"&gt;;&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="color:#0000ff;"&gt;end&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;try&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff;"&gt;begin&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;catch&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        &lt;span style="color:#0000ff;"&gt;declare&lt;/span&gt; @errormsg &lt;span style="color:#0000ff;"&gt;nvarchar&lt;/span&gt;&lt;span style="color:#808080;"&gt;(&lt;/span&gt;2000&lt;span style="color:#808080;"&gt;)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff;"&gt;set&lt;/span&gt; @errormsg &lt;span style="color:#808080;"&gt;=&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;N&amp;#39;Scenario 4: Exception occured in &amp;#39;&lt;/span&gt; &lt;span style="color:#808080;"&gt;+&lt;/span&gt; &lt;span style="color:#ff00ff;"&gt;error_procedure&lt;/span&gt;&lt;span style="color:#808080;"&gt;()&lt;/span&gt; &lt;span style="color:#808080;"&gt;+&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;N&amp;#39;: &amp;#39;&lt;/span&gt; &lt;span style="color:#808080;"&gt;+&lt;/span&gt; &lt;span style="color:#ff00ff;"&gt;error_message&lt;/span&gt;&lt;span style="color:#808080;"&gt;()&lt;/span&gt; &lt;span style="color:#808080;"&gt;+&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;N&amp;#39; (&amp;#39;&lt;/span&gt; &lt;span style="color:#808080;"&gt;+&lt;/span&gt; &lt;span style="color:#ff00ff;"&gt;convert&lt;/span&gt;&lt;span style="color:#808080;"&gt;(&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;nvarchar&lt;/span&gt;&lt;span style="color:#808080;"&gt;,&lt;/span&gt; &lt;span style="color:#ff00ff;"&gt;error_number&lt;/span&gt;&lt;span style="color:#808080;"&gt;())&lt;/span&gt; &lt;span style="color:#808080;"&gt;+&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;N&amp;#39;)&amp;#39;&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        &lt;span style="color:#0000ff;"&gt;raiserror&lt;/span&gt;&lt;span style="color:#808080;"&gt;(&lt;/span&gt;@errormsg&lt;span style="color:#808080;"&gt;,&lt;/span&gt; 16&lt;span style="color:#808080;"&gt;,&lt;/span&gt; 1&lt;span style="color:#808080;"&gt;)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff;"&gt;end&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;catch&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#0000ff;"&gt;go&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;revert&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#0000ff;"&gt;select&lt;/span&gt; &lt;span style="color:#ff00ff;"&gt;suser_name&lt;/span&gt;&lt;span style="color:#808080;"&gt;()&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;Scenario 4 throws an exception as expected:&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:9d1b244c-fc66-46d3-8ddb-664d68c2a5bd" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:'Courier New', Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background-color:#ffffff;max-height:400px;overflow:auto;padding:2px 5px;"&gt;Msg 50000, Level 16, State 1, Line 9&lt;br&gt; Scenario 4: Exception occured in pTestInsert: The EXECUTE permission was denied on the object &amp;#39;pTestInsert&amp;#39;, database &amp;#39;testExecRights&amp;#39;, schema &amp;#39;dbo&amp;#39;. (229)&lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;Obviously there is an issue here. The release process must take care of the proper assignment of the rights. The problem is if the script consists of smaller parts prepared by developers, it may be virtually impossible to verify if the rights are scripted correctly in the release script. One can script all explicit permissions to objects before the release and then reconcile them with the permissions existing after the release. This also can be tricky, as sometimes the rights &lt;em&gt;have&lt;/em&gt; to change, sometimes new objects don’t have properly scripted permissions etc. What if you have may users that need to perform certain operations on tables and views? In general, it looks like the idea of assigning rights one by one for all users and objects is bad in most scenarios. Imagine the amount of failure points if you have 3000+ objects in database and you change, say, a few hundred of them within the release. What can you do about it?&lt;/p&gt;  &lt;p&gt;First thing that you should do is to break explicit relationship of users and objects. You can do this by creating a database role which will serve as single point of security assignments. By having several roles in the database, you can tune the security fairly easily without having to rescript permissions for all users each time you need to make a change. Scenario 5 shows such database role example:&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:1da0b810-1d0a-4db9-bb82-6d1758fb4031" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:'Courier New', Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#ddd;max-height:400px;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2.5em;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#008000;"&gt;---Scenario 5: belongs to DATABASE ROLE with explicit right to execute the procedure &lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#008000;"&gt;---and the stored procedure is DROPPED an CREATED in subsequent release&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;go&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#008000;"&gt;---this is executed at sa/dbo level&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;create&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;role&lt;/span&gt; [pTestExecRightRole]&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#0000ff;"&gt;go&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;grant&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;execute&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;on&lt;/span&gt; dbo&lt;span style="color:#808080;"&gt;.&lt;/span&gt;pTestInsert &lt;span style="color:#0000ff;"&gt;to&lt;/span&gt; [pTestExecRightRole]&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#0000ff;"&gt;go&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;exec&lt;/span&gt; &lt;span style="color:#800000;"&gt;sp_addrolemember&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;&amp;#39;pTestExecRightRole&amp;#39;&lt;/span&gt;&lt;span style="color:#808080;"&gt;,&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;&amp;#39;RemoteUser&amp;#39;&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#0000ff;"&gt;go&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#008000;"&gt;---now DROP and CREATE the procedure&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#0000ff;"&gt;drop&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;procedure&lt;/span&gt; dbo&lt;span style="color:#808080;"&gt;.&lt;/span&gt;pTestInsert &lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;go&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#0000ff;"&gt;create&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;procedure&lt;/span&gt; dbo&lt;span style="color:#808080;"&gt;.&lt;/span&gt;pTestInsert&lt;span style="color:#0000ff;"&gt; &lt;/span&gt;&lt;span style="color:#808080;"&gt;(&lt;/span&gt;@a &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt;&lt;span style="color:#808080;"&gt;,&lt;/span&gt; @b &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt;&lt;span style="color:#808080;"&gt;)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;as&lt;/span&gt; &lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#0000ff;"&gt;begin&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff;"&gt;insert&lt;/span&gt; dbo&lt;span style="color:#808080;"&gt;.&lt;/span&gt;tTest&lt;span style="color:#808080;"&gt;(&lt;/span&gt;a&lt;span style="color:#808080;"&gt;,&lt;/span&gt; b&lt;span style="color:#808080;"&gt;)&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;values &lt;/span&gt;&lt;span style="color:#808080;"&gt;(&lt;/span&gt;@a&lt;span style="color:#808080;"&gt;,&lt;/span&gt; @a &lt;span style="color:#808080;"&gt;*&lt;/span&gt; @b&lt;span style="color:#808080;"&gt;)&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#0000ff;"&gt;end&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;go&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#0000ff;"&gt;execute&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;as&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;login&lt;/span&gt;&lt;span style="color:#808080;"&gt;=&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;&amp;#39;RemoteLogin&amp;#39;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;select&lt;/span&gt; &lt;span style="color:#ff00ff;"&gt;suser_name&lt;/span&gt;&lt;span style="color:#808080;"&gt;()&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#0000ff;"&gt;go&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff;"&gt;begin&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;try&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        &lt;span style="color:#008000;"&gt;---should succeed&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff;"&gt;exec&lt;/span&gt; dbo&lt;span style="color:#808080;"&gt;.&lt;/span&gt;pTestInsert&lt;span style="color:#0000ff;"&gt; &lt;/span&gt;1&lt;span style="color:#808080;"&gt;,&lt;/span&gt; 1&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt;&lt;span style="color:#808080;"&gt;;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff;"&gt;end&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;try&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="color:#0000ff;"&gt;begin&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;catch&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff;"&gt;declare&lt;/span&gt; @errormsg &lt;span style="color:#0000ff;"&gt;nvarchar&lt;/span&gt;&lt;span style="color:#808080;"&gt;(&lt;/span&gt;2000&lt;span style="color:#808080;"&gt;)&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        &lt;span style="color:#0000ff;"&gt;set&lt;/span&gt; @errormsg &lt;span style="color:#808080;"&gt;=&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;N&amp;#39;Scenario 5: Exception occured in &amp;#39;&lt;/span&gt; &lt;span style="color:#808080;"&gt;+&lt;/span&gt; &lt;span style="color:#ff00ff;"&gt;error_procedure&lt;/span&gt;&lt;span style="color:#808080;"&gt;()&lt;/span&gt; &lt;span style="color:#808080;"&gt;+&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;N&amp;#39;: &amp;#39;&lt;/span&gt; &lt;span style="color:#808080;"&gt;+&lt;/span&gt; &lt;span style="color:#ff00ff;"&gt;error_message&lt;/span&gt;&lt;span style="color:#808080;"&gt;()&lt;/span&gt; &lt;span style="color:#808080;"&gt;+&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;N&amp;#39; (&amp;#39;&lt;/span&gt; &lt;span style="color:#808080;"&gt;+&lt;/span&gt; &lt;span style="color:#ff00ff;"&gt;convert&lt;/span&gt;&lt;span style="color:#808080;"&gt;(&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;nvarchar&lt;/span&gt;&lt;span style="color:#808080;"&gt;,&lt;/span&gt; &lt;span style="color:#ff00ff;"&gt;error_number&lt;/span&gt;&lt;span style="color:#808080;"&gt;())&lt;/span&gt; &lt;span style="color:#808080;"&gt;+&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;N&amp;#39;)&amp;#39;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff;"&gt;raiserror&lt;/span&gt;&lt;span style="color:#808080;"&gt;(&lt;/span&gt;@errormsg&lt;span style="color:#808080;"&gt;,&lt;/span&gt; 16&lt;span style="color:#808080;"&gt;,&lt;/span&gt; 1&lt;span style="color:#808080;"&gt;)&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="color:#0000ff;"&gt;end&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;catch&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;go&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#0000ff;"&gt;revert&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;select&lt;/span&gt; &lt;span style="color:#ff00ff;"&gt;suser_name&lt;/span&gt;&lt;span style="color:#808080;"&gt;()&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#0000ff;"&gt;go&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;exec&lt;/span&gt; &lt;span style="color:#800000;"&gt;sp_droprolemember&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;&amp;#39;pTestExecRightRole&amp;#39;&lt;/span&gt;&lt;span style="color:#808080;"&gt;,&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;&amp;#39;RemoteUser&amp;#39;&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#0000ff;"&gt;go&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;drop&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;role&lt;/span&gt; [pTestExecRightRole]&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#0000ff;"&gt;go&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;The issue with the above is that still, when an object is dropped and recreated, the rights assigned to it are lost. The script above throws the same exception again:&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:9b8f05fe-87c0-4311-8305-41f94dfa9312" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:'Courier New', Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background-color:#ffffff;max-height:400px;overflow:auto;padding:2px 5px;"&gt;Msg 50000, Level 16, State 1, Line 9&lt;br&gt; Scenario 5: Exception occured in pTestInsert: The EXECUTE permission was denied on the object &amp;#39;pTestInsert&amp;#39;, database &amp;#39;testExecRights&amp;#39;, schema &amp;#39;dbo&amp;#39;. (229)&lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;To solve this you have to group objects in a similar way you do it with users. While database role is used as a container for usSers, &lt;strong&gt;schema&lt;/strong&gt;&amp;#160; serves the same purpose for database objects. Scenario 6 shows this approach.&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:86620007-3dec-40fe-b5e3-bb33e2a7b97d" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:'Courier New', Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#ddd;max-height:400px;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2.5em;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#008000;"&gt;---Scenario 6: user belongs to DATABASE ROLE with explicit right to execute on the SCHEMA&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#008000;"&gt;---and the stored procedure is DROPPED an CREATED in subsequent release&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;go&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#008000;"&gt;---this is executed at sa/dbo level&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;create&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;role&lt;/span&gt; [pTestExecRightRole]&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#0000ff;"&gt;go&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;create&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;schema&lt;/span&gt; RemoteExec &lt;span style="color:#0000ff;"&gt;authorization&lt;/span&gt; dbo&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#0000ff;"&gt;go&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;grant&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;execute&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;on&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;schema&lt;/span&gt;&lt;span style="color:#808080;"&gt;::&lt;/span&gt;RemoteExec &lt;span style="color:#0000ff;"&gt;to&lt;/span&gt; [pTestExecRightRole]&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#0000ff;"&gt;go&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;exec&lt;/span&gt; &lt;span style="color:#800000;"&gt;sp_addrolemember&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;&amp;#39;pTestExecRightRole&amp;#39;&lt;/span&gt;&lt;span style="color:#808080;"&gt;,&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;&amp;#39;RemoteUser&amp;#39;&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#0000ff;"&gt;go&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#008000;"&gt;---now DROP and CREATE the procedure&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#0000ff;"&gt;drop&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;procedure&lt;/span&gt; dbo&lt;span style="color:#808080;"&gt;.&lt;/span&gt;pTestInsert &lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;go&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#0000ff;"&gt;create&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;procedure&lt;/span&gt; RemoteExec&lt;span style="color:#808080;"&gt;.&lt;/span&gt;pTestInsert&lt;span style="color:#0000ff;"&gt; &lt;/span&gt;&lt;span style="color:#808080;"&gt;(&lt;/span&gt;@a &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt;&lt;span style="color:#808080;"&gt;,&lt;/span&gt; @b &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt;&lt;span style="color:#808080;"&gt;)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;as&lt;/span&gt; &lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#0000ff;"&gt;begin&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff;"&gt;insert&lt;/span&gt; dbo&lt;span style="color:#808080;"&gt;.&lt;/span&gt;tTest&lt;span style="color:#808080;"&gt;(&lt;/span&gt;a&lt;span style="color:#808080;"&gt;,&lt;/span&gt; b&lt;span style="color:#808080;"&gt;)&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;values &lt;/span&gt;&lt;span style="color:#808080;"&gt;(&lt;/span&gt;@a&lt;span style="color:#808080;"&gt;,&lt;/span&gt; @a &lt;span style="color:#808080;"&gt;*&lt;/span&gt; @b&lt;span style="color:#808080;"&gt;)&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#0000ff;"&gt;end&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;go&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#0000ff;"&gt;execute&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;as&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;login&lt;/span&gt;&lt;span style="color:#808080;"&gt;=&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;&amp;#39;RemoteLogin&amp;#39;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;select&lt;/span&gt; &lt;span style="color:#ff00ff;"&gt;suser_name&lt;/span&gt;&lt;span style="color:#808080;"&gt;()&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#0000ff;"&gt;go&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff;"&gt;begin&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;try&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        &lt;span style="color:#008000;"&gt;---should succeed&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff;"&gt;exec&lt;/span&gt; RemoteExec&lt;span style="color:#808080;"&gt;.&lt;/span&gt;pTestInsert&lt;span style="color:#0000ff;"&gt; &lt;/span&gt;1&lt;span style="color:#808080;"&gt;,&lt;/span&gt; 1&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt;&lt;span style="color:#808080;"&gt;;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff;"&gt;end&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;try&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="color:#0000ff;"&gt;begin&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;catch&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff;"&gt;declare&lt;/span&gt; @errormsg &lt;span style="color:#0000ff;"&gt;nvarchar&lt;/span&gt;&lt;span style="color:#808080;"&gt;(&lt;/span&gt;2000&lt;span style="color:#808080;"&gt;)&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        &lt;span style="color:#0000ff;"&gt;set&lt;/span&gt; @errormsg &lt;span style="color:#808080;"&gt;=&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;N&amp;#39;Scenario 6: Exception occured in &amp;#39;&lt;/span&gt; &lt;span style="color:#808080;"&gt;+&lt;/span&gt; &lt;span style="color:#ff00ff;"&gt;error_procedure&lt;/span&gt;&lt;span style="color:#808080;"&gt;()&lt;/span&gt; &lt;span style="color:#808080;"&gt;+&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;N&amp;#39;: &amp;#39;&lt;/span&gt; &lt;span style="color:#808080;"&gt;+&lt;/span&gt; &lt;span style="color:#ff00ff;"&gt;error_message&lt;/span&gt;&lt;span style="color:#808080;"&gt;()&lt;/span&gt; &lt;span style="color:#808080;"&gt;+&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;N&amp;#39; (&amp;#39;&lt;/span&gt; &lt;span style="color:#808080;"&gt;+&lt;/span&gt; &lt;span style="color:#ff00ff;"&gt;convert&lt;/span&gt;&lt;span style="color:#808080;"&gt;(&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;nvarchar&lt;/span&gt;&lt;span style="color:#808080;"&gt;,&lt;/span&gt; &lt;span style="color:#ff00ff;"&gt;error_number&lt;/span&gt;&lt;span style="color:#808080;"&gt;())&lt;/span&gt; &lt;span style="color:#808080;"&gt;+&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;N&amp;#39;)&amp;#39;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff;"&gt;raiserror&lt;/span&gt;&lt;span style="color:#808080;"&gt;(&lt;/span&gt;@errormsg&lt;span style="color:#808080;"&gt;,&lt;/span&gt; 16&lt;span style="color:#808080;"&gt;,&lt;/span&gt; 1&lt;span style="color:#808080;"&gt;)&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="color:#0000ff;"&gt;end&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;catch&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;go&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#0000ff;"&gt;revert&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;select&lt;/span&gt; &lt;span style="color:#ff00ff;"&gt;suser_name&lt;/span&gt;&lt;span style="color:#808080;"&gt;()&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;go&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;As you see, I created schema RemoteExec in line 7. I granted explicit right to execute on &lt;strong&gt;all&lt;/strong&gt; objects belonging to the schema to the database role pTestExecRightRole. Subsequently I simulate release process by dropping existing procedure dbo.pTestInsert and creating it in the schema RemoteExec. As you see, I don’t apply any explicit rights to the stored procedure. The fact that it belongs to the RemoteExec schema is sufficient for it to be callable by the user belonging to pTestExecRightRole. You can easily add and remove procedures from the RemoteExec schema and they will automatically inherit any rights you have chosen to assign to them, without any manual coding. More importantly, the rights are not tied to the objects, so you will not loose required functionality after making changes to the objects.&lt;/p&gt;  &lt;p&gt;As I said before, this approach has its consequences. You may need to modify some of the code that calls the stored procedures to explicitly reference schema, in some cases you need to modify the code of the stored procedures. If you work with older code the most likely schema it references is an &lt;strong&gt;implicit&lt;/strong&gt; dbo – object names are used without any schema part. This may be OK and resolve at runtime, but in some cases it won’t especially if you move the procedure to a different schema. It is a good practice to explicitly reference schemas in your code to avoid any confusion and problems.&lt;/p&gt;  &lt;p&gt;You can download the test script with all scenarios and cleanup code from &lt;a href="http://6mxuuq.bay.livefilestore.com/y1pKQ8Haga-1tL-GUvgv9zWz-XeQsEKCT39JH_qqy_A48Mjc9gKQj4zyoBR0gBxvqBMWHxSgJoiZu-9Oe9NC6ZDk4SecA_-34Wa/TestingExecRights.sql?download&amp;amp;psid=1"&gt;this location&lt;/a&gt;. Enjoy.&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:f0a749f7-dd54-4f76-9db0-8f1bf2b14254" class="wlWriterEditableSmartContent"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/SQL+Server+2008" rel="tag"&gt;SQL Server 2008&lt;/a&gt;,&lt;a href="http://technorati.com/tags/T-SQL" rel="tag"&gt;T-SQL&lt;/a&gt;,&lt;a href="http://technorati.com/tags/programming" rel="tag"&gt;programming&lt;/a&gt;,&lt;a href="http://technorati.com/tags/database+design" rel="tag"&gt;database design&lt;/a&gt;&lt;/div&gt;</description></item></channel></rss>