我有一个用户VIEW,我们称之为[MIKE].Table
进行过滤选择
SELECT * FROM TABLE WHERE TL_FILTERKEY in (1,2,3)
因此,如果Mike连接到服务器并执行
"SELECT * FROM TABLE"
他只会看到表中的部分数据。
还有一个程序,dbo权限和权限给迈克执行
CREATE PROCEDURE tbSelect
as
SELECT * FROM TABLE
如果Mike执行exec tbSelect
,他将看到表中的所有行,但不会过滤。
如何编写程序以便从用户视图中选择数据(已过滤的行)?
我尝试重新创建过程'WITH EXECUTE AS'Mike''和'WITH EXECUTE AS CALLER',但是返回所有行。
答案 0 :(得分:2)
您的问题有点令人困惑,您没有提到您的SQL Server版本,但我怀疑您的问题是由schemas引起的。当您引用没有架构的对象时,SQL Server首先在用户的默认架构中查找对象,然后在dbo架构中查找。
作为一个完整的猜测,我认为您有一个名为Mike的用户,其默认架构也是Mike
,一个名为Mike.Table
的视图和一个名为dbo.Table
的表。当Mike运行他的查询时Table
被解析为Mike.Table
,但当db_owner查询Table
时,它被解析为dbo.Table
。
为避免混淆,您应该使用更清晰的对象名称(至少用于测试)和always qualify object name与所有者:
create table dbo.TestTable (col1 int)
go
insert into dbo.TestTable
select 1
union all
select 2
union all
select 3
go
-- this will return all rows
select col1 from dbo.TestTable
go
create view dbo.TestView
as
select col1
from dbo.TestTable
where col1 >= 2
go
-- this will return 2 rows
select col1 from dbo.TestView
go
create procedure dbo.TestProc
as
select col1 from dbo.TestView
go
-- this will also return 2 rows
exec dbo.TestProc
go
drop proc dbo.TestProc
go
drop View dbo.TestView
go
drop table dbo.TestTable
go