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

前端之家收集整理的这篇文章主要介绍了sql-server – 我可以在存储过程中设置默认架构吗?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在进行StackQL的下一次更新.

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

select top 10 * from SO_Sept09..Posts

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

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

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

exec(@QueryText)

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

解决方法

这里有各种各样的方法,但不完全是这样.这样做的方法是:

>创建一个独特的登录&每个架构的用户
>使这些用户成为每个不同架构的所有者.
>将每个此类用户的默认架构设置为他们拥有的架构.
>使用语法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'

猜你在找的MsSQL相关文章