我正在进行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'