目录
第92期培训-第五部分—Oracle11g-Oracle SQL对象管理—第19讲—跨schema管理SQL对象
一、schema的概念
1、schema的定义
我们先来看一下他们的定义:
A schema is a collection of database objects (used by a user.). Schema objects are the logical structures that directly refer to the database’s data. A user is a name defined in the database that can connect to and access objects. Schemas and users help database administrators manage database security.
解释:
从定义中我们可以看出schema为数据库对象的集合,为了区分各个集合,我们需要给这个集合起个名字,这些名字就是我们在企业管理器的方案下看到的许多类似用户名的节点,这些类似用户名的节点其实就是一个schema,schema里面包含了各种对象如tables, views, sequences, stored procedures, synonyms, indexes, clusters, and database links。
2、schema的关键理解
一个用户一般对应一个schema,该用户的schema名等于用户名,并作为该用户缺省schema。
这也就是我们在企业管理器的方案下看到schema名都为数据库用户名的原因。
Oracle数据库中不能新创建一个schema,要想创建一个schema,只能通过创建一个用户的方法解决(Oracle中虽然有create schema语句,但是它并不是用来创建一个schema的),在创建一个用户的同时为这个用户创建一个与用户名同名的schem并作为该用户的缺省shcema。
即schema的个数同user的个数相同,而且schema名字同user名字一一 对应并且相同,所有我们可以称schema为user的别名,虽然这样说并不准确,但是更容易理解一些。
3、schema的深入理解
一个用户有一个缺省的schema,其schema名就等于用户名,当然一个用户还可以使用其他的schema。
如果我们访问一个表时,没有指明该表属于哪一个schema中的,系统就会自动给我们在表上加上缺省的sheman名。
比如我们在访问数据库时,访问scott用户下的emp表,通过select * from emp; 其实,这sql语句的完整写法为select * from scott.emp。
在数据库中一个对象的完整名称为schema.object,而不属user.object。
类似如果我们在创建对象时不指定该对象的schema,在该对象的schema为用户的缺省schema。
这就像一个用户有一个缺省的表空间,但是该用户还可以使用其他的表空间,如果我们在创建对象时不指定表空间,则对象存储在缺省表空间中,要想让对象存储在其他表空间中,我们需要在创建对象时指定该对象的表空间。
4、概念
在 Oracle 数据库中,Schema 是一个逻辑上的概念,它用于将数据库对象组织到命名空间中,以便于管理和访问。简单来说,Schema 就是一组相关的数据库对象的集合,包括表、视图、索引、序列、存储过程等等。
具体来说,Schema 是一个用户拥有的一个命名空间,也称为用户 Schema。
一个用户可以创建多个 Schema,并将对象存储在自己的 Schema 中,每个 Schema 中的对象都可以互相引用。一个 Schema 可以包含多个表、视图、函数、存储过程等对象。
在 Oracle 数据库中,如果没有指定 Schema,Oracle 默认使用当前用户的 Schema,也就是说,在 SQL 语句中,可以直接使用不带限定符的对象名称。例如:
SELECT * FROM mytable;
在这个例子中,mytable 是当前用户拥有的一个表,因此我们可以直接使用它的名称。但是如果我们想引用其他 Schema 中的对象,我们需要使用限定符 schema.table 的方式,例如:
SELECT * FROM otheruser.theirtable;
在这个例子中,otheruser 是另一个用户的 Schema 名称,theirtable 是这个 Schema 中的一个表名。如果当前用户没有访问权限,就无法查询这个表。
总的来说,在 Oracle 数据库中,Schema 是用于组织和管理数据库对象的一种逻辑结构,可以在其中存储和访问表、视图、函数、存储过程等对象。不同的用户可以拥有不同的 Schema,并可以根据需要授予其他用户对其中对象的访问权限。
二、schema和用户的区别
在 Oracle 数据库中,Schema 和用户是密切相关的概念,但它们有一些区别。下面是它们之间的区别:
1. 概念与范围:
- Schema 是一个逻辑上的概念,用于组织和管理数据库对象,它是一组相关对象的集合,包括表、视图、索引、序列等。Schema 提供了一个命名空间,用于隔离和组织对象。
- 用户是数据库中的一个实体,用于访问数据库并拥有自己的资源和权限。用户可以拥有一个或多个 Schema,每个 Schema 用于管理一组相关的对象。用户可以通过用户名和密码来连接和访问数据库。
2. 所有权和权限:
- Schema 并不拥有对自己的对象的直接所有权和访问权限。实际上,Schema 是与用户相关联的,用户是拥有对象的实体,它们能够在自己的 Schema 中创建、修改和管理这些对象。
- 用户拥有对自己的 Schema 中对象的直接所有权和访问权限。用户可以创建和管理自己的对象,并授予其他用户对其对象的访问权限。用户还可以通过授权机制授予其他用户对其 Schema 中对象的访问权限。
3. 组织和隔离:
- Schema 用于组织和隔离数据库对象,将它们按照功能或逻辑关系分组。一个用户可以拥有一个或多个 Schema,每个 Schema 用于管理特定类型或特定功能的对象。
- 用户可用于将对象和访问权限组织在一起。每个用户可以有自己的对象和权限,使其能够独立地管理和访问自己的对象。用户和他们的对象是独立的,用户之间的对象不会相互干扰。
4、总的来说,
Schema 是一种逻辑上的组织概念,用于组织和管理数据库对象;
而用户是数据库中的实体,用于连接和访问数据库,并拥有自己的资源和权限。
用户可以拥有一个或多个 Schema,每个 Schema 用于管理一组相关的对象,而用户拥有对这些对象的所有权和访问权限。
三、在 Oracle 数据库中,可以使用以下方法在跨多个 schema 管理 SQL 对象:
1. 带有模式限定符的对象名称
在 Oracle 数据库中,每个对象都需要和它所在的 schema 关联起来。因此,可以使用对象名称的模式限定符来引用其他 schema 中的对象。例如:
SELECT * FROM schema1.table1;
在这个例子中,table1 是在 schema1 schema 中定义的表,但是我们可以使用模式限定符 schema1. 来跨 schema 引用这个表。
2. 公共 synonym
Oracle 允许创建公共 synonym,用于在跨多个 schema 间引用其他 schema 中的对象。
创建公共 synonym 和创建普通的 synonym 基本相同,但是需要使用 CREATE PUBLIC SYNONYM 命令,例如:
CREATE PUBLIC SYNONYM table1 FOR schema1.table1;
在这个例子中,我们创建了一个公共 synonym table1,它引用了 schema1 schema 中的 table1 表。在任何 schema 中,我们都可以使用 SELECT * FROM table1 来查询这个表。
3. 跨 schema 的访问权限
最后,可以使用 Oracle 数据库的访问控制机制来跨 schema 管理 SQL 对象。在 Oracle 中,可以使用 GRANT 和 REVOKE 命令来授予或撤销用户对指定对象的访问权限。例如:
GRANT SELECT ON schema1.table1 TO schema2;
在这个例子中,我们将 schema1 schema 中的 table1 表的 SELECT 权限授予了 schema2 schema 中的用户。
这样,schema2 schema 中的用户就可以使用 SELECT * FROM schema1.table1 来查询这个表。
总的来说,在 Oracle 中跨 schema 管理 SQL 对象可以通过模式限定符、公共 synonym 和访问权限三种方法来实现。具体选择哪种方法取决于实际需求和设计。
四、跨schema访问对象
在 Oracle 数据库中,跨 Schema 访问对象需要使用限定符 "schema"."object" 的方式来指定对象的完整名称,其中 "schema" 是指目标 Schema 的名称,"object" 是指要访问的对象的名称。
1、下面的 SQL 语句查询了 Schema1 中的一个表 table1 的内容:
SELECT * FROM schema1.table1;
在这个例子中,schema1 是要访问的 Schema 的名称,table1 是 Schema1 中的一个表名。如果当前用户没有访问权限,就无法查询这个表。
如果当前用户没有直接访问目标 Schema 的权限,也可以使用授权机制来获得间接访问权限。具体来说,可以使用 GRANT 命令向当前用户授予访问目标 Schema 和其中对象的权限。例如,下面的 SQL 语句向当前用户授予对 Schema1 中所有对象的 SELECT 权限:
GRANT SELECT ON schema1.* TO current_user;
在这个例子中,current_user 是当前用户的用户名, schema1.* 表示 Schema1 中所有对象。通过这个授权,当前用户就可以使用 "schema1"."object" 的方式来访问 Schema1 中的任何对象。需要注意的是,授权的粒度可以更细,即可以为目标 Schema 中的每个对象分别授予访问权限。
总的来说,在 Oracle 数据库中,跨 Schema 访问对象需要使用限定符 "schema"."object" 的方式来指定对象的完整名称,同时需要确保当前用户拥有访问目标 Schema 的权限或者已经获得了需要的授权。
五、案例
SQL> Gruant dba to scott
SQL> create table test(name char(10));
Table created.
SQL> create table system.test(name char(10)); Table created. SQL> insert into test values('scott'); 1 row created. SQL> insert into system.test values('system'); 1 row created. SQL> commit; Commit complete. SQL> conn system/manager Connected. SQL> select * from test; NAME ---------- system SQL> ALTER SESSION SET CURRENT_SCHEMA = scott; --改变用户缺省schema名 Session altered. SQL> select * from test; NAME ---------- scott SQL> select owner ,table_name from dba_tables where table_name=upper('test'); OWNER TABLE_NAME ------------------------------ ------------------------------ SCOTT TEST SYSTEM TEST --上面这个查询就说将schema作为user的别名的依据。实际上在使用上,shcema与user完全一样,没有什么区别,在出现schema名的地方也可以出现user名。
六、形象理解
转:https://www.cnblogs.com/AllenWongFly/p/17206521.html
下面是比较形象的说法:
“我们可以把Database看作是一个大仓库。仓库分了很多很多的房间,Schema就是其中的房间。一个Schema代表一个房间。Table可以看作是每个Schema中的床,Table(床)被放入每个房间中,不能放置在房间之外,那岂不是晚上睡觉无家可归了。然后床上可以放置很多物品,就好比 Table上可以放置很多列和行一样,数据库中存储数据的基本单元是Table。现实中每个仓库放置物品的基本单位就是床, User就是每个Schema的主人(所以Schema包含的是Object,而不是User),user和schema是一一对应的,每个user在没有特别指定下只能使用自己schema(房间)的东西。如果一个user想使用其他schema(房间)的东西,那就要看那个schema(房间)的user(主人)有没有给你这个权限了,或者看这个仓库的老大(DBA)有没有给你这个权限了。换句话说,如果你是某个仓库的主人,那么这个仓库的使用权和仓库中的所有东西都是你的(包括房间),你有完全的操作权,可以扔掉不用的东西从每个房间,也可以放置一些有用的东西到某一个房间,你还可以给每个User分配具体的权限,也就是他到某一个房间能做些什么,是只能看(Read-Only),还是可以像主人一样有所有的控制权(R/W),这个就要看这个User所对应的角色Role了。”