我正在开发 StackQL 的下一个更新。
我想做的一件事是能够查询多个版本。因此,例如,当我加载 10 月数据时,我没有删除旧的 9 月数据库。它仍然在那里。事实上,您甚至仍然可以通过包含数据库名称来查询它,如下所示:
select top 10 * from SO_Sept09..Posts
随着他们开始为 ServerFault 和 SuperUser 提供数据,这一点将变得更加重要。
但我不喜欢有一大堆数据库来支持这一点。我宁愿将所有数据放在同一个数据库中,并将每个不同的数据集分成它自己的模式。但为了实现这一点,我需要能够根据传递给存储过程的参数设置默认架构作为运行查询的存储过程的一部分,该参数告诉它用户从 future 的下拉列表中选择了哪个数据库出现在工具栏中。
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'
关于sql-server - 我可以在存储过程中设置默认架构吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1569690/