已知数据库用户dbo和browser,dbo创建了存储过程p1,p2并授予browser执行p1,p2的权限,且browser没有select数据库角色权限。
p1的代码是select * from 表1,p2代码是动态sql语句'select * from 表1',browser可以执行p1,但不能执行p2。
请问问什么,如何解决? 

解决方案 »

  1.   

    补充一下:
            browser执行p2时,报错提示没有select权限。
      

  2.   

    联机丛书是这样说的:EXECUTE权限运行 EXECUTE 语句无需权限。 但是,需要对 EXECUTE 字符串内引用的安全对象具有权限。 例如,如果字符串包含 INSERT 语句,则 EXECUTE 语句的调用方对目标表必须具有 INSERT 权限。 在遇到 EXECUTE 语句时,即使 EXECUTE 语句包含于模块内,也将检查权限。
      

  3.   

    --贴点资料,不知道能不能帮你
    可以通过sp_changedbowner 系统存储过程来更改数据库所有者。
    例:sp_changedbowner    'sa'     把当前数据库的所有权更改为sa
    SQL Server的用户及权限 
    Sybase中的用户分为两种:SQL服务器用户(登录帐号)和数据库用户。 安装完SQL服务器后,系统自动建立一个SQL服务器用户sa,口令为空,即系统管理员,他对整个系统有操作权,其他用户均由系统管理员建立。 
    在SQL Server中有三种特殊的用户:系统管理员、用户数据库所有者(建立相应数据库的数据库用户)DBO、一般用户。系统管理员对整个系统有操作权;用户数据库所有者对他所建立的数据库具有全部操作权利;一般用户对给定的数据库只有被授权的操作权限。 
    数据库用户一般可分为用户组,任一数据库在建立后即被赋予一个用户组public。 
    1、建立SQL服务器用户名(登录帐号) 
    作为一个用户,为了使用SQL Server,他必须在SQL Server上有一个SQL服务器用户名(登录帐号)。这个帐号是系统管理员通过sp_addlogin来增加的。 
    sp_addlogin 登录名,口令,库名,语言,全名 
    例:建立用户zhang, 口令为zhangling(最低六位),全名为Zhang ling 
    1> sp_addlogin zhang,zhangling,null,null,Zhang ling 
    2> go 
    3> select * from syslogins 
    4> go 
    2、增加数据库用户名 
    同样,为了使用SQL Server上的数据库,他必须在数据库中有一个用户名,这个用户名是数据库所有者通过sp_adduser来增加的。数据库用户名不必和用户帐户一样,而且在不同的数据库中用户名可以不同。多个用户可以有相同的SQL Server帐户。同样,多个SQL Server帐户可以有相同的数据库名。 
    sp_adduser 登录名,别名,组名 
    登录名为用户的SQL服务器登录名;别名为用户在数据库中的用户名;组名为用户所属的数据库用户组。 
    例:用户zhang增加为tele114的用户,别名为zhang1,属于用户组china 
    1>sp_addgroup china 
    2>go 
    1>sp_adduser zhang,zhang1,china 
    2>go 
    1> sp_helpuser 
    2> go 
    *例:删除别名zhang1,用户组china,登录名zhang 
    1> use tele114 
    2> go 
    3> sp_dropuser zhang1 
    4> go 
    5> sp_helpuser 
    6> go 
    1>sp_dropgroup china 
    2>go 
    1> sp_helpgroup 
    2> go 
    3> use master 
    4> go 
    5> sp_droplogin zhang 
    6> go 
    7> select * from syslogins 
    8> go 
    3、数据库操作授权 
    grant 命令序列 to 用户名 
    A. 系统管理员可以授予其他用户CREATE DATABASE的权限,使其他用户可以成为数据库所有者。 
    B. 数据库所有者在他所拥有的数据库中,可以授予其他用户的权限有: 
    l CREATE TABLE ------------------- 建表 
    lCREATE DEFAULT ------------------ 建缺省 
    lCREATE RULE ------------------- 建规则 
    lCREATE PROCedure ------------------ 建存储过程 
    lCREATE VIEW ------------------- 建视图 
    lDUMP DATABASE ------------------- 备份数据库 
    lDUMP TRANsaction ------------------ 备份日志 
    C. 数据库对象所有者可以授予其他用户的操作权限有: 
    l SELECT 
    l UPDATE 
    l INSERT 
    l EXECute 
    l DELETE 
    l REFERENCE 
    例:授予zhang1在数据库tele114上建表,建视图,建存储过程;对表students有select,reference权;对name,native字段有update权。 
    1> use tele114 
    2> go 
    3> grant creat table,create procedure ,create view to zhang1 
    4> go 
    5> grant select,reference on students to zhang1 with grant option 6> go 
    7> grant update on students(name,native) to zhang1 
    8> go 
    9> sp_helprotect 
    10> go  
    下面这些命令可以在命令行下用isql执行,isql -E -Q "命令",isql.exe为安装了mssql服务器自带的一个小程序
    XP_CMDSHELL "dir"   --执行DOS命令dir
    解释:执行DOS命令,就是在XP_CMDSHELL "输入DOS命令";
    EXEC sp_addlogin golder, golder   --添加SQL用户
    解释:EXEC sp_addlogin 用户名,密码;
    exec sp_droplogin 'golder'   --删除SQL用户golder
    解释:exec sp_droplogin '删除的用户名';
    exec sp_addsrvrolemember 'golder', sysadmin    --添加用户到SQL管理员
    解释:exec sp_addsrvrolemember '添加的用户名', sysadmin
    sysadmin为管理员权限;
    exec sp_dropsrvrolemember 'golder', sysadmin   --删除SQL管理员权限
    解释:exec sp_dropsrvrolemember '删除管理员权限的用户名', sysadmin
    EXEC sp_password NULL, 'golder','golder'   --更改SQL登陆密码
    解释:EXEC sp_password '原来的密码(如果密码为空,就写NULL)', '更改后的密码','更改密码的用户名';
    if exists (select * from 
    dbo.sysobjects where id = object_id(N'[dbo].[xp_cmdshell]') and 
    OBJECTPROPERTY(id, N'IsExtendedProc') = 1)
    exec sp_dropextendedproc N'[dbo].[xp_cmdshell]'
    GO     --去除SQL上的XP_CMDSHELL权限 
      

  4.   

    如小梁所说,这是所有权链的问题导致,同样摘自联机丛书:
    在下图中,July2003 视图由 Mary 所拥有。她已经授予 Alex 对该视图的权限。
    他对此实例中的数据库对象不具有任何其他权限。当 Alex 选择该视图时,会出现什么情况?
    Alex 对 July2003 视图执行 SELECT *。SQL Server 检查对该视图的权限并确认 Alex 具有对该视图执行选择的权限。
    July2003 视图需要 SalesXZ 视图中的信息。SQL Server 检查 SalesXZ 视图的所有权。因为此视图与调用它的视图具有相同的所有者 (Mary),
    所以将不检查对 SalesXZ 的权限。返回必需的信息。所以,你应该明白你的P1为什么会指定成功的原因了。P2为什么不成功,小梁也正好告诉你了。
      

  5.   

    我的目的是限制用户直接使用select语句而必须通过我封装的存储过程查看数据。而存储过程中又要用到动态sql。
      

  6.   

    存储过程中的语句不满足下列条件的就需要用户具有相应权限:
    1 存储过程和基对象处于同一架构 
    2 操作是静态的 
    3 操作语句是DML或存储过程 可以使用execute as
    execute as 1 caller(默认值) 2 self 使用创建或修改该存储过程的用户权限 3 owner 4 ‘user_name'
      

  7.   

    我查在线msdn了,ycpang422所说的execute as在SQL Server 2000中不能使用,我用的就是2000。
      

  8.   

    execute as在sql2005下使用。sql2000下可以用 setuser来模拟
      

  9.   

    setuser不能解决我的问题。昨天装上2005了,按照ycpang422所说的解决了。谢谢大家。