我使用迁移工具成功地从MySql迁移到Sql Server。
不幸的是,出于某种原因,它标记了表database.DBO.tablename
,而不仅仅是database.tablename
我从未使用过Sql Server,所以也许这就是他们为表命名的方式。
当我这样做时:
SELECT TOP 1000 [rid]
,[filename]
,[qcname]
,[compound]
,[response]
,[isid]
,[isidresp]
,[finalconc]
,[rowid]
FROM [test].[calibration]
它不起作用
但是,当我这样做时:
SELECT TOP 1000 [rid]
,[filename]
,[qcname]
,[compound]
,[response]
,[isid]
,[isidresp]
,[finalconc]
,[rowid]
FROM [test].[dbo].[calibration]
它有效。
有谁知道为什么它以DBO作为前缀?
答案 0 :(得分:5)
dbo
是您创建的任何内容(表格,存储过程等等)的标准database owner,因此迁移工具会自动为其添加前缀。
当您访问Sql Server中的某些内容时,例如名为calibration
的表,以下内容在功能上是等效的:
calibration
dbo.calibration
database_name.dbo.calibration
server_name.database_name.dbo.calibration
MySql没有,据我记得(大约12个月前我们使用nant执行的自定义脚本将解决方案从MySql迁移到SqlServer)支持数据库所有者在引用对象时,因此您可能不熟悉四个部分(server_name.database_name.owner_name.object_name
)引用。
基本上,如果要指定要访问的数据库,还需要指定对象的“所有者”。即,以下功能相同:
USE [master]
GO
SELECT * FROM [mydatabase].[dbo].[calibration]
USE [mydatabase]
GO
SELECT * FROM [calibration]
答案 1 :(得分:3)
SqlServer在引用表时使用所有者名称。在这种情况下,dbo是所有者。
MySQL不使用所有者来表名,这就是为什么你之前没有看到这些名字的原因。
答案 2 :(得分:3)
SQL Server有一些叫做模式的东西,在这种情况下,默认模式是dbo,但它可以是你想要的任何东西。模式用于逻辑分组对象。因此,您可以创建一个Employee模式并在其中包含所有Employee表,视图,过程和函数,这样您还可以让某些用户只能访问某些模式
答案 3 :(得分:1)
告诉我您使用过的迁移工具,并让我知道从和到数据库的版本。
问候
尤金
答案 4 :(得分:1)
如果您为登录的用户设置为“dbo”,则确实存在默认架构的问题,因为您不需要指定它。见http://msdn.microsoft.com/en-us/library/ms176060.aspx