假设数据库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)。
请问该如何实现,谢谢!
有指定了默认架构了,且直接查询表是没问题的,但是在视图和存储过程中则不行。
我想主要原因在于,我视图和存储过程是希望只有一套,所以这两者建立时指定了一个公用的schema(System)
@siso: select * from Giant..Sys_Action
有时候可以这样来做,不指定schema
[Database]..[Table]中间用两个点.
这样就是用默认的schema
@Giant Liu:
现在主要问题是,当我用System查询视图时
select * from System.VOrder_Get ,sql引擎估计就认为该视图里面的表也是以System开头的(因此导致找不到),但实际上,我希望里面的表,是根据我的登陆账号设置的default schema来的。
@siso: 是的啊.所以你可以试一下
select * from Database..VOrder_Get
要知道变通啊
@Giant Liu:
Create view System.VOrder_Get
as
select * from Order --当编译时,提示无效对象名 'Order'
现就编译不过了
@Giant Liu
这个问题估计是无法解决的了,因视图和存储过程是编译时要确认对象的,但我里同的表,实际上需要运行时才能确定。
用了这么多年sql, 一直不敢用除dbo之外的名称...... 宁愿多建一个数据库, 也不想多搞一套架构