CREATE USER 유저이름
INDENTIFIED BY 패스워드
DEFAULT TABLESPACE 테이블스페이스 이름
TEMPORARY TABLESPACE 임시테이블스페이스 이름
QUOTA UNLIMITED ON 테이블스페이스
QUOTA 10M ON 테이블스페이스2
PASSWORD EXPIRE -- 비밀번호를 만기시켜 새롭게 설정하도록 함
ACCOUNT [UNLOCK(기본값) | LOCK]
PROFILE [PROFILE이름 | DEFAULT(기본값)]
DROP USER 유저이름 CASCADE;
예) 개발자들에게 부여할 시스템 권한
-CREATE PROCEDURE
-CREATE TRIGGER
-CREATE VIEW
--role 생성
CREATE ROLE prog;
--데이터베이스에 생성된 롤정보
SELECT * FROM dba_roles;
--role에 시스템 권한 부여
GRANT create procedure, create trigger, create view TO prog;
--role에 부여한 시스템 권한 확인
SELECT * FROM dba_sys_privs WHERE grantee = 'PROG';
--role에 객체권한을 부여
GRANT select ON hr.employees TO prog;
--role에 부여한 객체권한 확인
SELECT * FROM dba_tab_privs WHERE grantee = 'PROG';
--role을 유저에게 권한부여
GRANT prog TO insa;
--유저한테 부여한 role을 확인
SELECT * FROM dba_role_privs WHERE grantee = 'INSA';
--role에 부여한 시스템권한 확인
SELECT * FROM role_sys_privs;
--role에 부여한 객체권한 확인
SELECT * FROM role_tab_privs;
--직접 받은 시스템권한 확인
SELECT * FROM user_sys_privs;
--직접 받은 객체권한, 내가 부여한 객체권한 확인
SELECT * FROM user_tab_privs;
--role 생성
CREATE ROLE mgr;
--mgr 롤에 select any table 시스템 권한 부여
GRANT select any table TO mgr;
SELECT * FROM dba_sys_privs WHERE grantee = 'MGR';
--mgr 롤을 insa에 부여해주세요
GRANT mgr TO insa;
SELECT * FROM dba_role_privs WHERE grantee = 'INSA';

--부여받은 role 확인
SELECT * fROM session_roles;
--내가 받은 롤에 시스템권한 확인
SELECT * FROM role_sys_privs;
--내가 받은 롤에 객체권한 확인
SELECT * FROM role_tab_privs;
--sys가 보유한 딕셔너리 테이블 조회해보기
SELECT * FROM sys.user$;

-- 일반적으로 role을 유저한테 부여하면 default role로 활성화 된다.
SELECT * FROM user_role_privs;

-- insa 유저가 받은 롤중에 mgr롤은 제외한 후 다른 롤들은 활성화 한다.
ALTER USER insa DEFAULT ROLE ALL EXCEPT mgr;
SELECT * FROM dba_role_privs WHERE grantee = 'INSA';

SELECT * FROM session_roles;

-- insa 유저가 받은 롤 전부를 비활성화 한다.
ALTER USER insa DEFAULT ROLE NONE;
SELECT * FROM dba_role_privs WHERE grantee = 'INSA';

-- insa 유저가 받은 롤 전부를 활성화 한다.
ALTER USER insa DEFAULT ROLE ALL;
SELECT * FROM dba_role_privs WHERE grantee = 'INSA';

select * FROM role_sys_privs;
CREATE OR REPLACE VIEW dept_view
AS
SELECT * FROM hr.departments;


- 부여받은 role안에 select any table 권한이 있어도 뷰 생성 안에서 서브쿼리 테이블을 조회는 할수 없다.
- 뷰 생성시 수행하는 SELECT 문장에 해당하는 테이블의 객체권한은 별도로 받아서 수행해야 한다.
--직접적인 객체 권한 부여
GRANT select ON hr.departments TO insa;
--직접 부여받은 객체권한으로 뷰 생성 가능하다
CREATE OR REPLACE VIEW dept_view
AS
SELECT * FROM hr.departments;
SELECT text FROM user_views;

--객체권한 회수
REVOKE select ON hr.departments FROM insa;
SELECT * FROM dept_view;

- view의 owner 일지라도 해당 view가 access하는 객체에 대한 직접적인 권한이 없으면 view를 조회 할수가 없다.
-- 전체 롤 비활성화
SET ROLE NONE;
-- 전체 롤 활성화
SET ROLE ALL;
-- 특정 롤만 활성화
SET ROLE prog;
-- 특정 롤 제외하고 활성화
SET ROLE ALL EXCEPT MGR;
CREATE ROLE mgr
IDENTIFIED BY oralce;
GRANT select any table TO mgr;
GRANT mgr TO insa;
SELECT * FROM SESSION_ROLES;

- 처음 조회 했을때는 부여받은 role이 조회되지 않는다
SET ROLE prog, mgr IDENTIFIED BY oralce;
SELECT * FROM SESSION_ROLES;

- 그냥 SET ROLE ALL을 하게 되면 패스워드가 설정되어있는 ROLE은 설정되지 않는다. 패스워드를 같이 입력해줘야 한다.
ALTER ROLE mgr NOT IDENTIFIED;
SELECT * FROM user_role_privs;

CREATE OR REPLACE PROCEDURE insert_emp1(
p_id IN number,
p_name IN varchar2,
p_sal IN number)
IS
BEGIN
INSERT INTO emp(employee_id, last_name, salary)
VALUES (p_id, p_name, p_sal);
END insert_emp1;
/
GRANT EXECUTE hr.insert_emp1 TO green;
EXECUTE hr.insert_emp1(1, '김범수', 100000);

- definer's right 프로그램이었기 때문에 green 세션에서 수행했더라도 hr 유저의 emp 테이블로 insert된다.
- hr.emp 테이블에 insert 하기 위해서는 원래같으면 emp 테이블에 대한 select 객체 권한이 필요하겠지만, 프로그램을 실행하게 되면 간접 access를 하기 때문에 따로 권한이 필요없다. 프로그램을 실행할 권한만 필요하다.
AUTHID CURRENT_USER를 명시해줘야 한다.CREATE OR REPLACE PROCEDURE insert_emp2(
p_id IN number,
p_name IN varchar2,
p_sal IN number)
AUTHID CURRENT_USER -- Invoker's right
IS
BEGIN
INSERT INTO emp(employee_id, last_name, salary)
VALUES (p_id, p_name, p_sal);
END insert_emp2;
/
GRANT EXECUTE hr.insert_emp1 TO green;
EXECUTE hr.insert_emp2(2,'james',50000);

- invoker's right 프로그램은 호출자 입장에서 사용되기 때문에 green이 가지고 있는 emp 테이블에 데이터가 insert 되게 된다.
- green 유저가 속해있는 테이블스페이스에 대한 quota 값이 없으면 오류가 발생한다. sys에서 green 유저에 대한 quota값을 수정해줘야한다.
ALTER USER green
QUOTA 10M ON users;
- green 유저가 emp테이블이 없는 상태에서 프로그램을 실행하면 오류가 발생된다.

CREATE OR REPLACE PROCEDURE priv_mgr
AUTHID CURRENT_USER
IS
BEGIN
IF to_char(sysdate,'hh24:mi') BETWEEN '15:05' AND '15:10' THEN
dbms_session.SET_ROLE('sec_app_role');
ELSE
dbms_session.SET_ROLE('NONE');
END IF;
END priv_mgr;
/
-- 응용프로그램 롤 생성
CREATE ROLE sec_app_role
IDENTIFIED USING priv_mgr;
- dbms_session 패키지 안에 SET_ROLE 프로그램을 통해 특정 role을 활성화 시킬 수 있다.
- AUTHID CURRENT_USER 를 통해 Invoker's right 모드로 만들어 호출자 입장에서 실행하도록 한다.
GRANT select any dictionary TO sec_app_role;
GRANT execute ON priv_mgr TO insa;
- role을 직접적으로 유저에게 grant 하는게 아니라
프로그램을 실행시킬 execute 권한을 grant하여 해당 조건에만 role을 활성화 시키게 구성함
-- 프로그램 실행
EXECUTE sys.priv_mgr;
-- 받은 role 확인
SELECT * FROM session_roles;
-- select any dictionary 권한으로 조회 가능
SELECT * FROM sys.obj$;

SELECT * FROM dba_profiles WHERE profile = 'DEFAULT' AND resource_type = 'PASSWORD';
SELECT * FROM dba_profiles WHERE profile = 'DEFAULT' AND resource_type = 'KERNEL';

FAILED_LOGIN_ATTEMPTS : 암호 오류 허용 횟수
PASSWORD_LOCK_TIME (일 단위) : 암호 오류 허용 횟수를 넘었다면 자동으로 계정이 잠김 일수
PASSWORD_LIFE_TIME (일 단위) : 암호 유효기간
PASSWORD_GRACE_TIME (일 단위) : 암호 만료 이후 암호 변경까지 유예기간
PASSWORD_REUSE_TIME (일 단위) : 주어진 일 수 동안에는 암호를 재사용 할수 없도록 지정
PASSWORD_REUSE_MAX : 현재 암호를 재사용 하기 위해 필요한 암호 변경 횟수를 지정한다.
PASSWORD_REUSE_TIME PASSWORD UNLIMITED
PASSWORD_REUSE_MAX PASSWORD UNLIMITED
- 이전 암호는 무한으로 재사용 할 수 있다.
INACTIVE_ACCOUNT_TIME : 지정된 일수 동안 데이터베이스에 로그인 하지 않은 사용자에 대해서 잠그겠다.
휴면 계정으로 만든다고 보면 될거같다.
최소값 15일 ~ 최대값 24855일
PASSWORD_VERIFY_FUNCTION : 암호의 복합성 검사, 함수로 구현
오라클이 제공하는 샘플 스크립트 위치 $ORACLE_HOME/rdbms/admin/utlpwdmg.sql
sys 계정에서 해당 스크립트 실행


- 해당 스크립트를 실행하면 오라클에서 제공하는 password_verify_function 샘플 함수를 사용한다.
ALTER PROFILE DEFAULT LIMIT
PASSWORD_VERIFY_FUNCTION VERIFY_FUNCTION_ITWILL;

ALTER PROFILE DEFAULT LIMIT
FAILED_LOGIN_ATTEMPTS 3
PASSWORD_LOCK_TIME UNLIMITED;

로그인시 유효횟수 초과 할 경우 계정 LOCK 걸리는데 DBA가 해제 시켜줘야 한다.
SELECT * FROM dba_users WHERE username = 'INSA';
ALTER USER insa ACCOUNT UNLOCK;

PASSWORD_VERIFY_FUNCTION 프로파일일 적용하고 싶지 않으면 null로 변경하면 된다.
ALTER PROFILE DEFAULT LIMIT
PASSWORD_VERIFY_FUNCTION NULL;