如果可以在[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 回答
如果您使用方法
SCHEMA_NAME()
返回调用方的默认架构(http://msdn.microsoft.com/en-gb/library/ms175068.aspx),这应该是可能的 .所以对于你的例子:
Update:
奇怪的是,当我刚刚进行快速测试时,调用
EXEC('SELECT * FROM USER')
它使用了用户默认架构 . 也许您可以尝试将存储过程的内容包装在单个EXEC('')
中例如: