我可以在存储过程中设置默认架构吗?

Joe*_*orn 6 sql-server schema stored-procedures sql-server-2005

我正在进行StackQL的下一次更新.

我想做的一件事是能够查询多个版本.因此,当我加载十月数据时,我没有删除旧的九月数据库.它还在那里.实际上,您甚至可以通过包含数据库名称来查询它:

select top 10 * from SO_Sept09..Posts
Run Code Online (Sandbox Code Playgroud)

当他们开始为ServerFault和SuperUser提供数据时,这将更加重要.

但我不喜欢有一大堆数据库来支持这一点.我宁愿将所有数据放在同一个数据库中,并将每个不同的集合分成它自己的模式.但为了实现这一点,我需要能够根据传递给存储过程的参数设置默认模式作为运行查询的存储过程的一部分,该参数告诉用户从未来的下拉列表中选择哪个数据库出现在工具栏中.

StackQL的查询最终只是传递给exec()函数,如下所示:

exec(@QueryText)
Run Code Online (Sandbox Code Playgroud)

我可以在存储过程中做任何事情,或者在QueryText字符串(ala USE [DatabaseName])前面设置查询中使用的默认模式吗?

RBa*_*ung 15

这里有各种各样的方法可以做到这一点,但并非完全如此.这样做的方法是:

  1. 为每个架构创建唯一的登录和用户

  2. 使这些用户成为每个不同架构的所有者.

  3. 将每个此类用户的默认架构设置为它们拥有的架构.

  4. 使用该语法EXECUTE ('sql commands') AS USER = 'schema-owner'在该默认架构的上下文中执行SQL命令.

以下脚本演示了这一点:

--====== Create the Login for the User:
CREATE LOGIN [UserTest1] WITH PASSWORD='whatever', DEFAULT_DATABASE=[TestUsers], DEFAULT_LANGUAGE=[us_english]
GO

--====== Make a User for the Login:
CREATE USER [UserTest1] FOR LOGIN [UserTest1]
GO

--====== Make a Schema owned by the User and default to it:
--        (I assume that you already have the schemas)
CREATE SCHEMA [UserTest1] AUTHORIZATION [UserTest1]
GO
ALTER USER [UserTest1] WITH DEFAULT_SCHEMA=[UserTest1]
GO

--====== Make a sProc in dbo
CREATE PROCEDURE [dbo].[TestSchema_Exec] AS
    SELECT 'executing in schema [dbo]'
GO
--====== Make a similar sProc in New Schema
CREATE PROCEDURE [UserTest1].[TestSchema_Exec] AS
    SELECT 'executing in schema [UserTest1]'
GO

--========= Demonstrate that we can switch Default Schemas:
EXEC('TestSchema_Exec')

EXEC('TestSchema_Exec') AS USER = 'UserTest1'
Run Code Online (Sandbox Code Playgroud)