我已将AdventureWorks数据库下载并附加到我的本地SQL Server 2005 Developer Edition。但遗憾的是,并非所有表和其他数据库对象都具有dbo
前缀。当我想运行一些查询时,我必须针对例如名为Production.Contact
的表进行查询。我想运行这样的查询:
select * from Contact
而不是
select * from Person.Contact
我想了解为什么有些表的前缀为dbo
而其他表没有。我希望所有表都有dbo
前缀,我可以使用它们的名称运行查询,而不需要任何额外的前缀(我的意思是模式名称)。人是架构名称。我不想在我的查询中有这个问题。 :(
我怎样才能做到这一点?
请帮忙。
答案 0 :(得分:4)
您看到的dbo前缀称为架构。这对于产品来说是一样的。模式有点像sql server的命名空间。如果要尝试将产品架构中的表传输到dbo架构,可以使用以下语法:
ALTER SCHEMA dbo TRANSFER product.[someTable]
但是,如果dbo架构中已存在产品架构中的表名,则您将无法执行此操作,因为您不能拥有两个具有相同名称的表。大多数情况下,您的架构将用于组织目的。
<强>加成强>
您不需要添加'dbo'的原因。查询中的模式前缀是因为这是每个数据库的默认模式。当您编写没有此架构的查询时,SQL Server只是假设您的意思是'dbo'。一些最佳实践表明您的查询应始终包含架构。
答案 1 :(得分:2)
您可以完成所要求的唯一方法是将您用于登录的用户帐户与产品架构相关联。这将使Product模式成为用户登录的默认模式,当然您可能只有一个。
我认为更广泛的一点是,在SQL 2005及更高版本中编写查询时,预计必须对对象名称进行模式限定。