【问题标题】:Call view from Stored Procedure从存储过程调用视图
【发布时间】:2011-04-29 06:22:32
【问题描述】:

我有一个用户 VIEW,我们称它为 [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',但是返回了所有行。

【问题讨论】:

    标签: sql sql-server view procedure


    【解决方案1】:

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

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

    为避免混淆,您可能应该使用更清晰的对象名称(至少用于测试)和所有者的always qualify object names:

    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
    

    【讨论】:

    • 是的,我们可以在过程中以 [schemas].ViewName 的形式从视图中获取数据。这个想法是在没有模式的情况下选择数据来获得技巧。可能通过系统表来实现。通过创建映射表解决的问题:[user] -> [view]。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-16
    • 1970-01-01
    • 2012-05-24
    • 1970-01-01
    • 1970-01-01
    • 2011-05-05
    相关资源
    最近更新 更多