数据库用户管理

1 Oracle数据库用户管理

创建用户
create user username identified by passwd
default tablespace tablespace_name
temporary tablespace tablespace_name
quota  100M on tablespace_name[quota unlimited on users];
锁/解锁用户
alter user username account lock;
alter user username account unlock;
获取创建用户的语句
set long 9999;
select dbms_metadata.get_ddl('USER','SCOTT') from dual;
修改配额
alter user tw quota 200M on users;

修改用户默认表空间

alter user  username default tablespace tablespace_name temporary tablespace  tablespace_name  ;
常用拼接sql,授权语句
select 'grant select on '||owner||'.'||table_name||'  to User2; ' from dba_tables where owner=upper('User1');

select 'grant '||privilege||' on '||owner||'.'||table_name||' to User2;' from dba_tab_privs where grantee=upper('User1');

2 程序用户、开发、测试人员账号管理

程序用户
create user User01 identified by xxx 
default tablespace Tbs_dat_01
profile  default;

# 配额授权
alter user User01 quota unlimited on Tbs_dat_01;
alter user User01 quota 0 on system;
alter user User01 quota 0 on sysaux;
alter user User01 quota 0 on users;

# 用户权限
grant connect,RESOURCE to User01;
grant CREATE VIEW to User01;
grant CREATE SYNONYM to User01;
grant DEBUG CONNECT SESSION to User01;
grant DEBUG ANY PROCEDURE to User01;
grant execute ANY PROCEDURE to User01;

# 删除用户
drop user  User01 cascade;
开发、测试人员只读账号
create user User02  identified by "xxx" profile user_profile   default tablespace Tbs_dat_01;
grant create session to User02;

# 将生产User1表授权给User02只读用户:
select 'grant select on '||owner||'.'||table_name||'  to User02; ' from dba_tables where owner=upper('User1');

# select any table ,select any dictionary 视情况授权

3 Profile管理

profile说明:
# 口令策略参数

FAILED_LOGIN_ATTEMPTS
PASSWORD_LOCK_TIME         :用于指定指定账户被锁定的天数(单位:天)。
PASSWORD_LIFE_TIME         :  指定口令的效期(单位:天)。如果在达到效期前用户还没更换口令,它的口令将失效,这时必须由DBA 为它重新设置新的口令  
PASSWORD_GRACE_TIME        :用于指定口令失效的宽限期(单位:天)
PASSWORD_REUSE_TIME         :指定能够重复使用一个口令前必须经过的时间(单位:天)。
PASSWORD_REUSE_MAX         :用于指定在重复使用口令之前必须对口令进行修改的次数。
PASSWORD_REUSE_TIME 和PASSWORD_REUSE_MAX 两个参数只能设置一个,另一个必须为UNLIMITED。
PASSWORD_VERIFY_FUNCTION    :指定验证口令复杂度的函数

# 资源限制参数

CPU_PER_SESSION        :限制每个会话所能使用的CPU 时间
SESSIONS_PER_USER    :限制每个用户所允许建立的最大并发会话数。
CONNECT_TIME            :限制每个会话能连接到数据库的最长时间,超过这个时间会话将自动断开。
IDLE_TIME                     :限制每个会话所允许的最长连续空闲时间,超过这个时间会话将自动断开
LOGICAL_READS_PER _SESSION    :限制每个会话所能读取的数据块数目
PRIVATE_SGA                :每个会话分配的私SGA 区大小(以字节为单位
CPU_PER_CALL              :用于指定每条SQL 语句可占用的最大CPU 时间,单位是百分之一秒。
LOGICAL_READS_PER_CALL        :用于指定每条SQL 语句最多所能读取的数据块数目。

# 锁定帐户
FAILED_LOGIN_ATTEMPTS        : 参数指定在锁定帐户前尝试登录失败的次数。
PASSWORD_LOCK_TIME           : 参数指定在经历指定的尝试登录失败次数后锁定帐户的天数。
自定义profile: sys_system_profile、user_profile
create profile SYS_SYSTEM_PROFILE limit
            password_life_time 83
            password_grace_time 7
            password_reuse_max 5
            password_verify_function verify_function
            failed_login_attempts 6
            Password_lock_time 3;

create profile USER_PROFILE limit
            password_verify_function verify_function;
alter user sys profile sys_system_profile;
alter user system profile sys_system_profile;

# 程序,系统用户不建议设置密码过期策略:
alter profile  sys_system_profile  limit password_life_time unlimited;
# alter profile  user_profile limit password_life_time unlimited;
verify_function创建脚本:
CREATE OR REPLACE FUNCTION verify_function
                                        (  username varchar2,
                                           password varchar2,
                                       old_password varchar2
                                         )
  RETURN boolean IS 
   n boolean;
   m integer;
   differ integer;
   isdigit boolean;
   ischar  boolean;
   ispunct boolean;
   db_name varchar2(40);
   digitarray varchar2(20);
   punctarray varchar2(25);
   chararray varchar2(52);
   i_char varchar2(10);
   simple_password varchar2(10);
   reverse_user varchar2(32);

BEGIN 
   digitarray:= '0123456789';
   chararray:= 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';

   -- Check for the minimum length of the password
   IF length(password) < 8 THEN
      raise_application_error(-20001, 'Password length less than 8');
   END IF;


   -- Check if the password is same as the username or username(1-100)
   IF NLS_LOWER(password) = NLS_LOWER(username) THEN
     raise_application_error(-20002, 'Password same as or similar to user');
   END IF;
   FOR i IN 1..100 LOOP
      i_char := to_char(i);
      if NLS_LOWER(username)|| i_char = NLS_LOWER(password) THEN
        raise_application_error(-20005, 'Password same as or similar to user name ');
      END IF;
    END LOOP;

   -- Check if the password is same as the username reversed
   
   FOR i in REVERSE 1..length(username) LOOP
     reverse_user := reverse_user || substr(username, i, 1);
   END LOOP;
   IF NLS_LOWER(password) = NLS_LOWER(reverse_user) THEN
     raise_application_error(-20003, 'Password same as username reversed');
   END IF;

   -- Check if the password is the same as server name and or servername(1-100)
   select name into db_name from sys.v$database;
   if NLS_LOWER(db_name) = NLS_LOWER(password) THEN
      raise_application_error(-20004, 'Password same as or similar to server name');
   END IF;
   FOR i IN 1..100 LOOP
      i_char := to_char(i);
      if NLS_LOWER(db_name)|| i_char = NLS_LOWER(password) THEN
        raise_application_error(-20005, 'Password same as or similar to server name ');
      END IF;
    END LOOP;

   -- Check if the password is too simple. A dictionary of words may be
   -- maintained and a check may be made so as not to allow the words
   -- that are too simple for the password.
   IF NLS_LOWER(password) IN ('welcome1', 'database1', 'account1', 'user1234', 'password1', 'oracle123', 'computer1', 'abcdefg1', 'change_on_install') THEN
      raise_application_error(-20006, 'Password too simple');
   END IF;

   -- Check if the password is the same as oracle (1-100)
    simple_password := 'oracle';
    FOR i IN 1..100 LOOP
      i_char := to_char(i);
      if simple_password || i_char = NLS_LOWER(password) THEN
        raise_application_error(-20007, 'Password too simple ');
      END IF;
    END LOOP;

   -- Check if the password contains at least one letter, one digit 
   -- 1. Check for the digit
   isdigit:=FALSE;
   m := length(password);
   FOR i IN 1..10 LOOP 
      FOR j IN 1..m LOOP 
         IF substr(password,j,1) = substr(digitarray,i,1) THEN
            isdigit:=TRUE;
             GOTO findchar;
         END IF;
      END LOOP;
   END LOOP;

   IF isdigit = FALSE THEN
      raise_application_error(-20008, 'Password must contain at least one digit, one character');
   END IF;
   -- 2. Check for the character
   <<findchar>>
   ischar:=FALSE;
   FOR i IN 1..length(chararray) LOOP 
      FOR j IN 1..m LOOP 
         IF substr(password,j,1) = substr(chararray,i,1) THEN
            ischar:=TRUE;
             GOTO endsearch;
         END IF;
      END LOOP;
   END LOOP;
   IF ischar = FALSE THEN
      raise_application_error(-20009, 'Password must contain at least one \
              digit, and one character');
   END IF;


   <<endsearch>>
   -- Check if the password differs from the previous password by at least
   -- 3 letters
   IF old_password IS NOT NULL THEN
     differ := length(old_password) - length(password);

     differ := abs(differ);
     IF differ < 3 THEN
       IF length(password) < length(old_password) THEN
         m := length(password);
       ELSE
         m := length(old_password);
       END IF;

       FOR i IN 1..m LOOP
         IF substr(password,i,1) != substr(old_password,i,1) THEN
           differ := differ + 1;
         END IF;
       END LOOP;

       IF differ < 3 THEN
         raise_application_error(-20011, 'Password should differ from the \
            old password by at least 3 characters');
       END IF;
     END IF;
   END IF;
   -- Everything is fine; return TRUE ;   
   RETURN(TRUE);
END;
/

4 用户管理中常见问题

当不知道数据库用户密码情况下,需要同步密码到另外一个用户时,可以查看密文并同步:

SQL> select NAME,PASSWORD from sys.user$ where name in upper('USER1');

NAME                           PASSWORD
------------------------------ ------------------------------
USER1                          E2345A7546479F56

# 备份user2的密码:
SQL> select NAME,PASSWORD from sys.user$ where name in upper('USER2');

NAME                           PASSWORD
------------------------------ ------------------------------
USER2                          1B6DE6A8B54F0C49

# 修改User2的密码
SQL> alter user USER2 identified by values 'E2345A7546479F56';

User altered.

SQL> select NAME,PASSWORD from sys.user$ where name in upper('USER2');

NAME                           PASSWORD
------------------------------ ------------------------------
USER2                          E2345A7546479F56

附:生成随机密码函数及用法:

函数创建
CREATE OR REPLACE FUNCTION RANDOM_PASSWORD (IN_TEMPLATE IN VARCHAR2)  
RETURN VARCHAR2 IS  
                  LC$CRITERIA VARCHAR2(1);  
                  LC$PASSWORD VARCHAR2(500);  
                  LC$PATTERN VARCHAR2(500);  
                  LN$INDX NUMBER;  
BEGIN  
 /*
 1-Character should be UPPERCASE     =====> Abbreviation [U]  
 2- Character should be LOWERCASE      =====> Abbreviation [L]  
 3- Character should be NUMBER         =====> Abbreviation [N]  
 4- Character should be any character     =====> Abbreviation [A]  
 5- Character should be NON-ALPHANUMERIC character =====> Abbreviation [S]
 */  
     LC$CRITERIA := '';  
     LC$PASSWORD := '';  
     FOR I IN 1.. LENGTH(IN_TEMPLATE) LOOP  
       LC$CRITERIA := SUBSTR(IN_TEMPLATE,I,1);  
       IF UPPER(LC$CRITERIA ) = 'U'    THEN   
         LC$PATTERN := q'[ABCDEFGHIJKLMNOPQRSTUVWXYZ]';  
       ELSIF UPPER(LC$CRITERIA ) = 'L' THEN   
          LC$PATTERN := q'[abcdefghijklmnopqrstuvwxyz]';  
       ELSIF UPPER(LC$CRITERIA ) = 'N' THEN   
          LC$PATTERN := q'[0123456789]';  
       ELSIF UPPER(LC$CRITERIA ) = 'A' THEN   
          LC$PATTERN := q'[0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz]';  
       ELSIF UPPER(LC$CRITERIA ) = 'S' THEN   
          LC$PATTERN := q'[~!@#$%^&*()_+-}{|":;?.,<>[]/\]';       
       ELSE  
          LC$PATTERN := q'[ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789]';  
       END IF;  
       LN$INDX := TRUNC( LENGTH(LC$PATTERN) * DBMS_RANDOM.VALUE) + 1;  
       LC$PASSWORD := LC$PASSWORD || SUBSTR(LC$PATTERN,LN$INDX,1);  
   END LOOP;  
   RETURN LC$PASSWORD;  
END RANDOM_PASSWORD;  
/
使用方法:
SELECT RANDOM_PASSWORD ('ULASULLS') FROM DUAL;
python随机生成密码脚本:
#!/usr/bin/env python
# -*- coding:utf-8 -*-

import random, string

def GenPassword(length):
    numOfNum = random.randint(1,length-1)
    numOfLetter = length - numOfNum
    slcNum = [random.choice(string.digits) for i in range(numOfNum)]
    slcLetter = [random.choice(string.ascii_letters) for i in range(numOfLetter)]
    slcChar = slcNum + slcLetter
    random.shuffle(slcChar)
    genPwd = ''.join([i for i in slcChar])
    return genPwd

if __name__ == '__main__':
    print GenPassword(8)
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,546评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,224评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,911评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,737评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,753评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,598评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,338评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,249评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,696评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,888评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,013评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,731评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,348评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,929评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,048评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,203评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,960评论 2 355

推荐阅读更多精彩内容

  • ORA-00001: 违反唯一约束条件 (.) 错误说明:当在唯一索引所对应的列上键入重复值时,会触发此异常。 O...
    我想起个好名字阅读 5,319评论 0 9
  • 一、Python简介和环境搭建以及pip的安装 4课时实验课主要内容 【Python简介】: Python 是一个...
    _小老虎_阅读 5,746评论 0 10
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,103评论 1 32
  • 你一定不知道 你所过之处 流年沉醉 花香漫天 百转了嫣然一笑 你一定不知道 你所过之处 桃李三千 文书满座 留下了...
    雅致的慧姑娘阅读 237评论 0 3
  • 在日常的linux系统使用中经常会有替换文件字符串,删除查询等功能,sed命令为此而生,大猪也要复习复习一下了。 ...
    大猪大猪阅读 971评论 0 2