怎样找回sys和system系统管理员的密码
C:/>sqlplus /nolog
SQL*Plus: Release 10.2.0.1.0 - Production on 星期六 9月 12 19:38:26 2009
Copyright (c) 1982, 2005, Oracle. All rights reserved.
SQL> connect / as sysdba
已连接。
SQL> alter user sys identified by sys;
用户已更改。
SQL> alter user system identified by system;
用户已更改。
SQL>
sys 和 system 用户区别
1 ) 最重要的区别,存储的数据的重要性不同
sys :
所有 oracle 的数据字典的基表和视图都存放在 sys 用户中,这些基表和视图对于 oracle 的运行是至关重要的,由数据库自己维护,任何用户都不能手动更改。 sys 用户拥有 dba , sysdba , sysoper 等角色或权限,是 oracle 权限最高的用户。
system :
system 用户用于存放次一级的内部数据,如 oracle 的一些特性或工具的管理信息。 system 用户拥有 dba , sysdba 等角色或系统权限。
2) 其次的区别,权限的不同。简单来说 sys 可以启动关闭数据库,而 system 不可以。
sys 用户必须以 as sysdba 或 as sysoper 形式登录。
sysdba 和 sysoper 属于 system privilege ,也称为 administrative privilege ,拥有例如数据库开启关闭之类一些系统管理级别的权限 sysdba 和 sysoper 具体的权限可以看下表:
| sysdba | sysoper |
区别 | startup | startup |
shutdown | shutdown | |
alter database open/mount/backup | alter database open/mount/backup | |
改变字符集 | none | |
create database | none | |
drop database | none | |
create spfile | create spfile | |
alter database archivelog | alter database archivelog | |
alter database recover | 只能完全恢复,不完全恢复不行 | |
拥有 restricted session 权限 | 拥有 restricted session 权限 | |
可以让用户作为 sys 用户连接 | 可以进行一些基本的操作,但不能查看用户数据 |
system 如果正常登录,它其实就是一个普通的 dba 用户,但是如果以 as sysdba 登录,其结果实际上它是作为 sys 用户登录的,这一点类似 Linux 里面的 sudo 的感觉,从登录信息里面我们可以看出来。
SQL> conn system/manager as sysdba
Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.1.0
Connected as SYS
因此在 as sysdba 连接数据库后,创建的对象实际上都是生成在 sys 中的。我们来做一个小实验:
SQL> create user test identified by test;
User created
SQL> grant sysdba to test;
Grant succeeded
SQL> conn test/test as sysdba
Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.1.0
Connected as SYS
SQL> create table test (a int);
Table created
SQL> select owner from dba_tables where table_name=’TEST’;
OWNER
——————————
SYS
同样,以 as sysoper 登录,实际上是作为 public 登录的。
Oracle中Sequence的使用
Oracle提供了sequence对象,由系统提供自增长的序列号,通常用于生成数据库 数据记录的自增长主键或序号的地方.
下面介绍一下关于sequence 的生成,修改,删除等常用的操作:
1. 创建 Sequence
使用如下命令新建sequence(用户需要有CREATE SEQUENCE 或者CREATE ANY SEQUENCE权限):
[注意] 如果设置了CACHE值,ORACLE将在内存里预先放置一些sequence,以使存取速度更快。cache里面的取完后,oracle自动再取一组到 cache。 但是,使用cache可能会跳号, 当遇到数据库 突然异常down掉(shutdown abort),cache中的sequence就会丢失. 因此,推荐在create sequence的时候使用 nocache 选项。
2. 使用 sequence
sequence.CURRVAL -- 返回 sequence的当前值
Returns the current value of a sequence
sequence.NEXTVAL -- 增加sequence的值,然后返回 sequence 值
Increments the sequence and returns the next value
[注意] 第一次NEXTVAL返回的是初始值; 随后的NEXTVAL会自动增加你定义的INCREMENT BY值,然后返回增加后的值。
CURRVAL 总是返回当前SEQUENCE的值,但是在第一次NEXTVAL初始化之后才能使用CURRVAL,否则会出错。 一次NEXTVAL会增加一次 SEQUENCE的值,所以如果你在同一个语句里面使用多个NEXTVAL,其值就是不一样的。
sequence 存储在数据字典中,存储于user_sequences表
LAST_NUMBER 为最终序列号,也就是sequence游标当前所在的位置.
The LAST_NUMBER column displays the next available sequence number.
3. 修改 Sequence
用户必须拥有ALTER ANY SEQUENCE 权限才能修改sequence. 可以alter除start至以外的所有sequence参数. 如果想要改变start值,必须 drop sequence 再 re-create.
命令格式如下:
4. 删除 Sequence DROP SEQUENCE test_sequence;
5. sequence属于什么对象
sequence不属于某个表,也不属于某个字段,sequence仅仅属于某个用户。
其实在创建了sequence后,每个表都可以使用这个sequence,但是这样会引起应用的很多麻烦,因此,建议每个表都使用一个sequence。