首页 文章

SQL Server(2005)以存储过程的不同模式为目标表

提问于
浏览
1

如果可以在[dbo]模式中为一个 schema 中的一个 table 中的存储过程选择数据,以便用户通过一个 database role 进行访问,并且可以选择来自另一个 table 中的同名数据 table ,那么任何人都可以建议用户通过另一个 database role 访问?

例如,如果我的数据库中有三个模式:

  • dbo

  • green

  • red

我有两个数据库登录[ RedLogin ]和[ GreenLogin ] . 这些使用相应的数据库用户[ RedUser ]和[ GreenUser ]连接到我的数据库 . 这些用户是相应数据库角色[ RedRole ]和[ GreenRole ]的成员 .

  • [ RedUser ]的默认架构为[ red ] .

  • [ GreenUser ]的默认架构为[ green ] .

  • [ RedRole ]对[ dbo ]具有执行权限,并对[ red ]架构具有选择权限 .

  • [ GreenRole ]对[ dbo ]具有执行权限,并对[ green ]架构具有选择权限 .

  • 在[ green ]架构中,我有一个名为[ User ]的表 .

  • 在[ red ]模式中,我有一个名为[ User ]的表 .

  • 在[ dbo ]模式中,我有一个名为[ User_GetAll ]的存储过程,它运行

SELECT * FROM USER;

我想要的是:

  • 对于使用[ Redlogin ]登录并呼叫[ User_GetAll ]的用户,请从[ red ] . [ User ]表中获取所有用户 .

  • 对于使用[ Greenlogin ]登录并呼叫[ User_GetAll ]的用户,请从[ green ] . [ User ]表中获取所有用户 .

这甚至可能吗?如果是这样,最好的方法是什么,拜托?谢谢 .

Please note: 上面的场景只是为了了解我想要实现的目标 . 在实际项目中,有许多表和存储过程需要应用解决方案 .

1 回答

  • 1

    如果您使用方法 SCHEMA_NAME() 返回调用方的默认架构(http://msdn.microsoft.com/en-gb/library/ms175068.aspx),这应该是可能的 .

    所以对于你的例子:

    DECLARE @Sql NVARCHAR(MAX)
    SET @Sql = 'SELECT * FROM ' + SCHEMA_NAME() + '.USER'
    EXEC sp_executesql @Sql
    

    Update:

    奇怪的是,当我刚刚进行快速测试时,调用 EXEC('SELECT * FROM USER') 它使用了用户默认架构 . 也许您可以尝试将存储过程的内容包装在单个 EXEC('')

    例如:

    EXEC('
        SELECT * FROM USER
        SELECT * FROM USER
        SELECT * FROM USER
        SELECT * FROM USER
    ')
    

相关问题