【问题标题】:set default schema for a sql query为 sql 查询设置默认模式
【发布时间】:2011-06-23 22:38:45
【问题描述】:

有没有办法为查询设置架构,以便在查询的其余部分中,我可以仅通过表名来引用表,而无需在表前加上架构名?

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

Use [schemaName]
select * from [tableName]

与此相反:

select * from [schemaName].[tableName]

【问题讨论】:

  • 指向您的数据库名称并在 SQLMS 中选择新查询。使用数据库名称; Select * from [Tablename] 是正确的。

标签: sql sql-server schema


【解决方案1】:

我不相信有一种“按查询”的方式来做到这一点。 (您可以使用 use 关键字来指定 数据库 - 而不是架构 - 但从技术上讲,这是一个单独的查询,因为您必须在之后发出 go 命令。)

请记住,在 SQL Server 中,完全限定的表名采用以下格式:

[数据库].[模式].[表]

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

  • 您可以根据每个用户(或在您的连接字符串中)设置默认 database

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

  • 您可以为每个用户设置默认的schema(但我不相信您可以在连接字符串中配置它,尽管如果您使用dbo,那始终是默认设置):

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

简而言之,如果您将dbo 用于您的架构,那么您可能会遇到最少的麻烦。

【讨论】:

    【解决方案2】:

    一个快速的谷歌将我指向this page。它解释说,从 sql server 2005 起,您可以使用 ALTER USER 语句设置用户的默认模式。不幸的是,这意味着您要永久更改它,因此如果您需要在模式之间切换,则需要在每次执行存储过程或一批语句时进行设置。或者,您可以使用here 描述的技术。

    如果您使用的是 sql server 2000 或更早版本,this page 解释说用户和架构是等效的。如果你没有在表名前加上 schema\user,sql server 将首先查看当前用户拥有的表,然后查看 dbo 拥有的表来解析表名。似乎对于所有其他表,您必须预先添加 schema\user。

    【讨论】:

    • 这让我得到了我需要的答案。事实证明,如果用户是 SysAdmin 固定服务器角色的成员,则会忽略默认架构。它只是使用 dbo...
    【解决方案3】:

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

    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))
    

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

    执行 (@SQL)

    【讨论】:

      【解决方案4】:

      当我需要大量表名时,我有时会做的只是从 INFORMATION_SCHEMA 系统表中获取它们以及它们的模式: 价值

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

      【讨论】:

        【解决方案5】:

        尝试设置用户。示例

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

        【讨论】:

        • 我不认为这符合 OP 的要求。 SETUSER 似乎是要更改当前用户,而不是当前架构。此外,链接的文档暗示它已被弃用......
        【解决方案6】:

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

        【讨论】:

          【解决方案7】:

          非常老的问题,但由于谷歌将我带到这里,我将添加一个我认为有用的解决方案:

          第 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
          

          revert 语句重置当前用户,所以你又是你自己了。

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

          【讨论】:

          • 所以每个用户都有一个默认模式,直到知道才知道。谢谢。
          【解决方案8】:

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

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

          【讨论】:

          • 你的回答离题了。该问题专门针对 MS SQL Server。此外,Oracle 架构与 SQL Server 架构完全不同。
          猜你喜欢
          • 2020-05-08
          • 1970-01-01
          • 2016-02-25
          • 1970-01-01
          • 2015-09-24
          • 1970-01-01
          • 1970-01-01
          • 2015-01-06
          • 2014-04-18
          相关资源
          最近更新 更多