Oracle笔记之用户管理

时间:2023-01-27 23:38:02

1. 创建用户

创建用户使用create user语句,需要DBA权限:

CREATE USER tom IDENTIFIED BY mot;

2. 更改用户密码

修改别人的密码需要DBA权限,或者alter user权限:

ALTER USER tom IDENTIFIED BY newpasswd;

或者修改别人的密码带上用户名:

SQL> PASSWORD tom;
更改 tom 的口令
新口令: ******
重新键入新口令: ******
口令已更改

如果是更改自己的密码的话可以省略掉用户名,注意更改自己密码的时候需要输入旧密码来证明我是我自己:

SQL> PASSWORD
更改 SYS 的口令
旧口令: ******
新口令: ******
重新键入新口令: ******
口令已更改

修改密码的语法跟Linux下修改密码的语法类似,猜想是因为在很久之前大家都是用Linux的,这么设计可能是为了兼容性吧,尽量不去改变用户习惯。

4. 删除用户

删除用户也需要DBA的权限,自己删除自己是不允许的,不能自杀...

DROP USER tom;

如果需要在删除用户的时候删除此用户创建的所有表,那么在用户名后面加上cascade:

DROP USER tom CASCADE;

需要注意如果此用户已经登录到系统中的话是暂时不能删除的,所以不能自杀。

4. 更改用户权限

创建的新用户是没有任何权限的,需要为其指定权限,不指定权限的话连系统都登录不上去。
为一个用户赋予权限使用grant,回收权限使用revoke。

为创建的用户Tom赋予权限使其可以登录:

GRANT connect TO tom; 

上面的命令到底是什么意思呢?这个connect实际上是一个预定义角色,上面表示我们把一个叫做connect的角色赋予给了用户tom。

Oracle中权限分为系统权限和对象权限。

系统权限:用户对数据库的相关权限,大概有一百四十多种。

对象权限:用户对其它用户的数据对象操作的权限,大概有二十多种。

因为权限实在太多了,一个用户的权限可能非常非常的多,这个时候我们管理起来就会很崩溃,所以就引入了一个新概念叫做角色,给一个角色初始赋予很多权限,让一个角色表示一个权限的集合,这样子我们再对权限进行管理的时候就多了一个选择,可以将一个角色直接授予一个用户,当用户拥有某种角色的时候就拥有这个角色表示的所有权限。

角色又分为两种,一种是预定义角色,一种是自定义角色。

系统中初始化了一些预定义角色,但是也可能仍然满足不了我们的需求,这个时候就让我们可以自定义角色,来自定义权限集合。

GRANT connect TO tom; 

系统权限中有一种叫做create session,拥有这个权限才可以登录到系统,而connect角色包含了create session权限。

特殊的角色:

DBA:可以让一个普通用户变成一个DBA,DBA大概相当于MySQL下的root。

RESOURCE:可以让某个用户建表等一堆乱七八糟的创建(create)相关的权限。

对象权限都是啥:

select
insert
update
delete
all
create index
...

授予一个用户创建表的权限:

GRANT resource TO tom;

希望一个用户Tom可以去查看其它用户Scott创建的表emp,让用户Scott授权给用户Tom相应的对象权限:

GRANT select on emp TO tom;

登录Tom,查询Scott下的emp表:

SELECT * FROM scott.emp;

注意需要使用用户名进行引用,联想到MySQL中使用databaseName.tableName可以跨数据库查询,将一个用户当做一个数据库,引用的时候使用username.tableName进行引用,这样的话使用用户名进行分割,不同的用户名下是可以有相同表名的表的。

上面的如果需要Tom能够把赋予的这个权限继续传递,比如传递给Sam,可以在授权的时候在后面加上with grant option:

GRANT select on emp TO tom WITH GRANT OPTION;

Tom现在也可以把这个权限授予给别人了,而且还可以把权限最大化的传递,让别人也拥有授权权限,使用sys创建一个用户:

CREATE USER sam IDENTIFIED BY toor;

然后让Tom把这个权限授予给Sam:

GRANT select on scott.emp TO sam WITH GRANT OPTION;

注意如果这个时候Scott把赋予Tom的权限收回了的话,Tom授予给其他人的权限仍然是存在的,大概就相当于赵立春书记上任的时候提拔了好些*,如果他倒台了这些*也都全给一撸到底回家种地,这样子就没办法管理了,这里不实行连坐。

收回权限的时候只是将grant改为revoke,将to改为from:

REVOKE select on emp FROM tom;

5. 使用profile管理用户口令

profile是口令限制、资源限制的命令,当建立数据库的时候Oracle自动建立名为default的profile,当创建用户的时候没有指定profile的话,那么就意味着使用default的profile。

创建和管理profile需要DBA权限。

创建一个profile,名称为lock_account,用来限制登录时的最大失败尝试次数,锁定的时间单位为天:

CREATE PROFILE lock_account
LIMIT
failed_login_attempts 3
password_lock_time 2;

让Tom使用这个profile:

ALTER USER tom PROFILE lock_account;

当尝试次数超过了之后,账户又会被锁定了,再登录的时候就会提示,即使密码对了也登不上去了:

ERROR:
ORA-28000: the account is locked

账户被锁定的时候可以让DBA来解锁账户:

ALTER USER tom ACCOUNT UNLOCK;

某个用户的账户有异常行为需要冻结掉,DBA手动锁定账户:

ALTER USER scott ACCOUNT LOCK;

限制最大尝试次数可以在一定程度上提高账户的安全性。

为了提高安全性管理员通常会做的一个限制就是限定某个用户的密码每隔多长时间就修改一次,相当于一种"动态密码"了,创建一个profile限定用户必须周期性的改密码,password_life_time表示每隔多少天必须修改密码,password_grace_time表示到期后宽限几天:

CREATE PROFILE circle_passwd
LIMIT
password_life_time 10
password_grace_time 2;

上面的策略表示每隔12天就修改一次密码,在第十一天的时候就开始提醒,一直提醒两天,如果一直不修改密码的话在第十三天账户将被锁定。

我上一份工作的公司配的笔记本每隔几个月就要修改一次密码,因为我们都习惯一直用同一个熟悉的东西,不大想改变习惯嘛,所以我机智的想,如果我在到期的时候将密码随便修改一下再立刻修改回来,不仍然可以使用之前的密码而不被影响吗...哈哈哈,当我机智的这么做的时候我发现我还是太年轻...修改密码的时候有一个策略可以不允许用户使用历史密码,即之后再使用的密码不能与之前的重复,在Oracle的profile也有这个选项,使用password_reuse_time指定口令的可重用时间,比如:

CREATE PROFILE circle_passwd_history
LIMIT
password_life_time 10
password_grace_time 2
password_reuse_time 2;

删除profile:

DROP PROFILE circle_passwd_history;

当profile被删除的时候使用到这个profile的用户也不被约束了。

.