我有一项将SQL Server数据库迁移到Oracle的任务。
我们的SQL Server数据库中有几个不同的SCHEMA,我必须在Oracle中创建类似的东西。 在SQL Server中,SCHEMA就像是C#中的命名空间。但是从Oracle文档中可以理解,Oracle中的Schema与SQL Server中的Schema有着截然不同的含义。
更具体地说,我在SQL Server中有以下SQL语句:
CREATE SCHEMA Accounting
CREATE TABLE [Accounting].[Payments]
(
ID BIGINT,
Amount MONEY
)
那么Oracle中这个脚本的等价物是什么?
答案 0 :(得分:4)
Oracle等效的SQL Server架构就是架构。 Oracle服务器与单个数据库进行通信,这就是"真正的"两者之间的区别:SQL Server实例可以连接到多个数据库,而Oracle实例只能连接到一个。因此,SQL Server在服务器中使用三部分命名约定,而Oracle只有两部分命名约定。
在两者中,模式对象通常都是安全单元 - 它们便于为对象组分配权限。两个数据库在一些非常重要的问题上有所不同在Oracle中,模式本质上是用户的同义词。 SQL Server曾经以这种方式组织,但现在一个模式与用户分开(例如,允许在模式之间移动对象)。
在SQL Server中,权限不必位于架构级别,尽管这通常可以方便用于组织目的。例如,您可能拥有用户在一个架构中无法直接访问的基础表。您可以拥有另一个包含视图的模式,模式具有访问表的权限。然后,添加到架构的新视图会自动具有" right"权限。
答案 1 :(得分:4)
虽然@Gordon Linoff的答案非常完美地解释了两个数据库中的模式背后的想法,以回答你的实际问题:
您以用户身份创建架构:
CREATE USER Accounting IDENTIFIED BY some_password;
然后使用以下命令在该模式中创建对象:
CREATE TABLE Accounting.Payments
(
ID NUMBER(19),
Amount NUMBER(19,4)
)
答案 2 :(得分:0)
一个历史注释可以帮助解释一些困惑:在MS SQL Server 2000之前,Schema的含义几乎与Oracle中的相同。 MS SQL Server是基于Sybase SQL Server的,它也许也更类似于Oracle。 然后到2005年,MS取消了用户和架构之间的绑定,尽管默认架构名称(如dbo)是基于用户名的。
好的答案在DBA堆栈论坛中:What is the difference between an Oracle and Microsoft schema?