2023/12/19
▶ ora1 유저 생성 (기본테이블 스페이스로)
create user ora1 identified by oracle;
예) create table test(id number);
test segment 는 어느 tablespace 에 저장되나요?
default tablespace (user)
▶ default 테이블스페이스 확인
select * from dba_users where username='ORA1';
유저생성시 DEFAULT TABLESPACE 가 지정되어 있지 않으면 SYSTEM TABLESPACE가
되는 문제점 때문에 10g 버전 부터 db 생성시에 db레벨에서
default 테이블스페이가 생성 되어 있다.
▶ db레벨에 기본값으로 설정된 정보 확인
select * from database_properties;
▶ ora2 유저 생성 (테이블 스페이스 example로 고정, temporary tablespace temp(기본값) 으로)
create user ora2 identified by oracle
default tablespace example -- users가 기본이다.
temporary tablespace temp -- temp 가 기본이다.
quota 1m on example;
select * from dba_users where username in ('ORA1','ORA2');
▶ 테이블스페이스 생성
CREATE TABLESPACE user_tbs
DATAFILE '/u01/app/oracle/oradata/ora11g/user_tbs01.dbf' size 10m
AUTOEXTEND ON
EXTENT MANAGEMENT LOCAL
SEGMENT SPACE MANAGEMENT AUTO;
▶ temporary 테이블스페이스 생성 생성
일시적으로 저장하는것은 TEMPFILE
CREATE TEMPORARY TABLESPACE user_temp
TEMPFILE '/u01/app/oracle/oradata/ora11g/user_temp01.dbf' size 10m
AUTOEXTEND ON
EXTENT MANAGEMENT LOCAL UNIFORM SIZE 1M
SEGMENT SPACE MANAGEMENT MANUAL;
TEMPORARY 테이블스페이스는
유저별로 분리가 되어있다.
▶ default 테이블 스페이스 변경
alter database default tablespace user_tbs;
▶ default temporary 테이블스페이스 변경
alter database default temporary tablespace user_temp;
select * from database_properties;
select * from dba_users where username in ('ORA1','ORA2');
▶ temp10, temporary 테이블스페이스 생성
CREATE TEMPORARY TABLESPACE temp10
TEMPFILE '/u01/app/oracle/oradata/ora11g/user_temp10.dbf' size 10m
AUTOEXTEND ON
EXTENT MANAGEMENT LOCAL UNIFORM SIZE 1M
SEGMENT SPACE MANAGEMENT MANUAL;
SELECT * FROM dba_tablespaces;
SELECT * FROM dba_data_files;
SELECT * FROM dba_temp_files;
▶ ora3 유저 생성 (테이블 스페이스 example로 고정, temporary tablespace temp10(고정값) 으로)
create user ora3 identified by oracle
default tablespace example
temporary tablespace temp10
quota 1m on example;
▶ 확인
select * from dba_users where username in ('ORA1','ORA2','ORA3');
▶ 변경
alter database default tablespace users;
alter database default temporary tablespace temp;
▶ 확인
select from database_properties;
select from dba_users where username in ('ORA1','ORA2','ORA3');
■ 요약
- default 테이블스페이스, temporary 테이블스페이스는 변경가능하다.
- 단, 기본값이었던 유저는 변경되고, 다른 테이블스페이스, temporary테이블스페이스로 지정했던 유저는 변경이 안된다.
■ 따라서 업무별로 default 테이블스페이스와, temporary 테이블스페이스가 나누어져있다.
- 일반유저는 그냥 디폴트로 쓴다
- 유저의 기본 테이블스페이스 변경
: ALTER USER 유저명 DEFAULT TABLESPACE 테이블스페이스명;
alter database default tablespace user_tbs;
alter database default temporary tablespace user_temp;
select * from database_properties;
select * from dba_users where username in ('ORA1','ORA2','ORA3');
grant create session, create table to ora1,ora2,ora3;
▶ 확인, (admin_option: sys계정처럼 권한을줄수있는 옵션)
select * from dba_sys_privs where grantee in ('ORA1','ORA2','ORA3');
▶
conn ora1/oracle
create table test(id number, name varchar2(30), dat date);
select table_name, tablespace_name from user_tables;
select * from user_users;
insert into test(id, name, day) values(1,'james',sysdate);
- create 할때는 딕셔너리에 설계정보만 담겨있는것이고
- insert 작업시 쿼터값을 안받았으므로 에러가난다
- ORA-01950: no privileges on tablespace 'USER_TBS'
이유 : USER_TBS tablespace에 대한 quota을 받지 않아서 발생
▶ 쿼터값 확인
select * from user_ts_quotas;
▶ 쿼터값 변경 후 insert, 확인
conn / as sysdba
alter user ora1 quota 1m on user_tbs;
alter user ora1 quota 1m on example;
select * from dba_ts_quotas where username = 'ORA1';
conn ora1/oracle
select * from user_ts_quotas;
insert into test(id, name, day) values(1,'james',sysdate);
commit;
select * from test;
create table emp(id number, name varchar2(30), day date)
tablespace example;
insert into emp(id, name, day) values(1,'james',sysdate);
commit;
select * from emp;
2023/12/20
CREATE USER 유저이름
IDENTIFIED BY 암호
DEFAULT TABLESPACE 테이블스페이스 이름
TEMPORARY TABLESPACE 임시 테이블스페이스 이름
QUOTA unlimited ON 테이블스페이스 이름
QUOTA 1M ON 테이블스페이스 이름
PASSWORD EXPIRE
ACCOUNT LOCK | UNLOCK(기본 값)
PROFILE profile | DEFAULT(기본 값)
DEFAULT TABLESPACE 테이블스페이스 이름 생성이유:
생성유저가 테이블스페이스를 지정하지 않고 테이블(세그멘트)을 생성하게될 때 시스템 테이블스페이스에 생성되지 않고
디폴트 테이블스페이스에 생성하기 위함.(users 테이블스페이스)
ALTER USER 유저이름
IDENTIFIED BY 암호
DEFAULT TABLESPACE 테이블스페이스 이름
TEMPORARY TABLESPACE 임시 테이블스페이스 이름
QUOTA unlimited ON 테이블스페이스 이름
QUOTA 1M ON 테이블스페이스 이름
PASSWORD EXPIRE
ACCOUNT LOCK | UNLOCK(기본 값)
PROFILE profile | DEFAULT(기본 값)
- OBJECT 를 생성한게 없을 경우
DROP USER 유저이름;
- 유저에 속한 OBJECT 가 있을 경우 유저를 삭제하면 오류 발생한다.
OBJECT 들을 찾아서 삭제한 후 유저 삭제하면 된다.
- CASCASE 옵션을 사용하면 유저 삭제하기 전에 그 유저가 생성한 OBJECT 찾아서 삭제한 후 유저 삭제한다.
DROP USER 유저이름 CASCADE;
잘목삭제하게 되면 불한전한 복구를 해야한다
export , import
select property_name, property_value
from DATABASE_PROPERTIES;
select * from dba_tablespaces;
drop tablespace user_tbs including contents and datafiles;
drop tablespace user_temp including contents and datafiles;
alter database default tablespace users;
alter database default temporary tablespace temp;
drop tablespace user_tbs including contents and datafiles;
drop tablespace user_temp including contents and datafiles;
- 테이블스페이스 생성
CREATE TABLESPACE insa_tbs DATAFILE '/u01/app/oracle/oradata/ora11g/insa_tbs01.dbf' size 10M AUTOEXTEND ON EXTENT MANAGEMENT LOCAL UNIFORM SIZE 1M SEGMENT SPACE MANAGEMENT AUTO;
- temporary 테이블스페이스 생성
( 주의, TEMPFILE, MANAUL )CREATE TEMPORARY TABLESPACE insa_temp TEMPFILE '/home/oracle/userdata/insa_temp01.dbf' size 5M AUTOEXTEND ON EXTENT MANAGEMENT LOCAL UNIFORM SIZE 1M SEGMENT SPACE MANAGEMENT MANUAL;
select * from dba_tablespaces;
select * from dba_data_files;
select * from dba_temp_files;
CREATE USER insa
IDENTIFIED BY oracle -- 10g 부터는 비밀번호 대소문자구분
DEFAULT TABLESPACE insa_tbs
TEMPORARY TABLESPACE insa_temp
QUOTA 1M ON insa_tbs;
- 권한 관리?
: 권한은 특정 SQL문을 실행하거나 다른 유저가 소유한 object를 액세스할 수 있는 권한.
- system 권한
- db에 영향을 줄 수 있는 권한
- 권한 관리는 sys가 관리한다.
- object 권한
- 다른 유저가 소유한 object를 액세스할 수 있는 권한
- 권한 관리는 sys, 객체 소유자가 한다.
insa 한테 접속 권한주기
GRANT create session TO insa;
insa 권한 확인
select * from dba_sys_privs
where grantee = 'INSA';
[oracle@oracle ~]$ sqlplus insa/oracle
SQL*Plus: Release 11.2.0.4.0 Production on Tue Dec 19 05:20:41 2023
Copyright (c) 1982, 2013, Oracle. All rights reserved.
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
SQL> select * from user_sys_privs;
USERNAME PRIVILEGE ADM
------------------------------ ---------------------------------------- ---
INSA CREATE SESSION NO
자신의 땅 확인
SQL> select * from user_users;
USERNAME USER_ID ACCOUNT_STATUS
------------------------------ ---------- --------------------------------
LOCK_DATE EXPIRY_DA DEFAULT_TABLESPACE
--------- --------- ------------------------------
TEMPORARY_TABLESPACE CREATED INITIAL_RSRC_CONSUMER_GROUP
------------------------------ --------- ------------------------------
EXTERNAL_NAME
--------------------------------------------------------------------------------
INSA 94 OPEN
16-JUN-24 INSA_TBS
INSA_TEMP 19-DEC-23 DEFAULT_CONSUMER_GROUP
쿼터값 확인
SQL> select * from user_ts_quotas;
TABLESPACE_NAME BYTES MAX_BYTES BLOCKS MAX_BLOCKS DRO
------------------------------ ---------- ---------- ---------- ---------- ---
INSA_TBS 0 1048576 0 128 NO
SQL> create table insa_tba(id number, name
varchar2(30));
create table insa_tba(id number, name varchar2(30))
*
ERROR at line 1:
ORA-01031: insufficient privileges
create 테이블 권한주기
GRANT create table TO insa;
권한 보기
select * from dba_sys_privs where grantee = 'INSA';
- GRANT WITH ADMIN OPTION
: WITH ADMIN 옵션으로 받은 시스템 권한에 대해서는 내가 다른 유저들 한테 권한을 부여하고 권한을 취소 할 수 있다. (sys계정처럼)GRANT create table TO insa WITH ADMIN OPTION;
select * from dba_sys_privs where grantee = 'INSA';
- WITH ADMIN OPTION으로 준 권한을 dba가 회수할려면 하나씩 다 찾아서 명세서 보고 회수해야한다.
자신이 받은 권한 보기
SQL> select * from user_sys_privs;
USERNAME PRIVILEGE ADM
------------------------------ ---------------------------------------- ---
INSA CREATE SESSION NO
INSA CREATE TABLE YES
테이블생성
create table insa_tba(id number, name varchar2(30));
SQL> select tablespace_name from user_tables where table_name ='INSA_TBA';
TABLESPACE_NAME
------------------------------
INSA_TBS
확인
select * from dba_segments
where owner='INSA' AND segment_name='INSA_TBA';
select * from dba_extents
where owner='INSA' AND segment_name='INSA_TBA';
정보가 안보인다.
이유: 실제 생성은 안되고 딕셔너리에 정보만 저장한다.
설계도만 만들어진다고 생각하면 된다
- 테이블을 생성하면 그 순간은 딕셔너리에 정보만 저장한다.
- 설계도만 가지고 있다.
- 실제 segment는 생성 되지 않는다
- 실제 생성되는거는 insert 시 생성된다.
INSERT (insert시 segment가 그때 생성된다.)
INSERT INTO insa_tba(id,name) VALUES(1,'JAMES');
확인
select * from dba_segments
where owner='INSA' AND segment_name='INSA_TBA';
select * from dba_extents
where owner='INSA' AND segment_name='INSA_TBA';
롤백
ROLLBACK;
확인
select * from dba_segments
where owner='INSA' AND segment_name='INSA_TBA';
select * from dba_extents
where owner='INSA' AND segment_name='INSA_TBA';
유저생성
CREATE USER insa_buha
IDENTIFIED BY oracle
DEFAULT TABLESPACE insa_tbs
TEMPORARY TABLESPACE insa_temp
QUOTA 1M ON insa_tbs
PASSWORD EXPIRE;
접속 권한주기
GRANT CREATE SESSION TO insa_buha;
확인
select * from dba_users where username='INSA_BUHA';
select * from dba_ts_quotas where username='INSA_BUHA';
select * from dba_sys_privs where grantee='INSA_BUHA';
SQL> show user
USER is "INSA"
SQL> GRANT create table TO insa_buha;
Grant succeeded.
SQL> show user
USER is "INSA_BUHA"
SQL> select * from user_sys_privs;
USERNAME PRIVILEGE ADM
------------------------------ ---------------------------------------- ---
INSA_BUHA CREATE SESSION NO
INSA_BUHA CREATE TABLE NO
SQL> CREATE TABLE buha(id number, name varchar2(30), day date);
Table created.
SQL> INSERT INTO buha(id,name,day) VALUES(1,'SCOTT',SYSDATE);
1 row created.
SQL> commit;
Commit complete.
SQL> select * from buha;
ID NAME DAY
---------- ------------------------------ ---------
1 SCOTT 19-DEC-23
WITH ADMIN OPTION 때문에
insa 유저가 insa_buha 유저한테 create table 권한을 줘서 가능한것이다.
SQL> REVOKE create table FROM insa_buha;
Revoke succeeded.
SQL> select * from user_sys_privs;
USERNAME PRIVILEGE ADM
------------------------------ ---------------------------------------- ---
INSA_BUHA CREATE SESSION NO
create sequence 권한주기
GRANT create sequence TO insa WITH ADMIN OPTION;
확인
select * from dba_sys_privs where grantee='INSA';
SQL> select * from user_sys_privs;
USERNAME PRIVILEGE ADM
------------------------------ ---------------------------------------- ---
INSA CREATE SESSION NO
INSA CREATE SEQUENCE YES
INSA CREATE TABLE YES
SQL> CREATE SEQUENCE id_seq
START WITH 1
MAXVALUE 10
INCREMENT BY 1
NOCYCLE
NOCACHE;
Sequence created.
SQL> select * from user_sequences where sequence_name = 'ID_SEQ';
SEQUENCE_NAME MIN_VALUE MAX_VALUE INCREMENT_BY C O CACHE_SIZE
------------------------------ ---------- ---------- ------------ - - ----------
LAST_NUMBER
-----------
ID_SEQ 1 10 1 N N 0
1
SQL> select * from tab;
TNAME TABTYPE CLUSTERID
------------------------------ ------- ----------
INSA_TBA TABLE
SQL> select * from insa_tba;
no rows selected
SQL> INSERT INTO insa_tba(id,name) VALUES(id_seq.nextval,'sophia');
SQL> INSERT INTO insa_tba(id,name) VALUES(id_seq.nextval,'liam');
SQL> INSERT INTO insa_tba(id,name) VALUES(id_seq.nextval,'noah');
SQL> commit;
SQL> select * from insa_tba;
ID NAME
---------- ------------------------------
1 sophia
2 liam
3 noah
인사부하 한테 create sequence 권한 주기
SQL> GRANT create sequence TO insa_buha;
Grant succeeded.
SQL> select * from user_sys_privs;
USERNAME PRIVILEGE ADM
------------------------------ ---------------------------------------- ---
INSA_BUHA CREATE SESSION NO
INSA_BUHA CREATE SEQUENCE NO
SQL> create sequence buha_seq START WITH 2;
Sequence created.
SQL> select * from user_sequences where sequence_name = 'BUHA_SEQ';
SEQUENCE_NAME MIN_VALUE MAX_VALUE INCREMENT_BY C O CACHE_SIZE
------------------------------ ---------- ---------- ------------ - - ----------
LAST_NUMBER
-----------
BUHA_SEQ 1 1.0000E+28 1 N N 20
2
SQL>INSERT INTO buha(id,name,day) VALUES(buha_seq.nextval,'emma',sysdate);
SQL> INSERT INTO buha(id,name,day) VALUES(buha_seq.nextval,'parks',sysdate);
SQL> INSERT INTO buha(id,name,day) VALUES(buha_seq.nextval,'kkkk',sysdate);
SQL> commit;
SQL> select * from buha;
ID NAME DAY
---------- ------------------------------ ---------
1 SCOTT 19-DEC-23
2 emma 19-DEC-23
3 parks 19-DEC-23
4 kkkk 19-DEC-23
select * from dba_sys_privs where grantee='INSA';
select * from dba_sys_privs where grantee='INSA_BUHA';
권한 회수
REVOKE create sequence FROM insa;
insa한테 with admin option으로 준 권한을 회수하여도
insa가 다른 유저한테 준 권한은 회수가 연쇄적으로 안된다.
select * from dba_sys_privs where grantee='INSA';
select * from dba_sys_privs where grantee='INSA_BUHA';
따라서 따로 권한을 회수해줘야한다.
REVOKE create sequence FROM insa_buha;
- WITH GRANT OPTION
: WITH GRANT OPTION 으로 받은 객체 권한 만큼은 다른 유저들한테 권한을 부여하고 취소할 수 있다.GRANT select ON hr.employees TO insa WITH GRANT OPTION; GRANT select ON hr.departments TO insa WITH GRANT OPTION;
insa유저가 부여받은 table 권한
select * from dba_tab_privs where grantee='INSA';
SQL> select * from user_tab_privs where grantee='INSA';
GRANTEE OWNER
------------------------------ ------------------------------
TABLE_NAME GRANTOR
------------------------------ ------------------------------
PRIVILEGE GRA HIE
---------------------------------------- --- ---
INSA HR
EMPLOYEES HR
SELECT YES NO
INSA HR
DEPARTMENTS HR
SELECT YES NO
GRANTEE OWNER
------------------------------ ------------------------------
TABLE_NAME GRANTOR
------------------------------ ------------------------------
PRIVILEGE GRA HIE
---------------------------------------- --- ---
SQL> GRANT select ON hr.employees TO insa_buha;
Grant succeeded.
SQL> GRANT select ON hr.departments TO insa_buha;
Grant succeeded.
select * from user_tab_privs;
select * from hr.employees;
select * from hr.departments;
SQL> REVOKE select ON hr.employees FROM insa_buha;
Revoke succeeded.
SQL> select * from user_tab_privs;
SQL> select * from hr.employees;
select * from hr.employees
*
ERROR at line 1:
ORA-00942: table or view does not exist
SQL> select * from user_tab_privs;
GRANTEE OWNER
------------------------------ ------------------------------
TABLE_NAME GRANTOR
------------------------------ ------------------------------
PRIVILEGE GRA HIE
---------------------------------------- --- ---
INSA_BUHA HR
DEPARTMENTS INSA
SELECT NO NO
테이블 권한 확인
select * from dba_tab_privs where grantee='INSA';
select * from dba_tab_privs where grantee='INSA_BUHA';
- WITH GRANT OPTION 인 INSA유저의 테이블 권한회수
REVOKE select ON hr.departments FROM insa;- WITH GRANT OPTION을 사용하여 부여한 객체 권한을 회수하면 연쇄적으로 취소를 수행한다. ( 시스템권한의 with admin option과 다르게 , 이유: 아마 with admin option도 연쇄적으로 권한을 회수하면 접속한 유저한테도 영향을 주기때문에)
테이블 권한 확인
select * from dba_tab_privs where grantee='INSA';
select * from dba_tab_privs where grantee='INSA_BUHA';
: 관련성이 있는 권한들을 하나로 묶어서 관리하는 객체
예) 프로그래머들에게 부여할 시스템 권한
ROLE 생성
create role prog;
select * from dba_roles;
- 롤에 시스템 권한부여
GRANT create view, create procedure, create trigger TO prog; select * from dba_sys_privs where grantee='PROG';
- 롤에 객체 권한부여
GRANT select ON hr.departments TO prog; select * from dba_tab_privs where grantee='PROG';
- 롤을 유저한테 부여
GRANT select ON hr.departments TO prog; select * from dba_tab_privs where grantee='PROG';
- 롤을 유저한테 부여
GRANT prog TO insa; select * from dba_role_privs where grantee='INSA';
다시접속하면 롤이활성화
SQL> select * from session_roles;
no rows selected
- 롤을 유저한테 부여하였으면 다시접속해야 롤이활성화 된다.
SQL> conn insa/oracleConnected.
SQL> select * from session_roles;
ROLE
------------------------------
PROG
2023/12/21
set linesize 200 가로사이즈조절
set pagesize 1000 몇행당 컬럼을 디스플레이 할것인지
col role format a15
col privilege format a20
열폭 조절
col owner format a10
col table_name format a15
col column_name format a15
▶ sqlplus에서 디스플레이 조절
set pagesize 200
col grantee format a10
col privilege format a15
▶ dba_roles, dba_sys_privs
select * from dba_roles;
select * from dba_sys_privs where grantee ='CONNECT';
select * from dba_sys_privs where grantee ='RESOURCE';
select * from dba_sys_privs where grantee ='DBA';
select * from dba_tab_privs where grantee ='DBA';
▶ ROLE 생성
create role mgr;
▶ 롤 mgr에 system 권한을 부여하자
grant select any table to mgr;
select * from dba_sys_privs where grantee ='MGR';
▶ insa한테 mgr 부여
grant mgr to insa;
select * from dba_role_privs where grantee='INSA';
ROLE을 부여하고 다시 접속해야 ROLE이 부여된다.
-> 따라서 DBA는 메시지를 보내야한다.
SQL> select * from session_roles;
ROLE
---------------
PROG
SQL> conn insa/oracle
Connected.
SQL> select * from session_roles;
ROLE
---------------
PROG
MGR
SQL> select * from role_sys_privs;
ROLE PRIVILEGE ADM
--------------- -------------------- ---
MGR SELECT ANY TABLE NO
PROG CREATE TRIGGER NO
PROG CREATE VIEW NO
PROG CREATE PROCEDURE NO
SQL> select * from role_tab_privs;
ROLE OWNER TABLE_NAME COLUMN_NAME PRIVILEGE GRA
--------------- ---------- --------------- --------------- -------------------- ---
PROG HR DEPARTMENTS SELECT NO
▶ select any table 권하을 부여하였으므로 가능하다.
SQL> select * from hr.locations;
SQL> select * from user_role_privs;
USERNAME GRANTED_ROLE ADM DEF OS_
------------------------------ ------------------------------ --- --- ---
INSA MGR NO YES NO
INSA PROG NO YES NO
DEF : default yes이면 insa가 접속하면 role이 자동 활성화된다.
일반적으로 role을 유저한테 부여하면 default role로 활성화된다.
select * from dba_role_privs where grantee='INSA';
insa 유저가 받은 mgr 롤만 비활성화하기 다른것은 활성화
alter user insa default role all except mgr;
select * from dba_role_privs where grantee='INSA';
SQL> conn insa/oracle
Connected.
SQL> select * from session_roles;
ROLE
---------------
PROG
SQL> select * from user_role_privs;
USERNAME GRANTED_ROLE ADM DEF OS_
------------------------------ ------------------------------ --- --- ---
INSA MGR NO NO NO
INSA PROG NO YES NO
SQL> select * from role_sys_privs;
ROLE PRIVILEGE ADM
--------------- -------------------- ---
MGR SELECT ANY TABLE NO
PROG CREATE TRIGGER NO
PROG CREATE VIEW NO
PROG CREATE PROCEDURE NO
alter user insa default role none;
select * from dba_role_privs where grantee='INSA';
select * from session_roles;
select * from user_role_privs;
select * from role_sys_privs;
select * from role_tab_privs;
insa의 prog 롤만 제외하고 활성화
alter user insa default role all except prog;
select * from dba_role_privs where grantee='INSA';
insa의 롤 전부 활성화
alter user insa default role all;
뷰만들기
SQL> create view emp_view
as select * from hr.employees; 2
View created.
SQL> set long 200
SQL> select text from user_views where view_name = 'EMP_VIEW';
롤 권한회수
revoke mgr from insa;
select * from dba_role_privs where grantee='INSA';
롤 삭제
drop role mgr;
롤 생성 (패스워드 알고있는 사람만 사용하게)
create role mgr identified by oracle;
권한부여
grant select any table to mgr;
select * from dba_sys_privs where grantee= 'MGR';
grant mgr to insa;
select * from dba_role_privs where grantee= 'INSA';
SQL> conn insa/oracle
Connected.
SQL> select * from session_roles;
ROLE
---------------
PROG
부여받은 롤 확인하기 (패스워드 있는것도 보인다.)
SQL> select * from user_role_privs;
USERNAME GRANTED_ROLE ADM DEF OS_
------------------------------ ------------------------------ --- --- ---
INSA MGR NO NO NO
INSA PROG NO YES NO
- set 명령어를 이용해서 role 활성화
SQL> set role mgr;
set role mgr
*
ERROR at line 1:
ORA-01979: missing or invalid password for role 'MGR'
SQL> set role mgr identified by oracle;
Role set.
set으로 mgr롤만 활성화했으므로, prog롤은 비활성화 되었다.
SQL> select * from session_roles;
ROLE
---------------
MGR
SQL> select * from user_role_privs;
USERNAME GRANTED_ROLE ADM DEF OS_
------------------------------ ------------------------------ --- --- ---
INSA MGR NO NO NO
INSA PROG NO YES NO
패스워드 갇고있는 롤도 있으므로 all로 안된다.
SQL> set role all;
set role all
*
ERROR at line 1:
ORA-01979: missing or invalid password for role 'MGR'
- 따라서 패스워드있는것은 하나씩 set role 해줘야한다.
SQL> set role prog, mgr identified by oracle;
Role set.
SQL> select * from session_roles;
ROLE
---------------
MGR
PROG
SQL> select * from user_role_privs;
USERNAME GRANTED_ROLE ADM DEF OS_
------------------------------ ------------------------------ --- --- ---
INSA MGR NO NO NO
INSA PROG NO YES NO
자신이 받은 롤 전부 비활성화
SQL> set role none;
Role set.
SQL> select * from session_roles;
no rows selected
SQL> select * from user_role_privs;
USERNAME GRANTED_ROLE ADM DEF OS_
------------------------------ ------------------------------ --- --- ---
INSA MGR NO NO NO
INSA PROG NO YES NO
mgr제외 롤 활성화
SQL> set role all except mgr;
Role set.
mgr 비밀번호 삭제
alter role mgr not identified;
SQL> conn insa/oracle
Connected.
SQL> select * from session_roles;
ROLE
---------------
PROG
MGR
SQL> select * from user_role_privs;
USERNAME GRANTED_ROLE ADM DEF OS_
------------------------------ ------------------------------ --- --- ---
INSA MGR NO YES NO
INSA PROG NO YES NO
SQL> set role none;
Role set.
SQL> select * from session_roles;
no rows selected
SQL> set role all;
Role set.
SQL> select * from session_roles;
ROLE
---------------
PROG
MGR
Definer's right (만든 사람입장에서 프로그램 수행할꺼냐?)
Invoker's right (호출자 입장에서 프로그램 수행할꺼냐?)
green 유저생성, 롤 권한 부여
create user green identified by oracle;
grant connect, resource to green;
drop table hr.emp purge; -- drop any table 시스템권한이 있기때문에가능
create table hr.emp
as
select employee_id, last_name, salary
from hr.employees
where 1 = 2;
create table green.emp
as
select employee_id, last_name, salary
from hr.employees
where 1 = 2;
Definer's right
CREATE OR REPLACE PROCEDURE insert_emp1(
p_id in emp.employee_id%type,
p_name in emp.last_name%type,
p_sal in emp.salary%type
)
is
begin
insert into emp(employee_id, last_name, salary)
values(p_id,p_name,p_sal);
commit;
end;
/
SQL> show error
No errors.
Invoker's right
CREATE OR REPLACE PROCEDURE insert_emp2(
p_id in emp.employee_id%type,
p_name in emp.last_name%type,
p_sal in emp.salary%type
)
authid current_user -- 이것을쓰면 Invoker's right (호출자 입장에서 실행)
is
begin
insert into emp(employee_id, last_name, salary)
values(p_id,p_name,p_sal);
commit;
end;
/
SQL> select * from user_source where name = 'INSERT_EMP1';
SQL> select * from user_source where name = 'INSERT_EMP2';
green에게 프로시저 실행권한 주기
grant execute on insert_emp1 to green;
grant execute on insert_emp2 to green;
select * from user_tab_privs;
SQL> select * from user_tab_privs;
무조건 보고 수행하자
(어떤 object인지, 형식인지)
SQL> desc hr.insert_emp1
PROCEDURE hr.insert_emp1
Argument Name Type In/Out Default?
------------------------------ ----------------------- ------ --------
P_ID NUMBER(6) IN
P_NAME VARCHAR2(25) IN
P_SAL NUMBER(8,2) IN
SQL> desc hr.insert_emp2
PROCEDURE hr.insert_emp2
Argument Name Type In/Out Default?
------------------------------ ----------------------- ------ --------
P_ID NUMBER(6) IN
P_NAME VARCHAR2(25) IN
P_SAL NUMBER(8,2) IN
- definer's right
: 만든사람 입장에서 프로시저가 실행하니깐
hr의 emp 테이블에 insert 된다.execute hr.insert_emp1(7777,'test1',5000)
- invoker's right
: 호출자 입장에서 프로시저가 실행되니깐
green세션에서 실행하므로 green의 emp 테이블에 insert된다.execute hr.insert_emp2(8888,'test2',6000)
select to_char(sysdate,'yyyy/mm/dd hh24:mi:ss') from dual;
[oracle@oracle ~]$ timedatectl
Local time: Wed 2023-12-20 08:45:48 EST
Universal time: Wed 2023-12-20 13:45:48 UTC
RTC time: Wed 2023-12-20 13:45:47
Time zone: America/New_York (EST, -0500)
NTP enabled: no
NTP synchronized: no
RTC in local TZ: no
DST active: no
Last DST change: DST ended at
Sun 2023-11-05 01:59:59 EDT
Sun 2023-11-05 01:00:00 EST
Next DST change: DST begins (the clock jumps one hour forward) at
Sun 2024-03-10 01:59:59 EST
Sun 2024-03-10 03:00:00 EDT
타임존 지역바꾸기
[oracle@oracle ~]$ timedatectl set-timezone 'Asia/Seoul'
==== AUTHENTICATING FOR org.freedesktop.timedate1.set-timezone ===
Authentication is required to set the system timezone.
Authenticating as: root
Password:
==== AUTHENTICATION COMPLETE ===
[oracle@oracle ~]$ timedatectl
timedatectl
Local time: Wed 2023-12-20 22:47:26 KST
Universal time: Wed 2023-12-20 13:47:26 UTC
RTC time: Wed 2023-12-20 13:47:26
Time zone: Asia/Seoul (KST, +0900)
NTP enabled: no
NTP synchronized: no
RTC in local TZ: no
DST active: n/a
- application role
CREATE OR REPLACE PROCEDURE priv_mgr
AUTHID CURRENT_USER
IS
BEGIN
IF to_char(sysdate,'hh24:mi') between '23:00' AND '23:30' THEN
DBMS_SESSION.SET_ROLE('sec_app_role');
END IF;
END;
/
프로시저 이용해서 application 롤 만들기
create role sec_app_role identified using priv_mgr;
롤한테 select any dictionary 권한부여
grant select any dictionary to sec_app_role;
insa유저한테 프로시저 실행할 권한부여
grant execute on priv_mgr to insa;
SQL> select * from session_roles;
ROLE
------------------------------
PROG
MGR
SQL> execute sys.priv_mgr
PL/SQL procedure successfully completed.
SQL> select * from session_roles;
ROLE
------------------------------
SEC_APP_ROLE
SQL> select * from sys.tab$;
시간만 바꿧다 if절에 적용안되게
CREATE OR REPLACE PROCEDURE priv_mgr
AUTHID CURRENT_USER
IS
BEGIN
IF to_char(sysdate,'hh24:mi') between '23:00' AND '23:10' THEN
DBMS_SESSION.SET_ROLE('sec_app_role');
ELSE
DBMS_SESSION.SET_ROLE('NONE');
END IF;
END;
/
SQL> conn insa/oracle
Connected.
SQL> execute sys.priv_mgr
PL/SQL procedure successfully completed.
SQL> select * from session_roles;
ROLE
------------------------------
PROG
MGR
SQL> select from sys.tab$;
select from sys.tab$
ERROR at line 1:
ORA-00942: table or view does not exist
서버에 연결하여 해당 서버의 시간 정보를 가져와서 시스템의 현재 시간을 업데이트합니다 (햔재 날짜 시간 정보 수정)
[root@oracle ~]# rdate -s time.bora.net
[root@oracle ~]# date
Thu Dec 21 15:34:28 KST 2023
: 리소스 소비를 제어하고 계정 암호 상태 및 암호 만료 관리
select username, profile from dba_users;
select * from dba_profiles where profile = 'DEFAULT';
- FAILED_LOGIN_ATTEMPTS : 암호 오류 허용 횟수
- PASSWORD_LOCK_TIME : 암호 오류 허용 횟수를 넘었다면 자동으로 계정이 잠김(일수) (일반적으로 UNLIMITED)
- PASSWORD_LIFE_TIME : 암호 유효 기간(일수)
- PASSWORD_GRACE_TIME : 암호 만료 이후 암호 변경까지 유예기간(일수), 넘어가면 (EXPIRED & LOCKED)
- PASSWORD_REUSE_TIME : 주어진 일 수 동안 암호를 재사용할 수 없도록 지정(일수)
- PASSWORD_REUSE_MAX : 현재 암호를 재사용하기 위해 필요한 암호 변경횟수를 지정
ex) and 개념이다. 무조건 둘다 설정해야한다.
이전 암호를 재사용할려면 30일 이후에 암호를 1번을 바꾸면 재사용할 수 있다.PASSWORD_REUSE_TIME 30 PASSWORD_REUSE_MAX 1
ex) 이전 암호는 무한으로 재사용할 수 있다.(보안상 안좋다.)
PASSWORD_REUSE_TIME UNLIMITED PASSWORD_REUSE_MAX UNLIMITED
- PASSWORD_VERIFY_FUNCTION : 암호의 복합성 검사, 함수로 구현해야한다.
$ORACLE_HOME/rdbms/admin/utlpwdmg.sql
을 이용해서 변경이 가능하다./:
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
2023/12/22
- sql 파일 실행
: @ sql파일명
SQL> @ $ORACLE_HOME/rdbms/admin/utlpwdmg.sql
Function created.
Grant succeeded.
Profile altered.
Function created.
Grant succeeded.
- FAILED_LOGIN_ATTEMPTS : 암호 오류 허용 횟수
- PASSWORD_LOCK_TIME : 암호 오류 허용 횟수를 넘었다면 자동으로 계정이 잠김(일수) (일반적으로 UNLIMITED)
CREATE PROFILE insa_profile LIMIT
FAILED_LOGIN_ATTEMPTS 3
PASSWORD_LOCK_TIME UNLIMITED;
SELECT * FROM dba_profiles where profile='INSA_PROFILE';
ALTER USER insa PROFILE insa_profile;
select username, profile from dba_users;
SQL> conn insa/oracle
ERROR:
ORA-28000: the account is locked
select username, account_status,
to_char(lock_date,'yyyy/mm/dd hh24:mi:ss') from dba_users;
- 락 해제
ALTER USER insa ACCOUNT UNLOCK;
- 락 설정
ALTER USER insa ACCOUNT LOCK;
- 프로파일 변경
ALTER PROFILE insa_profile LIMIT FAILED_LOGIN_ATTEMPTS 2 PASSWORD_LOCK_TIME 1/1440;
- 프로파일 삭제
- CASECASE: 기존 DEFAULT로 바꿔준다.
DROP PROFILE insa_profile CASCADE;
- PASSWORD_LIFE_TIME : 암호 유효 기간(일수)
- PASSWORD_GRACE_TIME : 암호 만료 이후 암호 변경까지 유예기간(일수), 넘어가면 (EXPIRED & LOCKED)
CREATE PROFILE insa_profile LIMIT
PASSWORD_LIFE_TIME 2/1440
PASSWORD_GRACE_TIME 1/1440;
ALTER USER insa PROFILE insa_profile;
SELECT * FROM dba_profiles where profile='INSA_PROFILE';
select username, profile from dba_users;
select username, account_status,
to_char(expiry_date,'yyyy/mm/dd hh24:mi:ss')
from dba_users
where username= 'INSA';
SQL> conn insa/oracle
ERROR:
ORA-28002: the password will expire within 0 days
SQL> conn insa/oracle
ERROR:
ORA-28001: the password has expired
Changing password for insa
New password:
Retype new password:
ERROR:
ORA-28003: password verification for the specified password failed
ORA-20001: Password length less than 8
Password unchanged
Warning: You are no longer connected to ORACLE.
▶ DEFUALT 프로파일 변경
ALTER PROFILE insa_profile LIMIT
PASSWORD_LIFE_TIME 180
PASSWORD_GRACE_TIME 7
PASSWORD_REUSE_TIME UNLIMITED
PASSWORD_REUSE_MAX UNLIMITED
FAILED_LOGIN_ATTEMPTS 10
PASSWORD_LOCK_TIME UNLIMITED
PASSWORD_VERIFY_FUNCTION NULL;
SELECT * FROM dba_profiles where profile='INSA_PROFILE';
ALTER USER insa identified by oracle;
- PASSWORD_REUSE_TIME : 주어진 일 수 동안 암호를 재사용할 수 없도록 지정(일수)
- PASSWORD_REUSE_MAX : 현재 암호를 재사용하기 위해 필요한 암호 변경횟수를 지정
ALTER PROFILE insa_profile LIMIT
PASSWORD_REUSE_TIME 2/1440
PASSWORD_REUSE_MAX 1;
SELECT * FROM dba_profiles where profile='INSA_PROFILE';
ALTER USER insa identified by oracle;
ALTER USER insa identified by oracle;
ORA-28007: 비밀번호를 재사용될 수 없습니다
ALTER USER insa identified by oracle1;
나중에 회사에 패스워드 적용시킬려면
$ORACLE_HOME/rdbms/admin/utlpwdmg.sql 안에 넣어줘야하거나 추가할것, 변경할것 해주고 default 프로파일 변경해주면 된다.ALTER PROFILE insa_profile LIMIT PASSWORD_VERIFY_FUNCTION verify_function_itwill;
SELECT * FROM dba_profiles where profile = 'DEFAULT';
SESSIONS_PER_USER
IDLE_TIME
CONNECT_TIME
LOGICAL_READS_PER_CALL
LOGICAL_READS_PER_SESSION
CPU_PER_CALL
CPU_PER_SESSION
COMPOSITE_LIMIT
PRIVATE_SGA
거의 이것만 사용한다.
- SESSIONS_PER_USER
: 동일한 유저로 허용되는 동시 세션 수- IDLE_TIME
: 분 단위로 측정한 비활성 시간 (5분이면, 5분동안 작업을 안하면 kill)
alter profile insa_profile LIMIT
IDLE_TIME 1;
SELECT * FROM dba_profiles where profile='INSA_PROFILE';
select * from v$parameter where name = 'resource_limit';
SQL>show parameter resource_limit
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
resource_limit boolean FALSE
alter system set resource_limit = true;
SQL> show parameter resource_limit
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
resource_limit boolean TRUE
select * from v$parameter where name = 'resource_limit';
alter profile insa_profile LIMIT
IDLE_TIME 1
CONNECT_TIME 1
SESSIONS_PER_USER 1;
SQL> conn sys/oracle
ERROR:
ORA-02002: error while writing to audit trail
ORA-00604: error occurred at recursive SQL level 1
ORA-02399: exceeded maximum connect time, you are being logged off
[oracle@oracle ~]$ sqlplus insa/oracle
SQL*Plus: Release 11.2.0.4.0 Production on Fri Dec 22 14:48:45 2023
Copyright (c) 1982, 2013, Oracle. All rights reserved.
ERROR:
ORA-02391: exceeded simultaneous SESSIONS_PER_USER limit
: sysdba 롤을 받은 사용자에 대한 인증 체크
[sys session]
GRANT SYSDBA TO insa;
[insa session]
겉은 insa 유저이지만 속은 dba롤 이다
select * from dba_users;
select * from user_users;
[oracle@oracle db_1]$ cd $ORACLE_HOME/dbs
[oracle@oracle dbs]$ ls
hc_ora11g.dat initora11g.ora orapwora11g spfileora11g.ora
init.ora lkORA11G spfileora11g_20231208.bak spfileora11g.ora.bak
[oracle@oracle dbs]$ rm orapwora11g
client 에서 sysdba로 접속할려면 orapwora11g 인 패스워드 파일이 무조건 필요하다.
- ora 패스워드 파일 생성
show parameter instance_name
이용하여 SID를 확인한다음
orapwd $ORACLE_HOME/dbs/orapw<SID>
password =패스워드[oracle@oracle ~]$ orapwd file=$ORACLE_HOME/dbs/orapwora11g password=admin -- password=admin : sys 계정의 비밀번호 -- 11g 부터 패스워드 대소문자 구분한다.
- password file 을 다시 만들면 sys 계정은 내부적으로 들어가있지만 다른유저의 dba롤은 다시 권한을 부여해줘야한다.
GRANT SYSDBA TO insa;
★ 하지만 여기서 주의할 사항은 sys 계정의 패스워드는 admin 이지만
sysdba롤 권한을 받은 insa는 insa의 원래 패스워드를 사용해야한다.
[oracle@oracle ~]$ sqlplus / as sysdba
일반적으로 sys 계정으로 들어가지않고
sysdba롤을 받은 계정으로 들어간다.
password file로 인증 체크해서 접속한 유저 정보
select * from v$pwfile_users;
SQL> show parameter remote_login_passwordfile
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
remote_login_passwordfile string EXCLUSIVE
alter system set remote_login_passwordfile=exclusive scope=spfile;
SQL> show parameter sec_case_sensitive_logon
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
sec_case_sensitive_logon boolean TRUE
select * from v$parameter where name='sec_case_sensitive_logon';
alter system set sec_case_sensitive_logon = false;
- 패스워드 admin이 아닌 대소문자 구분해서 ADMIN은 안된다.
[oracle@oracle ~]$ orapwd file=$ORACLE_HOME/dbs/orapwora11g password=admin ignorecase=n
- 패스워드 대소문자 구분하지 않겠다.
ignorecase=y