Stored procedures SQL Server能否根据用户或用户';谁的角色?

Stored procedures SQL Server能否根据用户或用户';谁的角色?,stored-procedures,sql-server-2008-r2,database-schema,Stored Procedures,Sql Server 2008 R2,Database Schema,Sql Server 2008 R2 我在两个模式中有一个名为相同的视图。根据用户或用户的角色,当应用程序调用引用视图的存储过程时,是否可以自动让它使用其中一个 e、 g.这两个视图分别命名为dbo.Customers和production.Customers。每个视图都生成相同的选择列表,但具有到不同表的联接,并且具有不同的WHERE条件。存储过程当前引用dbo.Customers (注意:实际上有几十个这两个模式视图,它们用于数百个存储过程、函数和动态生成的sql。重写所有这些都需要几年时间

Sql Server 2008 R2

我在两个模式中有一个名为相同的视图。根据用户或用户的角色,当应用程序调用引用视图的存储过程时,是否可以自动让它使用其中一个

e、 g.这两个视图分别命名为dbo.Customers和production.Customers。每个视图都生成相同的选择列表,但具有到不同表的联接,并且具有不同的WHERE条件。存储过程当前引用dbo.Customers


(注意:实际上有几十个这两个模式视图,它们用于数百个存储过程、函数和动态生成的sql。重写所有这些都需要几年时间)

存储过程(模块)中的对象名不是(模块)执行用户。因此,如果在声明为以下内容的存储过程中引用名为table_1的表:

CREATE PROCEDURE dbo.usp_GetTable_1 AS SELECT * FROM [TABLE_1]
然后,解析的表名将是[dbo].[table_1]

如果您愿意使用动态SQL,则可以执行以下操作:

--Stored procedure uses dynamic SQL so object name resolution rules inside
--modules does not apply
CREATE PROCEDURE dbo.usp_GetTable_1 AS 
  EXEC sp_executesql N'SELECT * FROM [TABLE_1]'
GO

--create Table_1 in two schemas
CREATE TABLE [Com1].[Table_1](
    [Id] [int] NOT NULL,
    [Schema] As OBJECT_SCHEMA_NAME ( OBJECT_ID('[Com1].[Table_1]' ))
) ON [PRIMARY]

GO
CREATE TABLE [Com2].[Table_1](
    [Id] [int] NOT NULL,
    [Schema] As OBJECT_SCHEMA_NAME ( OBJECT_ID('[Com2].[Table_1]' ))
) ON [PRIMARY]
GO

--Now create two users, defaulting each to one of the schemas
CREATE USER Com1User WITHOUT LOGIN WITH default_schema = [Com1]
CREATE USER Com2User WITHOUT LOGIN WITH default_schema = [Com2]

--set the ownership of the schemas to match
ALTER AUTHORIZATION ON SCHEMA::[Com1] TO [Com1User]
ALTER AUTHORIZATION ON SCHEMA::[Com2] TO [Com2User]

--Adding the users to the db_owner role naively allows executing dbo schema modules
--for demo purposes. Alternatively grant execution to specific dbo modules 
EXEC sp_addrolemember N'db_owner', N'Com1User'
EXEC sp_addrolemember N'db_owner', N'Com2User'

--Set the execution context and call the procedure
EXECUTE AS User = 'Com1User'
EXEC dbo.usp_GetTable_1
REVERT;

--Set the execution context and call the procedure
EXECUTE AS User = 'Com2User'
EXEC dbo.usp_GetTable_1
REVERT;
就我个人而言,我不太喜欢这种模式的使用。模式是为了安全,在较小程度上是为了避免大量数据库对象的名称冲突。我个人更喜欢将每组对象放在不同的数据库上,并使用不同的用户登录名和默认数据库来控制名称解析