从存储过程调用视图

时间:2011-04-29 06:22:33

标签: sql sql-server view procedure

我有一个用户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',但是返回所有行。

1 个答案:

答案 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