SQL 服务器架构和默认架构

Posted

技术标签:

【中文标题】SQL 服务器架构和默认架构【英文标题】:SQL server schema and default schema 【发布时间】:2011-04-17 21:37:37 【问题描述】:

我的数据库中有一个模式定义。除了现在每次我执行 sql 语句时,我都必须提供架构...... SELECT * FROM [myschema].table

我使用 Management Studio 为我的用户设置了默认架构,还运行了 ALTER USER myUser WITH DEFAULT_SCHEMA [myschema] 在编写没有架构的查询时,我仍然得到无效的对象“表”(SELECT * FROM 表)

有没有办法写SELECT * FROM table而不必一直指定模式名称?

它使用 SQL Management Studio 在 SQL 2005 上。

【问题讨论】:

您是从某些代码(Java、.Net)还是 SQL 管理器发出 SQL 查询? 来自 sql management studio ... 【参考方案1】:

用户是否为SA,如果是则将不起作用,根据documentation SA 用户始终默认为dbo 架构。

DEFAULT_SCHEMA 的值被忽略 如果用户是 sysadmin 固定服务器角色。全部 sysadmin 固定服务器的成员 角色具有 dbo 的默认架构。

【讨论】:

运行这些 SELECT SUSER_NAME()SELECT USER_NAME() 并告诉我你的输出。 有差异的原因吗? 这条信息帮了我大忙——默认模式由于某种原因被忽略了,现在我们知道为什么...... 谢谢。这解决了我的问题。在执行 SQL 脚本迁移时,我遇到了“找不到对象”错误。我的用户是系统管理员,所以所有脚本都失败了:) 所以问题是....权限太多了!删除系统管理员角色。微软风格:)【参考方案2】:

几个选项:

    您的用户是否列在安全 > 用户(在 SSMS 中)下?检查 Properties(右键单击名称),并查看 Default schema 是否设置在数据库的上下文中,而不是实例中(这就是 ALTER USER设置)。

    Create a synonym 要引用的表:

    CREATE SYNONYM table_name  
       FOR [your_db].[your_schema].table_name
    

    ...这将影响在该数据库的上下文中不使用至少两个名称符号的每个人。 Read more about it here。但它最终与架构相关联。

    检查在“可用数据库”下拉菜单(左上角,执行按钮左侧)中选择的数据库是否正确。

    在指定表(和视图)引用时使用三个名称表示法:

    SELECT * 
      FROM [your_db].[your_schema].table_name
    

【讨论】:

我的问题是关于是否可以通过 SSMS 中的某些配置来避免名称表示法......我不想在我的查询中包含整个数据库、模式,因为它可能很长.正确选择了可用的数据库。 @pdiddy:我补充说同义词是另一个考虑因素。抱歉,我错过了您不想使用名称表示法。 对于选项 1,我如何检查上下文 ..? @pdiddy:它基于在 SSMS 中的 Ava​​ilable Databases* 下拉列表中选择的数据库。运行CREATE SYNONYM 语句,然后检查SSMS 中数据库的同义词 节点下列出的内容——对我来说,同义词包括模式名称。可能必须刷新 Synonym 节点才能看到新创建的同义词。【参考方案3】:

如果您不想使用“完全限定”的 SQl 名称,则需要避免使用未使用分配的“dbo”默认架构的任何帐户或角色创建表。如果您不打算使用它,为什么需要更改用户的默认架构?

【讨论】:

为什么他应该使用“完全限定”的 SQL 名称?例如他想在数据库中存储一些用户数据。并且可以有很多用户使用相同的程序。通过模式,他可以拥有自己创建的表。在我们的程序中,这以同样的方式进行。唯一重要的是工作的默认架构!

以上是关于SQL 服务器架构和默认架构的主要内容,如果未能解决你的问题,请参考以下文章

使用高级服务为 SQL Server Express Edition 生成架构和数据

如何更改 sql developer 中的默认架构?

以 dbo 架构命名的 SQL Server 表

架构-数据库访问-SQL语言进行连接数据库服务器-OLE:OLE

sql 定义默认架构(SET SCHEMA)

浅出深入MySQL-MySQL架构之架构简介