首页 新闻 搜索 专区 学院

请问sql server里的视图和存储过程,如何根据不同用户,访问不同schema的表

0
悬赏园豆:40 [已解决问题] 解决于 2021-09-30 11:47

假设数据库Test
存在三个schema(System,S1, S2); 其中s1和S2这两个Schema各有一个对应业务表(S1.Order, S2.Order)
同时,数据库里面建了用户: UserS1, 设置了Schema owned(System, s1), 同时指定了默认schema为S1
接着创建一个登陆账号:LoginS1, 关联至UserS1

当我用LoginS1登陆(即UserS1),这时在查询分询器执行:
select * from Order --这里能正常查询S1.Order

但当我创建视图
Create view System.VOrder_Get
as
select * from Order --当编译时,提示无效对象名 'Order'

同样的,存储过程
Create proc System.POrder_Get
as
begin
select * from Order --能编译通过
end

但当我执行 exec System.POrder_Get, 则也是提示无效对象名 'Order'

我希望当我用UserS1访问视图和存储过程时,实际也是访问的S1.Order

即我的需求是:业务表,如Order,有不同的Schema,但是视图,存储过程,我是希望只维护一套(不用建立不同schema:s1, s2)。

请问该如何实现,谢谢!

siso的主页 siso | 初学一级 | 园豆:166
提问于:2021-09-29 17:11
< >
分享
最佳答案
0

收获园豆:40
Giant150 | 小虾三级 |园豆:1154 | 2021-09-29 17:23

有指定了默认架构了,且直接查询表是没问题的,但是在视图和存储过程中则不行。

我想主要原因在于,我视图和存储过程是希望只有一套,所以这两者建立时指定了一个公用的schema(System)

siso | 园豆:166 (初学一级) | 2021-09-29 17:25

@siso: select * from Giant..Sys_Action
有时候可以这样来做,不指定schema
[Database]..[Table]中间用两个点.
这样就是用默认的schema

Giant150 | 园豆:1154 (小虾三级) | 2021-09-30 08:39

@Giant Liu:
现在主要问题是,当我用System查询视图时
select * from System.VOrder_Get ,sql引擎估计就认为该视图里面的表也是以System开头的(因此导致找不到),但实际上,我希望里面的表,是根据我的登陆账号设置的default schema来的。

siso | 园豆:166 (初学一级) | 2021-09-30 08:53

@siso: 是的啊.所以你可以试一下
select * from Database..VOrder_Get
要知道变通啊

Giant150 | 园豆:1154 (小虾三级) | 2021-09-30 11:43

@Giant Liu:
Create view System.VOrder_Get
as
select * from Order --当编译时,提示无效对象名 'Order'

现就编译不过了

siso | 园豆:166 (初学一级) | 2021-09-30 11:45

@Giant Liu
这个问题估计是无法解决的了,因视图和存储过程是编译时要确认对象的,但我里同的表,实际上需要运行时才能确定。

siso | 园豆:166 (初学一级) | 2021-09-30 11:48
其他回答(2)
0

用了这么多年sql, 一直不敢用除dbo之外的名称...... 宁愿多建一个数据库, 也不想多搞一套架构

Shannon | 园豆:611 (小虾三级) | 2021-10-25 14:27
0
彼岸的天堂 | 园豆:202 (菜鸟二级) | 2022-08-29 17:06
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册