设置 sql 查询的默认架构

问题描述 投票:0回答:8

有没有一种方法可以设置查询的架构,以便在查询的其余部分中我可以仅通过名称引用表,而无需在它们前面添加架构名称?

例如,我想做这样的事情:

Use [schemaName]
select * from [tableName]

与此相反:

select * from [schemaName].[tableName]
sql sql-server schema
8个回答
37
投票

快速谷歌将我指向此页面。它解释了从 SQL Server 2005 开始,您可以使用

ALTER USER
语句设置用户的默认架构。不幸的是,这意味着您将永久更改它,因此如果您需要在模式之间切换,则需要在每次执行存储过程或一批语句时设置它。或者,您可以使用此处描述的技术。

如果您使用的是 SQL Server 2000 或更早版本 此页面 说明用户和架构是等效的。如果您没有在表名前添加 schema\user,SQL Server 将首先查看当前用户拥有的表,然后查看

dbo
拥有的表来解析表名。似乎对于所有其他表,您必须在前面添加 schema\user。


23
投票

我不相信有“每个查询”的方法可以做到这一点。 (您可以使用

use
关键字来指定 database - 而不是模式 - 但从技术上讲,这是一个单独的查询,因为您必须随后发出
go
命令。)

请记住,在 SQL Server 中,完全限定表名称的格式为:

[数据库].[架构].[表]

在 SQL Server Management Studio 中,您可以配置您所询问的所有默认值。

  • 您可以为每个用户(或在连接字符串中)设置默认值

    database

    安全 > 登录 >(右键单击)用户 > 属性 > 常规

  • 您可以为每个用户设置默认的

    schema
    (但我不相信您可以在连接字符串中配置它,尽管如果您使用
    dbo
    ,则始终是默认值):

    安全 > 登录 >(右键单击)用户 > 属性 > 用户映射 > 默认架构

简而言之,如果您使用

dbo
作为您的模式,您可能会遇到最少的头痛。


11
投票

非常老的问题,但由于谷歌引导我来到这里,我将添加一个我发现有用的解决方案:

步骤 1. 为您需要能够使用的每个架构创建一个用户。例如。 “user_myschema”

步骤2.使用EXECUTE AS以所需的模式用户身份执行SQL语句。

步骤 3. 使用 REVERT 切换回原始用户。

示例: 假设您的模式“otherschema”中有一个表“mytable”,这不是您的默认模式。运行“SELECT * FROM mytable”将不起作用。

创建一个名为“user_otherschema”的用户,并将该用户的默认架构设置为“otherschema”。

现在您可以运行此脚本来与表交互:

EXECUTE AS USER = 'user_otherschema';
SELECT * FROM mytable
REVERT

恢复语句会重置当前用户,让你再次成为你自己。

EXECUTE AS 文档的链接:https://learn.microsoft.com/en-us/sql/t-sql/statements/execute-as-transact-sql?view=sql-server-2017


2
投票

当我需要大量表名时,我有时会从

INFORMATION_SCHEMA
系统表中获取它们及其架构: 价值


select  TABLE_SCHEMA + '.' + TABLE_NAME from INFORMATION_SCHEMA.TABLES where TABLE_NAME in
(*select your table names*)


1
投票

SETUSER 可以工作,拥有一个用户,甚至是数据库中具有所需默认模式的孤立用户。但 SETUSER 位于永远不支持的遗留列表中。因此,类似的替代方案是使用所需的默认模式设置应用程序角色,只要不需要跨数据库访问,这应该像一种享受一样工作。


-1
投票

尝试设置用户。示例

declare @schema nvarchar (256)
set @schema=(
  select top 1 TABLE_SCHEMA
  from INFORMATION_SCHEMA.TABLES
  where TABLE_NAME='MyTable'
)
if @schema<>'dbo' setuser @schema

-2
投票

动态添加架构的另一种方法,或者如果您想将其更改为其他内容

DECLARE @schema AS VARCHAR(256) = 'dbo.'
--User can also use SELECT SCHEMA_NAME() to get the default schema name


DECLARE @ID INT

declare @SQL nvarchar(max) = 'EXEC ' + @schema +'spSelectCaseBookingDetails @BookingID = '  + CAST(@ID AS NVARCHAR(10))

如果 @ID 是 nvarchar 或 varchar,则无需强制转换

执行(@SQL)


-3
投票

对于 Oracle,请使用这个简单的命令:

ALTER SESSION SET current_schema = your-schema-without-quotes;

© www.soinside.com 2019 - 2024. All rights reserved.