Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 从存储过程以不同模式的目标表,但不更改代码_Sql_Sql Server_Tsql_Database Schema - Fatal编程技术网

Sql 从存储过程以不同模式的目标表,但不更改代码

Sql 从存储过程以不同模式的目标表,但不更改代码,sql,sql-server,tsql,database-schema,Sql,Sql Server,Tsql,Database Schema,请告知[dbo]模式中的存储过程是否可以从一个模式中的一个表中选择数据,供用户通过一个数据库角色访问,以及是否可以从另一个模式中的类似命名表中选择数据,供用户通过另一个数据库角色访问 例如,如果我的数据库中有三个架构: dbo 绿色 红色 我有两个数据库登录名[RedLogin]和[GreenLogin]。它们使用各自的数据库用户[RedUser]和[GreenUser]连接到我的数据库。这些用户是各自数据库角色[RedRole]和[GreenRole]的成员 [RedUser]的默认架构为[r

请告知[dbo]模式中的存储过程是否可以从一个模式中的一个表中选择数据,供用户通过一个数据库角色访问,以及是否可以从另一个模式中的类似命名表中选择数据,供用户通过另一个数据库角色访问

例如,如果我的数据库中有三个架构:

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

[RedUser]的默认架构为[red]。 [GreenUser]的默认架构为[green]。 [RedRole]对[dbo]具有执行权限,并在[dbo]上选择权限 [red]模式。 [GreenRole]对[dbo]具有执行权限,并在[dbo]上选择权限 [green]模式。 在[green]模式中,我有一个名为[User]的表。 在[red]模式中,我有一个名为[User]的表。 在[dbo]模式中,我有一个名为[User\u GetAll]的存储过程 就这样。 从用户中选择*

我想要的是:

对于使用[Redlogin]登录并调用 [User\u GetAll]从[red].[User]表获取所有用户。 对于使用[Greenlogin]登录并调用 [User_GetAll]从[green].[User]表获取所有用户。 所以我有一个问题。例如:

-[dbo]模式在过去,我有100个存储过程。现在,我不想更改存储过程中的代码,因为它太多了,所以如何解决这个问题呢?请帮帮我

更新:

举个简单的例子:

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

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

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

以下是我解决这个问题的想法:

在[dbo]模式中创建另一个存储过程,并使用它读取所有其他过程,以使它们在用户登录时根据模式执行。我可以这样做吗?那么,我该怎么做呢? 创建一个存储过程,将所有[dbo]过程的架构更改为[ABC]。我可以这样做吗?
感谢您的帮助。

您最好使用动态SQL。这允许您将字符串变量传递到脚本中,然后对SQL引擎执行脚本。例如,如果您有变量@dynamicsql和@usertype,您将构建一个动态SQL字符串,如下所示:

@dynamicsql = 'SELECT * FROM '+@usertype+'.tblAccountNet'
然后在存储过程中使用EXEC@dynamicsql. 这可能会起作用,但它需要用户具有额外的权限,而且还会让您面临一系列安全问题,其中最大的问题是SQL注入攻击。因此,这可能会起作用,但它可能比它的价值更麻烦


您的基本选择是使用动态SQL或为不同的表使用一组if语句。我不完全理解,您能告诉我解决方案的详细信息吗?非常感谢你。
@dynamicsql = 'SELECT * FROM '+@usertype+'.tblAccountNet'