Oracle: Account is locked

นอกจาก profile จะสามารถกำหนดระยะเวลา เพื่อบังคับให้ user เปลี่ยน password ก็ยังสามารถกำหนดได้ว่า ถ้า user login ผิดติดต่อกันกี่ครั้ง account ก็จะถูก lock เหมือนเรากดรหัส ATM ผิด 3 หน แล้วถึงยึดบัตรนะแหละค่ะ แต่สำหรับใน profile จะกำหนดในตัวแปร FAILED_LOGIN_ATTEMPTS (เช็คได้จาก resource_name column ใน dba_profiles table) ซึ่ง error ที่แสดงตอนที่ login ก็จะแสดงดังนี้

ORA-28000: The account is locked

หรือถ้าต้องการเช็คสถานะ ก็ทำได้ดังนี้

> select account_status, lock_date from dba_users where username = '<username>';

ตัวอย่างของ account ที่ถูกล็อคเป็นดังนี้

ACCOUNT_STATUS LOCK_DATE
----------------------------- ---------
LOCKED 11-SEP-09



ถ้า account ปกติ ค่า account_status จะเป็น OPEN

ถ้าจะ unlock (หรือ lock) ก็ใ้ช้คำสั่งนี้เลยค่ะ

> ALTER USER <username> ACCOUNT <UNLOCK | LOCK>;

สำหรับ วิธีจะแก้ FAILED_LOGIN_ATTEMPTS ใน profile ทำได้ดังนี้ค่ะ

> ALTER PROFILE <profile>
LIMIT failed_login_attempts <value | UNLIMITED | DEFAULT >;



Reference:
Oracle profile

Oracle: Password has expired

ใน Oracle สามารถกำหนด profile ให้แต่ละ user ได้ ซึ่งใน profile นั้นจะกำหนดลักษณะของ user account ได้ โดยผ่าน resource และใน resource นี้เอง DBA สามารถกำหนดได้ว่า จะให้ user นี้จะต้องเปลี่ยน password บ่อยแค่ไหน งงม่ะค่ะ

เช่น userA ใช้ profileA ซึ่งใน profileA กำหนดว่า user จะต้องเปลี่ยน password ทุกๆ 180 วัน แบบนี้เป็นต้น

ดังนั้น user ไม่มีการเปลี่ยน password ในเวลาที่กำหนด password ก็จะ expired และเมื่อ log in ก็จะได้ error แบบนี้

ORA-28001: The password has expired

เราจะรู้ได้อย่างไร ว่า user ไหนใช้ profile ไหน และ profile set ไว้อย่างไร ดูได้ดังนี้ค่ะ

> select profile
from dba_users
where username = '<username>';


ซึ่งตัวอย่างคำสั่งข้างต้นเราจะได้ชื่อของ profile ที่ user นั้นๆ ใช้อยู่ จาก profile ถ้าอยากรู้ว่า profile set ไว้อย่างไร ก็ sql command นี้ค่ะ

> select resource_name, resource_type, limit
from dba_profiles
where profile = '<profile>';


แทนที่ชื่อ profile ที่ได้จากคำสั่งข้างต้น ก็จะได้ผลลัพธ์ออกมาประมาณนี้

RESOURCE_NAME                    RESOURCE LIMIT
-------------------------------- -------- ----------------------------------------
COMPOSITE_LIMIT KERNEL UNLIMITED
SESSIONS_PER_USER KERNEL UNLIMITED
CPU_PER_SESSION KERNEL UNLIMITED
CPU_PER_CALL KERNEL UNLIMITED
LOGICAL_READS_PER_SESSION KERNEL UNLIMITED
LOGICAL_READS_PER_CALL KERNEL UNLIMITED
IDLE_TIME KERNEL UNLIMITED
CONNECT_TIME KERNEL UNLIMITED
PRIVATE_SGA KERNEL UNLIMITED
FAILED_LOGIN_ATTEMPTS PASSWORD 10
PASSWORD_LIFE_TIME PASSWORD 180
PASSWORD_REUSE_TIME PASSWORD UNLIMITED
PASSWORD_REUSE_MAX PASSWORD UNLIMITED
PASSWORD_VERIFY_FUNCTION PASSWORD NULL
PASSWORD_LOCK_TIME PASSWORD 1
PASSWORD_GRACE_TIME PASSWORD 7

16 rows selected.

สำหรับการดูว่า user จะ expired ภายในกี่วัน ดูจาก resouce_name ที่ชื่อ PASSWORD_LIFE_TIME ซึ่งในกรณีข้างต้น password จะ expired ภายใน 180 วัน และ user จะต้องเปลี่ยน password ภายในเวลาที่กำหนดไว้ใน PASSWORD_GRACE_TIME ซึ่งก็คือ 7 วัน มิฉะนั้นแล้ว ก็จะ error ดังข้างต้น

ในกรณีที่ ถ้าเกิด error แล้ว ต้องการจะแก้ไข จะต้องใช้ DBA เป็นคนเข้าไปเปลี่ยน password ของ user คนนั้นค่ะ โดย sql command ดังนี้

> alter user <username> identified by <new_password>;


Reference:
ORA-28001: The password has expired
Oracle profile