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 中的 Available Databases* 下拉列表中选择的数据库。运行CREATE SYNONYM
语句,然后检查SSMS 中数据库的同义词 节点下列出的内容——对我来说,同义词包括模式名称。可能必须刷新 Synonym 节点才能看到新创建的同义词。【参考方案3】:
如果您不想使用“完全限定”的 SQl 名称,则需要避免使用未使用分配的“dbo”默认架构的任何帐户或角色创建表。如果您不打算使用它,为什么需要更改用户的默认架构?
【讨论】:
为什么他应该使用“完全限定”的 SQL 名称?例如他想在数据库中存储一些用户数据。并且可以有很多用户使用相同的程序。通过模式,他可以拥有自己创建的表。在我们的程序中,这以同样的方式进行。唯一重要的是工作的默认架构!以上是关于SQL 服务器架构和默认架构的主要内容,如果未能解决你的问题,请参考以下文章
使用高级服务为 SQL Server Express Edition 生成架构和数据