我在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的副本。
答案 0 :(得分:1)
使用模块所有者的默认架构解析非限定对象名称。此行为无法更改,因此您需要使用您提到的其他方法。
由于您已经为具有相同结构的每个用户创建了单独的表和视图,为什么不同时在用户的模式中创建存储过程?