Oracle中的Schema和User
在产品detail拆分项目中,由于需要将原来的Product表拆分为Product、Product_detail两个表,数据库采取的方法是新建了一个Schema——alibaba1949。对schema不了解,现在也对其进行了一点学习。
Oracle数据库中Schema和User的关系是一一对应的,也就是说一个Schema只对应一个User,一个User对应一个Schema。Oracle中,schema是与拥有此schema的user同名的。Schema可以翻译成“方案”。
不同的schema之间它们没有直接的关系,不同的schema之间的表可以同名,也可以互相引用(但必须有权限),在没有别的schema的操作权限下,每个用户只能操作它自己的schema下的所有的表。不同的schema下的同名的表,可以存入不同的数据(即schema用户自己的数据)。
user即Oracle中的用户,和所有系统的中用户概念类似,用户所持有的是系统的权限及资源;而schema所涵盖的是各种对象,它包含了表、视图、函数、包等等对象的“所在地”,并不包括对他们的权限控制。
好比一个房子,里面放满了家具,对这些家具有支配权的是房子的主人(user),而不是房子(schema)。你可以也是一个房子的主人(user),拥有自己的房子(schema)。可以通过alter session的方式进入别人的房子。这个时候,你可以看到别人房子里的家具如果你没有特别指定的话,你所做的操作都是针对你当前所在房子中的东西。
至于你是否有权限使用(select)、搬动(update)或者拿走(delete)这些家具就看这个房子的主人有没有给你这样的权限了,或者你是整个大厦(DB)的老大(DBA)。alter session set schema可以用来代替synonyms。如果你想调用其他schema的对象(有权限的前提下),但并没有建synonym,同时又不想把其他schema名字放入代码中,就可以首先使用alter session set schema=<其他schema名字>。
例子:
1.改变当前session的schema:
ALTER SESSION SET CURRENT_SCHEMA = alibaba1949
之后就可以直接使用alibaba1949这个schema中的表,不用写成alibaba1949.table_name
2.查询另一个schema或另一个user(alibaba)下的table:
SELECT * FROM alibaba.product
3.根据表名查询所有者:
select owner,table_name from all_tables where table_name = Upper('product')
select owner,table_name from all_tables where table_name = Upper('product_detail')
其他参考资料:
user是控制权限的,而schema则是一个容器,非所有者如果需要访问这个容器下的对象,就需要在对象前面写上schema(owner)的名字,如果不想写而又没有创建synonym,此时可以通过alter session set current_schema=schema_name来改变当前session的schema从而在访问对象时省去schema(owner);最终能否访问对象还是要看是否有访问这个对象的权限而和schema无关。
The schema (pronounced skee-ma) of a database system is its structure described in a formal language supported by the database management system (DBMS). In a relational database, the schema defines the tables, the fields, relationships, views, indexes, packages, procedures, functions, queues, triggers, types, sequences, materialized views, synonyms, database links, directories, Java, XML schemas, and other elements.
schema: Collection of database objects, including logical structures such as tables, views, sequences, stored procedures, synonyms, indexes, clusters, and database links. A schema has the name of the user who controls it.
Synonym(同义词):建立一个同义词可以排除一个对象名字的限制
如果你的数据库有多个用户,USER_A要访问USER_B的TABLE1,只能使用USER_B.TABLE1
建一个同义词abc指向USER_B.TABLE1,那你就可以select * from abc了,而且public的同义词会直接出现在所有用户的面前。