本地调试一切ok,上传至虚拟主机后,报错Microsoft OLE DB Provider for SQL Server 错误 '80040e09' 
拒绝了对对象 'sp_Util_Page' (数据库 'abcd',架构 'dbo')的 EXECUTE 权限。 
尝试过按照网上的办法,安全设置里面找到dbo架构,添加public,权限授予添加 修改 删除 选择 更新的权限,但是又提示:无法对架构'dbo'执行查找,因为它不存在,或者您没有所需的权限我又切换到登录用户的选项,授予登录用户和dbo  db_reader ,db_writer,db_owner,都提示错误,不是找不到就是没权限这是神马个情况……必须找管理员用sa来授权吗?

解决方案 »

  1.   

    我是虚拟主机,没办法用windows身份的,这也就是说只能联系管理员了吗?
      

  2.   


    先授权
    grant exec on abcd.dbo.存储过程 to 登录名(用户名)
    然后再执行 
      

  3.   

    -- =============================================
    -- Author: 赵文忠
    -- Create date: 20120510
    -- Description: 给用户授予存储过程对应的权限(查看定义、执行、修改)
    CREATE procedure grant_purview_procedure_for_user
    @db_name sysname,--DB名
    @sys_user sysname,---登录名
    @view_definition bit=1,---查看定义
    @execute bit=1,---执行
    @alter bit=0--修改
    as
    begin
    set nocount on
    declare @sql_definition varchar(2000)
    declare @sql_execute varchar(2000)
    declare @sql_alter varchar(2000)
    declare @use_db varchar(1200)

    set @use_db='USE  '+@db_name+CHAR(13)+CHAR(10)+'  '

    declare @i int,@count int
    declare @str_sys nvarchar(1200)
    declare @STR nvarchar(1200)
    SET @STR=N'select @count1 =COUNT (1) from  '+@db_name+'.sys.sysobjects where type=''P'''
    exec sp_executesql @STR,N'@count1 int output',@count1=@count output
    set @i=1
    declare @name sysname
    while @i<=@count
    begin
    set @sql_definition='GRANT VIEW DEFINITION ON '+@db_name+'.dbo.'
    set @sql_execute='GRANT EXECUTE ON '+@db_name+'.dbo.'
    set @sql_alter='GRANT ALTER ON '+@db_name+'.dbo.'

    set @str_sys=N'select @name1 =name from (select row_number() over(order by name)rn,name from  '+@db_name+'.sys.sysobjects where type=''P'')tmp where rn=@ii '
    exec sp_executesql @str_sys,N'@name1 nvarchar(256) output,@ii int',@ii=@i,@name1=@name output if @view_definition=1 and @execute=1 and @alter=1
    begin
    SET @sql_definition=@use_db+@sql_definition+@name+' TO '+@sys_user---查看
    SET @sql_execute=@use_db+@sql_execute+@name+' TO '+@sys_user ---执行
    SET @sql_alter=@use_db+@sql_alter+@name+' TO '+@sys_user---修改

    EXEC (@sql_definition)
    EXEC (@sql_execute)
    EXEC (@sql_alter)
    end
    if @view_definition=1 and @execute=0 and @alter=0
    begin
    SET @sql_definition=@use_db+@sql_definition+@name+' TO '+@sys_user---查看

    EXEC (@sql_definition)
    end
    if @view_definition=0 and @execute=1 and @alter=0
    begin
    SET @sql_execute=@use_db+@sql_execute+@name+' TO '+@sys_user ---执行 EXEC (@sql_execute)
    end
    if @view_definition=0 and @execute=0 and @alter=1
    begin
    SET @sql_alter=@use_db+@sql_alter+@name+' TO '+@sys_user---修改 EXEC (@sql_alter)
    end
    if @view_definition=1 and @execute=1 and @alter=0
    begin
    SET @sql_definition=@use_db+@sql_definition+@name+' TO '+@sys_user---查看
    SET @sql_execute=@use_db+@sql_execute+@name+' TO '+@sys_user ---执行

    EXEC (@sql_definition)
    EXEC (@sql_execute) end
    if @view_definition=1 and @execute=0 and @alter=1
    begin
    SET @sql_definition=@use_db+@sql_definition+@name+' TO '+@sys_user---查看
    SET @sql_alter=@use_db+@sql_alter+@name+' TO '+@sys_user---修改

    EXEC (@sql_definition)
    EXEC (@sql_alter)
    end if @view_definition=0 and @execute=1 and @alter=1
    begin
    SET @sql_execute=@use_db+@sql_execute+@name+' TO '+@sys_user ---执行
    SET @sql_alter=@use_db+@sql_alter+@name+' TO '+@sys_user---修改 EXEC (@sql_execute)
    EXEC (@sql_alter)
    end
    set @i+=1
    end
    set nocount off
    end先创建该存储过程,然后获取该存储过程的执行权限。然后运行该存储过程。
    就可以获取对应库下所有存储过程的  执行、修改、查看 权限了。dbo db_reader ,db_writer  只是针对表的。不适用于存储过程。
    db_owner 就类似SA了。具有所有权。谨慎使用
      

  4.   

    ls大哥,这个代码执行出错。。消息 102,级别 15,状态 1,过程 grant_purview_procedure_for_user,第 87 行
    '+' 附近有语法错误。
      

  5.   

    先授权
    grant exec on abcd.dbo.存储过程 to 登录名(用户名)
    然后再执行 zhge keyi ,xiexie!!