SCOPE=MEMORY|SPFILE|BOTH 指示了修改参数时的“作用域”:
SCOPE=MEMORY :只在实例中修改,重启数据库后此次修改失效。
SCOPE=SPFILE :只修改SPFILE中的值,重启数据库后这个修改才会生效。
SCOPE=BOTH :在内存和SPFILE中都会完成参数修改。这个参数修改在当前实例中生效,下次以SPFILE启动数据库时也会生效。
数据库参数文件分为二类:
1.初始参数文件:pfile(initialization parameter file)
2.服务器参数文件:spfile(server-side parameter file)
主要的区别是:
1.pfile是文本文件,spfile是二进制文件
2.pfile可以通过文本编辑器修改,spfile主要是通过alter system set parameter=value [scope=memory|spfile|both]修改
oracle启动时,读取参数文件的顺序是:
1.spfile$ORACLE_SID.ORA(创建数据库时创建的spfile)
2.spfile.ora(oracle缺省spfile文件)
3.init$ORACLE_SID.ora(创建数据库时创建的pfile)
4.init.ora(oracle缺省pfile文件)
oracle会按顺序读出这些参数文件,如果在1没有找到就去找2,直到找到。
和参数文件相关常用SQL如下:
1.查看当前使用的spfile和pfile的位置:show parameter spfile/show parameter pfile
2.查看参数文件的具体设置:show parameters
3.从spfile获取pfile:
create pfile='pfilesid.ora' from spfile
create pfile='pfilesid.ora' from spfile='/$ORACLE_HOME/dbs/spfile.ora'
4.修改参数
alter system set parameter=value [scope=memory|spfile|both]
1.修改后当前实例起作用,重启数据库不起作用:scope=memory
2.修改后当前实例不起作用,下次重启数据库才起作用:scope=spfile
3.修改后当前实例起作用,下次重启数据库也起作用:scope=both
Notice:命令alter system set parameter=value在没有加scope选项时,默认值是什么呢?多数朋友可能不加思索就会回答both这答案,实际的情况是,当oracle在以spfile参数启动时,默认值是both,而以pfile启动时,默认值是memory,也就是只修改当前值。所以如果不能确定启动的参数文件,可以用show parameter spfile查看。
5.指定初始参数文件启动数据库:startup pfile='/$ORACLE_HOME/dbs/init$ORACLE_SID.ora'
不能以指定服务器参数文件spfile来启动数据库,可以先将spfile转换成pfile,再用这个命令来达到目的。
6.查看系统是以pfile还是spfile启动:show parameter spfile。如果是null值,就是pfile启动的。
2.参数文件的动作原理
oracle实例在启动时,会去读取参数文件中的配置,这个过程是这样的:
数据库的startup命令中可以指定以哪个pfile来启动,但是请注意,只能指定pfile,不 能指定spfile。
当使用不带pfile 子句的startup 命令时,Oracle 将从平台指定的默认位置上的服务器 参数文件(spfile) 中读取初始化参数。Oracle查找spfile或者init.ora的顺序是:在平台指定的默认位置上,Oracle首先查找名为spfile$ORACLE_SID.ora的文件,如果没有就查找spfile.ora文件,还没有的话,就找init$ORACLE_SID.ora文件。
在$ORACLE_BASE\admin\db_name\spfile下,你可以看到一个类似这样init.ora.1 92003215317]名字的文件,这就是初始化参数文件,只是跟上了时间戳。对于Oracle920 ,缺省的就使用spfile启动,但是这个spfile不是凭空而来,而是根据这个文件创建而来 ,你可以去掉这个长后缀,就是标准的pfile文件了。
数据库中的同义词(SYNONYM)
建立:create 【public】 synonym 同义词名称(一般可以与表名不同,这样不容易混淆) for AA.table_name;--在当前用户下建立一个同义词(去同义“AA”中的表:table_name,public的是可选参数,本人建议尽量建立公用的 同义词)
删除:DROP 【public】 SYNONYM 同义词名称; ---------此处特别注意 关键字 public 的存在--------;
查看:select * from user_synonyms sy where sy.synonym_name ='A_CODEMAPPING'; --查看私有的同义词,自己看到自己创建的;
select * from all_synonyms sy where sy.synonym_name ='A_CODEMAPPING'; --可以查看到 某某创建的 公共的 同义词
参看信息中包括,同义词拥有者,表拥有者,是否public的等信息;
1》同义词 分为私有的 和公共的两种;
私有的:
也只有 本用户使用,包括别的用户查不到 用户 “BB” 有这个同义词(这点很重哟奥);
共有的:
可以被其它的任何用户使用, 也可以被人家查到,看到这个同义词,当然最重要的也可以被别的用户删除;
同义词相当于模式对象的别名,起著连结数据库模式对象和应用程序的作用,假如模式对象需要更换,则不用修改应用程序而直接修改同义词就可以了
建立一个同义词可以排除一个对象名字的限制.
如果你的数据库有多个用户,USER_A要访问USER_B的TABLE1,只能使用USER_B.TABLE1
建一个同义词abc指向USER_B.TABLE1,那你就可以select * from abc了,而且public的同义词会直接出现在所有用户的面前,开发不就方便多了
创建同义词
语法:
CREATE [OR REPLACE] [PUBLIC] SYNONYM [schema.] synonym_name FOR [schema.] object_name [@dblink];
语法说明:
OR REPLACE: 在不使用DROP的前提下容许你重新创建(如果同义词已经存在)。
PUBLIC: 所创建的同义词是全局的同义词,所有数据库用户都可以使用。
schema: 要创建同义词的对象所在的schema,如果省略,则默认的应用对象在当前schema下。
object_name: 要创建同义词的对象,它可以是以下几种类型:
TABLE
VIEW
SEQUENCE
STORED PROCEDURE
FUNCTION
PACKAGE
MATERIALIZED VIEW
JAVA CLASS SCHEMA OBJECT
USER-DEFINED OBJECT
SYNONYM
示例:
CREATE PUBLIC SYNONYM suppliers FOR app.suppliers;
示例中创建的同义词名为suppliers,这样,其他schema下的用户可以使用该同义词来使用app下的suppliers表而不必加上app。例如:
SELECT *
FROM suppliers;
删除同义词
语法
DROP [PUBLIC] SYNONYM [schema.] synonym_name [FORCE];
说明:
PUBLIC: 容许删除PUBLIC同义词, 如果使用了PUBLIC关键字,则可以省略schema。
FORCE:用来强制删除同义词,即使它在数据库中有其它的依赖。
示例:
DROP PUBLIC SYNONYM suppliers;