【问题标题】:SQL Server (2005) target tables in different schemas from store procedureSQL Server (2005) 目标表与存储过程不同的架构
【发布时间】:2014-08-17 05:50:59
【问题描述】:

请任何人建议是否可以在 [dbo] 架构中使用一个存储过程从一个 架构 中的一个 中选择数据,供用户通过一个 架构 访问数据库角色,并让它从另一个架构中的同名中选择数据,供用户通过另一个数据库角色访问强>?

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

  • dbo
  • 绿色
  • 红色

我有两个数据库登录名 [RedLogin] 和 [GreenLogin]。 它们使用各自的数据库用户 [RedUser] 和 [GreenUser] 连接到我的数据库。这些用户是各自数据库角色 [RedRole] 和 [GreenRole] 的成员。

  • [RedUser] 的默认架构为 [red]。
  • [GreenUser] 的默认架构为 [green]。
  • [RedRole] 对 [dbo] 具有执行权限并在 [red] 架构上选择权限。
  • [GreenRole] 对 [dbo] 具有执行权限并在 [green] 架构上选择权限。
  • 在 [green] 架构中,我有一个名为 [User] 的表。
  • 在 [red] 架构中,我有一个名为 [User] 的表。
  • 在 [dbo] 架构中,我有一个名为 [User_GetAll] 的存储过程运行

    从用户中选择 *;

我想要的是:

  • 对于使用 [Redlogin] 登录并调用 [User_GetAll] 的用户,从 [red] 获取所有用户。[用户]表。
  • 对于使用 [Greenlogin] 登录并调用 [User_GetAll] 的用户,从 [green] 获取所有用户。[用户]表。

这甚至可能吗?如果是这样,那么实现它的最佳方法是什么?谢谢。

请注意:上面的场景只是为了了解我想要实现的目标。在实际项目中,需要将解决方案应用于许多表和存储过程。

【问题讨论】:

    标签: sql-server stored-procedures schema role-based


    【解决方案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
    

    更新:

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

    例如:

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

    【讨论】:

    • 这将是一个有效的解决方案,但不是首选,因为如果可能的话,我真的不想转换他适用于执行 SQL 字符串的所有存储过程。显然,如果我别无选择,那么这将是一个很好的解决方案。谢谢。
    • 虽然在我的测试中仍然很不愉快,但您可以使用单个 exec 语句来逃避。
    • 看起来不错,但我真的想避免更改我所有的 SPROCS 来执行 SQL,因为有很多事情要做,有些很长!但会保留这个!
    • 基于这个connect.microsoft.com/SQLServer/feedback/details/272964/…我觉得你运气不好。
    • 我认为你是对的。看起来我需要将相同的存储过程复制到每个模式。一个很好的反代码重用模式!当您习惯于使用 .net 等现代语言进行编程时,数据库编程确实是二等公民。 SQL Server 还没有进入 21 世纪有点可惜。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-18
    • 1970-01-01
    相关资源
    最近更新 更多