0

我有一个用户视图,我们称之为[MIKE].Table过滤选择 SELECT * FROM TABLE WHERE TL_FILTERKEY in (1,2,3)

所以,如果 Mike 连接到服务器并执行

"SELECT * FROM TABLE"

他只会看到表格中的部分数据。

还有一个具有 dbo 权限的程序,并允许 Mike 执行为

CREATE PROCEDURE tbSelect
as
SELECT * FROM TABLE

如果 Mike 执行exec tbSelect,他将看到 Table 中的所有行,但未过滤。

如何编写程序以便从用户视图(过滤行)中选择数据?

我尝试重新创建过程'WITH EXECUTE AS'Mike''和'WITH EXECUTE AS CALLER',但是所有行都返回了。

4

1 回答 1

2

您的问题有点令人困惑,您没有提及您的 SQL Server 版本,但我怀疑您的问题是由于schemas造成的。当您引用没有架构的对象时,SQL Server 首先在用户的默认架构中查找对象,然后在 dbo 架构中查找。

作为一个完整的猜测,我认为您有一个名为 Mike 的用户,其默认架构也是Mike,一个名为 的视图Mike.Table和一个名为 的表dbo.Table。当 Mike 运行时,他的查询Table被解析为,Mike.Table但是当 db_owner 查询时Table,它被解析为dbo.Table.

为避免混淆,您可能应该使用更清晰的对象名称(至少用于测试)并始终使用所有者限定对象名称:

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
于 2011-04-29T11:14:28.550 回答