首页 文章

从存储过程中定位不同模式中的表,但不更改代码

提问于
浏览
2

任何人都可以建议是否可以在 [dbo] 模式中使用存储过程从一个模式中的一个表中选择数据,以便用户通过一个数据库角色进行访问,并从另一个模式中的同名表中为用户选择数据通过其他数据库角色访问?

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

  • dbo

  • green

  • red

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

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

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

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

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

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

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

  • [dbo] 架构中,我有一个名为 [User_GetAll] 的存储过程 .

SELECT * FROM USER;

我想要的是:

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

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

所以我有一个问题 . 例如:

  • [dbo] 架构过去,我有100个存储过程 . 现在,我没有这么多,所以我该怎么做才能解决这个问题呢?请帮我 .

.................................................. ..................................

Update:

举个简单的例子:

我有一个架构 [dbo] ,在该架构中,我创建了一个存储过程 dbo.GetAccount

CREATE PROCEDURE dbo.GetAccount
AS
BEGIN
SELECT * FROM tblAccountNet
END

然后,我创建了一个名为 UserABC 的用户模式 [ABC] .

现在,我想使用 UserABC 登录并执行 dbo.GetAccount for schema [ABC] 以获取它的所有用户,并且不想更改 dbo.GetAccount 的代码 . 那么,我该怎么办?

这些是我解决它的想法:

  • 在[dbo]模式中创建另一个存储过程,并使用它来读取所有其他过程,以便在登录时使用用户对模式执行 . 我能这样做吗?那么,我该怎么做呢?

  • 创建存储过程以将所有[dbo]过程的模式更改为[ABC] . 我能这样做吗?

谢谢你的帮助 .

1 回答

  • 0

    这里最好的选择是使用动态SQL . 这是允许您将字符串变量传递到脚本然后针对SQL引擎执行的内容 . 例如,如果您有变量 @dynamicsql@usertype ,那么您将构建一个动态SQL字符串,如:

    @dynamicsql = 'SELECT * FROM '+@usertype+'.tblAccountNet'
    

    然后,您将使用 EXEC(@dynamicsql) 在存储过程中执行此代码 . 这可能会起作用,但它需要为用户提供额外的权限,并且还会让您面临整个安全问题,最大的问题是SQL注入攻击 . 所以这可能会奏效,但它可能比它的 Value 更麻烦 .

    http://xkcd.com/327/

相关问题