【问题标题】:How do I obtain a list of all schemas in a Sql Server database如何获取 Sql Server 数据库中所有模式的列表
【发布时间】:2011-04-12 18:54:45
【问题描述】:

我想检索给定 Sql Server 数据库中所有模式的列表。使用ADO.NET 模式检索 API,我得到了所有集合的列表,但没有“模式”的集合。 我可以遍历'Tables''Procedures' 集合(以及其他如果需要)并获得唯一模式名称的列表,但没有更简单/更短的方法来实现相同的结果吗?

示例:对于标准 'AdventureWorks' 数据库,我想获得以下列表 - dbo,HumanResources,Person,Production,Purchasing,Sales(我省略了其他标准架构名称,如 db_accessadmindb_datareader 等)

编辑:我可以通过查询系统视图来获取架构列表 - INFORMATION_SCHEMA.SCHEMATA,但我更喜欢使用架构 API 作为首选。

【问题讨论】:

    标签: c# .net sql-server ado.net


    【解决方案1】:

    如果您使用的是 Sql Server Management Studio,您可以获取所有架构的列表、创建您自己的架构或通过浏览到删除现有架构:

    数据库 - [您的数据库] - 安全 - 架构

    [

    【讨论】:

      【解决方案2】:

      您还可以使用以下查询来获取特定数据库用户的架构:

      select s.schema_id, s.name as schema_name
      from sys.schemas s
      inner join sys.sysusers u on u.uid = s.principal_id
      where u.name='DataBaseUserUserName'
      order by s.name
      

      【讨论】:

        【解决方案3】:
        SELECT s.name + '.' + ao.name
               , s.name
        FROM sys.all_objects ao
        INNER JOIN sys.schemas s ON s.schema_id = ao.schema_id
        WHERE ao.type='u';
        

        【讨论】:

          【解决方案4】:

          对于 2005 年及以后的版本,这些都可以满足您的需求。

          SELECT name FROM sys.schemas
          SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA
          

          对于 2000,这将给出 instance 中的 数据库 列表。

          SELECT * FROM INFORMATION_SCHEMA.SCHEMATA
          

          这就是@Adrift 的回答中提到的“向后不兼容”。

          在 SQL Server 2000(及更低版本)中,实际上并没有这样的“模式”,尽管您可以以类似的方式将角色用作命名空间。在这种情况下,这可能是最接近的等价物。

          SELECT * FROM sysusers WHERE gid <> 0
          

          【讨论】:

          • 我尝试在 sql 2000 服务器上使用它,但没有返回所有模式。有人知道为什么会这样吗?
          • 我没有用于测试的 2000 个实例——而且我认为 I 是一个真正的挂机!请记住,2000 没有像更高版本那样的实际“模式”,因此您真正列出的是角色。试试SELECT * FROM sysusers,看看你是否看到了你正在寻找的标识符。
          • 我阅读了它,就我阅读的消息来源而言,SELECT * FROM INFORMATION_SCHEMA.SCHEMATA 实际上并不是一个好主意。更好的方法是执行主表存储过程“sp_databases”。它适用于 2000 年和 2005 年(都经过测试),在我的情况下,每次都返回正确的结果。
          • @evilfish,感谢您的留言。为了清楚起见,这是一个关于在数据库中列出 schemas 的问题,听起来您想在实例中列出 databases。这有点令人困惑,因为INFORMATION_SCHEMA.SCHEMATA 在不同版本的 MS SQL 中都提供了这两个函数。
          【解决方案5】:

          您还可以查询 INFORMATION_SCHEMA.SCHEMATA 视图:

          SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA
          

          我认为建议查询 INFORMATION_SCHEMA 视图,因为它们可以保护您免受底层 sys 表的更改。来自 SQL Server 2008 R2 帮助:

          信息架构视图提供了一个 内部的,独立于系统表的 SQL Server 元数据的视图。 信息模式视图启用 应用程序正常工作 尽管发生了重大变化 制作到底层系统表。 包含的信息模式视图 在 SQL Server 中符合 ISO 的标准定义 INFORMATION_SCHEMA。

          具有讽刺意味的是,它的前面紧跟着这个注释:

          已对 破坏的信息模式视图 向后兼容性。这些变化 在主题中进行了描述 具体观点。

          【讨论】:

            【解决方案6】:

            在这里试试这个查询:

            SELECT * FROM sys.schemas
            

            这将为您提供执行此操作的数据库中所有定义模式的名称和 schema_id。

            我真的不知道您通过查询“架构 API”是什么意思 - 这些 sys. 目录视图(在 sys 架构中)是您获取有关这些数据库中的数据库和对象的任何系统信息的最佳选择。

            【讨论】:

            • 酷。您的查询似乎也可以解决问题。想知道什么更有效 - 查询 sys.schema 或 INFORMATION_SCHEMA.SCHEMATA 视图? 'Schema API' 我指的是标准的 SqlConnection.GetSchema' 调用,而不是显式地发出查询。
            • “系统”目录视图可能更高效、更快,但它们是特定于 SQL Server 的。 INFORMATION_SCHEMA 视图是一个与数据库无关的 ANSI 标准,用于查询数据库元数据,但由于它们是由标准委员会设计的......你明白了......
            • 可能不相关,我尝试this 使用PK,FK,D,C,V,UQ 等的多个选择语句来比较源数据库和目标数据库,但后来我在VS 中发现this 功能,但没有sql query比较完整的源数据库和目标数据库?
            猜你喜欢
            • 2014-09-29
            • 2021-12-18
            • 1970-01-01
            • 2022-01-20
            • 1970-01-01
            • 2010-09-13
            • 1970-01-01
            • 2011-02-13
            • 1970-01-01
            相关资源
            最近更新 更多