Database Administrators Stack Exchange is a question and answer site for database professionals who wish to improve their database skills and learn from others in the community. Join them; it only takes a minute:

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

I have granted a user execute permission for a stored procedure through SSMS, but when he tries to execute it, he gets the error:

The SELECT permission was denied on the object '[table name]', database '[database name]', schema 'dbo'.

Does the user need to be granted permission for any tables that the stored procedure uses? That wouldn't really make any sense to me...

share|improve this question
Are you using the correct schema prefix (a) on the stored procedure, (b) in the select, and (c) when calling the stored procedure? Is it possible that someone has explicitly revoked/denied select permission on the table? Have you tried with EXECUTE AS OWNER? – Aaron Bertrand Sep 19 '12 at 18:23
Also, what version of SQL Server are we talking about here? 2000? 2012? Something in between? – Aaron Bertrand Sep 19 '12 at 18:31
@AaronBertrand 2008 (not R2). It's actually a view. The schema prefix is set everywhere I know how. I don't see Execute as Owner in the permissions settings – xdumaine Sep 19 '12 at 18:55
Are you using dynamic SQL within the stored procedure? – Mr.Brownstone Sep 19 '12 at 19:11
@Mr.Brownstone I work with OP--that is the issue (confirmed). – Michael Haren Sep 20 '12 at 20:11
up vote 1 down vote accepted

Ok, on the basis of the above comment and as per my suspicion - it seems as though you are trying to execute dynamic SQL within your stored procedure. What you need to remember is that when you do this it does not get executed within the context of the stored procedure - it gets executed within a new session. Because of this, the fact that the statement is being called within a stored procedure is a mute point and you will need to grant explicit permission on the objects that your dynamic SQL is using. If you don't want to do this I would refactor your stored procedure to not use dynamic SQL.

The below link from Microsoft should help you with your problem:

I hope this helps you.

share|improve this answer

It sounds like there are different owners of the procedure as well as the underlying object that the SELECT is querying. This all has to do with Ownership Chains. See the below example for a brief explanation and demonstration to what I'm talking about:

use YourTestDatabase;

create login TestLogin1
    password = 'password',
    check_policy = off;

create user TestUser1
for login TestLogin1;

create table Table1
    id int identity(1, 1) not null,
    SomeString varchar(30) not null
        default replicate('a', 30)

insert into Table1
go 10

create proc Proc1
    select *
    from Table1;

grant execute
on Proc1
to TestUser1;

-- this works because permissions aren't checked
--  on Table1.  That is why TestUser1 can get the
--  result set without SELECT permissions on Table1
execute as user = 'TestUser1';

exec Proc1;


-- let's change the owner of Proc1 so that the 
--  ownership chain is broken and permissions are
--  checked on Table1
alter authorization
on Proc1
to TestUser1;

-- this no longer works because permissions are now
--  checked on Table1, which TestUser1 does not have
--  SELECT permissions on
execute as user = 'TestUser1';

exec Proc1;


If you want to find out the ownership of your objects, you can run the below query (obviously with changing the WHERE clause to include your specific object names):

        when o.principal_id is null
    end as principal_name
from sys.objects o
inner join sys.schemas s
on o.schema_id = s.schema_id
left join sys.database_principals dp
on o.principal_id = dp.principal_id
left join sys.database_principals sp
on s.principal_id = sp.principal_id
where in
share|improve this answer

Your Answer


By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.