【问题标题】:How does SQL Server lookup object names in stored procedures?SQL Server 如何在存储过程中查找对象名称?
【发布时间】:2014-09-01 22:32:29
【问题描述】:

我在 SQL Server 2008 中有一个存储过程,例如:

CREATE PROCEDURE [dbo].[test]
AS
BEGIN
    SET NOCOUNT ON;
    SELECT user_name(); 
    SELECT SCHEMA_NAME()
    SELECT * FROM MyView
END

我有一个名为 testuser.MyView 的视图。然后我使用以下方式调用 SP:

exec as user = 'testuser' exec test 

这表明 user_name 和 SCHEMA_NAME 都设置为 testuser 但是我也收到了Invalid object name 'MyView'. 消息,因为 SP 仍在 dbo 模式中查找视图名称。

是否可以更改 SP 的执行方式,以便 MyView 对象引用 testuser.MyView 而不必使用完全限定名称?

我正在尝试在不同模式中的相同表结构上使用一组许多存储过程。我真的想避免使用动态 SQL 重写所有 SP,或者使用限定名称创建所有 SP 的副本。

【问题讨论】:

    标签: sql-server stored-procedures database-schema


    【解决方案1】:

    使用模块所有者的默认架构解析不合格的对象名称。此行为无法更改,因此您需要使用您提到的其他方法。

    既然您已经为每个具有相同结构的用户创建了单独的表和视图,为什么不在用户的架构中同时创建存储过程呢?

    【讨论】:

    • 谢谢丹。我担心可能是这种情况。 SP 非常复杂,而且数量很多,所以我想避免 100 个重复的 SP。我想用任何更新的脚本擦除和重建它们是唯一的解决方案。
    猜你喜欢
    • 2012-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-04
    • 1970-01-01
    • 2011-12-19
    • 1970-01-01
    相关资源
    最近更新 更多