數(shù)據(jù)庫用戶管理

1 Oracle數(shù)據(jù)庫用戶管理

創(chuàng)建用戶
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;
獲取創(chuàng)建用戶的語句
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埠况,授權(quán)語句
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 程序用戶筷凤、開發(fā)昭殉、測試人員賬號管理

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

# 配額授權(quán)
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;

# 用戶權(quán)限
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;
開發(fā)、測試人員只讀賬號
create user User02  identified by "xxx" profile user_profile   default tablespace Tbs_dat_01;
grant create session to User02;

# 將生產(chǎn)User1表授權(quán)給User02只讀用戶:
select 'grant select on '||owner||'.'||table_name||'  to User02; ' from dba_tables where owner=upper('User1');

# select any table ,select any dictionary 視情況授權(quán)

3 Profile管理

profile說明:
# 口令策略參數(shù)

FAILED_LOGIN_ATTEMPTS
PASSWORD_LOCK_TIME         :用于指定指定賬戶被鎖定的天數(shù)(單位:天)嵌施。
PASSWORD_LIFE_TIME         :  指定口令的效期(單位:天)饲化。如果在達到效期前用戶還沒更換口令,它的口令將失效吗伤,這時必須由DBA 為它重新設(shè)置新的口令  
PASSWORD_GRACE_TIME        :用于指定口令失效的寬限期(單位:天)
PASSWORD_REUSE_TIME         :指定能夠重復使用一個口令前必須經(jīng)過的時間(單位:天)吃靠。
PASSWORD_REUSE_MAX         :用于指定在重復使用口令之前必須對口令進行修改的次數(shù)。
PASSWORD_REUSE_TIME 和PASSWORD_REUSE_MAX 兩個參數(shù)只能設(shè)置一個足淆,另一個必須為UNLIMITED巢块。
PASSWORD_VERIFY_FUNCTION    :指定驗證口令復雜度的函數(shù)

# 資源限制參數(shù)

CPU_PER_SESSION        :限制每個會話所能使用的CPU 時間
SESSIONS_PER_USER    :限制每個用戶所允許建立的最大并發(fā)會話數(shù)。
CONNECT_TIME            :限制每個會話能連接到數(shù)據(jù)庫的最長時間巧号,超過這個時間會話將自動斷開族奢。
IDLE_TIME                     :限制每個會話所允許的最長連續(xù)空閑時間,超過這個時間會話將自動斷開
LOGICAL_READS_PER _SESSION    :限制每個會話所能讀取的數(shù)據(jù)塊數(shù)目
PRIVATE_SGA                :每個會話分配的私SGA 區(qū)大械ず琛(以字節(jié)為單位
CPU_PER_CALL              :用于指定每條SQL 語句可占用的最大CPU 時間越走,單位是百分之一秒。
LOGICAL_READS_PER_CALL        :用于指定每條SQL 語句最多所能讀取的數(shù)據(jù)塊數(shù)目。

# 鎖定帳戶
FAILED_LOGIN_ATTEMPTS        : 參數(shù)指定在鎖定帳戶前嘗試登錄失敗的次數(shù)廊敌。
PASSWORD_LOCK_TIME           : 參數(shù)指定在經(jīng)歷指定的嘗試登錄失敗次數(shù)后鎖定帳戶的天數(shù)铜跑。
自定義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;

# 程序骡澈,系統(tǒng)用戶不建議設(shè)置密碼過期策略:
alter profile  sys_system_profile  limit password_life_time unlimited;
# alter profile  user_profile limit password_life_time unlimited;
verify_function創(chuàng)建腳本:
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 用戶管理中常見問題

當不知道數(shù)據(jù)庫用戶密碼情況下锅纺,需要同步密碼到另外一個用戶時,可以查看密文并同步:

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

附:生成隨機密碼函數(shù)及用法:

函數(shù)創(chuàng)建
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)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末肋殴,一起剝皮案震驚了整個濱河市囤锉,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌护锤,老刑警劉巖官地,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異蔽豺,居然都是意外死亡区丑,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進店門修陡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來沧侥,“玉大人,你說我怎么就攤上這事魄鸦⊙缟保” “怎么了?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵拾因,是天一觀的道長旺罢。 經(jīng)常有香客問我,道長绢记,這世上最難降的妖魔是什么扁达? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮蠢熄,結(jié)果婚禮上跪解,老公的妹妹穿的比我還像新娘。我一直安慰自己签孔,他們只是感情好叉讥,可當我...
    茶點故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著饥追,像睡著了一般图仓。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上但绕,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天救崔,我揣著相機與錄音,去河邊找鬼。 笑死帚豪,一個胖子當著我的面吹牛碳竟,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播狸臣,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼昌执!你這毒婦竟也來了烛亦?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤懂拾,失蹤者是張志新(化名)和其女友劉穎煤禽,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體岖赋,經(jīng)...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡檬果,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了唐断。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片选脊。...
    茶點故事閱讀 39,841評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖脸甘,靈堂內(nèi)的尸體忽然破棺而出恳啥,到底是詐尸還是另有隱情,我是刑警寧澤丹诀,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布钝的,位于F島的核電站,受9級特大地震影響铆遭,放射性物質(zhì)發(fā)生泄漏硝桩。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一枚荣、第九天 我趴在偏房一處隱蔽的房頂上張望碗脊。 院中可真熱鬧,春花似錦棍弄、人聲如沸望薄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽痕支。三九已至,卻和暖如春蛮原,著一層夾襖步出監(jiān)牢的瞬間卧须,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留花嘶,地道東北人笋籽。 一個月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像椭员,于是被迫代替她去往敵國和親车海。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,781評論 2 354

推薦閱讀更多精彩內(nèi)容

  • ORA-00001: 違反唯一約束條件 (.) 錯誤說明:當在唯一索引所對應(yīng)的列上鍵入重復值時隘击,會觸發(fā)此異常侍芝。 O...
    我想起個好名字閱讀 5,312評論 0 9
  • 一、Python簡介和環(huán)境搭建以及pip的安裝 4課時實驗課主要內(nèi)容 【Python簡介】: Python 是一個...
    _小老虎_閱讀 5,744評論 0 10
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴謹 對...
    cosWriter閱讀 11,101評論 1 32
  • 你一定不知道 你所過之處 流年沉醉 花香漫天 百轉(zhuǎn)了嫣然一笑 你一定不知道 你所過之處 桃李三千 文書滿座 留下了...
    雅致的慧姑娘閱讀 237評論 0 3
  • 在日常的linux系統(tǒng)使用中經(jīng)常會有替換文件字符串埋同,刪除查詢等功能州叠,sed命令為此而生,大豬也要復習復習一下了凶赁。 ...
    大豬大豬閱讀 971評論 0 2