문제/Linux

231226 Linux 복습 겸 문제

잇꼬 2023. 12. 26. 17:55
728x90
반응형
SMALL

1. tablespace 생성하세요.
  tablespace 이름  : oltp_tbs
  datafile 위치 및 이름  : /u01/app/oracle/oradata/ora11g/oltp_tbs01.dbf
  datafile 사이즈  : 10m
  datafile 자동 확장 활성화
  extent 관리 : local uniform size 1m
  segment space management: auto

 

1) tablespace 있는지 확인

SELECT * FROM dba_tablespaces WHERE tablespace_name = 'OLTP_TBS';
SELECT * FROM dba_data_files WHERE tablespace_name = 'OLTP_TBS';

 

2) 있다면, 해당되는 tablespace 삭제

DROP TABLESPACE oltp_tbs INCLUDING CONTENTS AND DATAFILES;

3) tablespace 생성

CREATE TABLESPACE oltp_tbs
DATAFILE '/u01/app/oracle/oradata/ora11g/oltp_tbs01.dbf' SIZE 10M AUTOEXTEND ON
EXTENT MANAGEMENT LOCAL UNIFORM SIZE 1m
SEGMENT SPACE MANAGEMENT AUTO;

4) 생성확인

SELECT * FROM dba_tablespaces WHERE tablespace_name = 'OLTP_TBS';
SELECT * FROM dba_data_files WHERE tablespace_name = 'OLTP_TBS';


2. user 생성하세요.
  user 이름 : sawon01
  user 비밀번호 : oracle
  default tablespace : oltp_tbs
  temporary tablespace : temp
  default tablespace quota : unlimited

  user 생성하세요.
  user 이름 : sawon02
  user 비밀번호 : oracle
  default tablespace : oltp_tbs
  temporary tablespace : temp
  default tablespace quota : 10m

1) user 생성

create user sawon01
identified by oracle
DEFAULT TABLESPACE oltp_tbs
TEMPORARY TABLESPACE temp
QUOTA unlimited on oltp_tbs;

create user sawon02
identified by oracle
DEFAULT TABLESPACE oltp_tbs
TEMPORARY TABLESPACE temp
QUOTA 10m on oltp_tbs;


2) 생성된 user 확인

SELECT * FROM dba_users where in ('SAWON01', 'SAWON02');
SELECT * FROM dba_ts_quotas where in ('SAWON01', 'SAWON02');


3. SAWON_ROLE 을 생성한 후 SAWON_ROLE에  권한 부여하세요.
   시스템 권한 : create session, create table, create view, create sequence, create procedure
   객체 권한   : hr.employees에 대한 select, insert, update, delete
                hr.departments에 대한 select, insert, update, delete

1) 해당 ROLE 이 있는지 확인. 있다면, DROP 하기

SELECT * FROM dba_roles WHERE role = 'SAWON_ROLE';
DROP ROLE sawon_role;


2) SAWON_ROLE 생성

create role SAWON_ROLE;

 

#1) 시스템 권한

GRANT create session, create table, create view, create sequence, create procedure TO sawon_role;
select * from dba_sys_privs where grantee = 'SAWON_ROLE';

#2) 객체권한

GRANT select, insert, update, delete ON hr.employees TO sawon_role;
grant select on HR.departments to sawon_role;


#3) ROLE 확인

select * from dba_tab_privs where grantee = 'SAWON_ROLE';
select * from dba_role_privs where granted_role = 'SAWON_ROLE';
select * from role_sys_privs where role = 'SAWON_ROLE';
select * from role_tab_privs where role = 'SAWON_ROLE';



4. sawon01, sawon02 유저에게 sawon_role 부여하세요.

#1) 권한 부여

GRANT sawon_role TO sawon01, sawon02;

#2) 부여된 권한 확인

SELECT * FROM dba_role_privs WHERE granted_role = 'SAWON_ROLE';



5. sawon01, sawon02 접속해서  시스템 권한 , 객체 권한 확인
<sawon01 session>

SELECT * FROM session_privs;
SELECT * FROM user_sys_privs;
SELECT * FROM user_tab_privs;
SELECT * FROM session_roles;
SELECT * FROM role_sys_privs;
SELECT * FROM role_tab_privs;
SELECT * FROM user_role_privs;


<sawon02 session>

SELECT * FROM session_privs;
SELECT * FROM user_sys_privs;
SELECT * FROM user_tab_privs;
SELECT * FROM session_roles;
SELECT * FROM role_sys_privs;
SELECT * FROM role_tab_privs;
SELECT * FROM user_role_privs;

 

테이블 해석
SELECT * FROM session_privs; 현재 session 에 부여된 시스템 권한.
SELECT * FROM user_sys_privs; 현재 사용자에게 부여된 시스템 권한.
SELECT * FROM user_tab_privs; 현재 사용자에게 부여된 테이블과 뷰에 대한 객체 권한.
SELECT * FROM session_roles; 현재 session 에 활성화된 역할(관련된 권한을 가진 이름)을 표시.
SELECT * FROM role_sys_privs; 역할에게 부여된 시스템 권한
SELECT * FROM role_tab_privs; 테이블과 뷰에 대한 역할에게 부여된 객체 권한
SELECT * FROM user_role_privs; 현재 사용자에게 부여된 역할


6. sawon01 유저는 사원 정보를 저장하기 위한 테이블을 생성 합니다.

#) 테이블 생성

테이블이름 테이블 저장되는
테이블 스페이스
컬럼 제약조건
dept oltp_tbs dept_id number(3)
dept_name varchar2(30)
dept_id 컬럼 : primary key
제약조건 이름 : dept_dept_id_pk

#) 테이블 생성

테이블 이름 테이블 저장되는 
테이블 스페이스
컬럼  제약 조건
emp oltp_tbs emp_id number(3)
name varchar2(30)
sal number(10)
day date
dept_id number(3)
emp_id 컬럼 : primary key, 제약조건 이름 : emp_emp_id_pk
dept_id 컬럼 : foreign key, 제약조건 이름 : emp_dept_id_fk, 참조 : dept테이블에 dept_id


 #1) sawon01의 dept 테이블이 있다면, 삭제

DROP TABLE sawon02.dept CASCADE CONSTRAINTS PURGE;


#2) dept  table 생성

CREATE TABLE sawon01.dept 
( dept_id NUMBER(3) CONSTRAINT dept_dept_id_pk PRIMARY KEY,
  dept_name VARCHAR2(30) )
TABLESPACE oltp_tbs;

 

#3) emp 테이블 있다면, 삭제

DROP TABLE sawon01.emp CASCASE CONSTRAINTS PURGE;

 

#4) emp table 생성

CREATE TABLE sawon01.emp 
( emp_id number(3) CONSTRAINT emp_emp_id_pk PRIMARY KEY,
  name varchar2(30) , 
  sal number(10) ,
  day date, 
  dept_id number(3) CONSTRAINT emp_dept_id_fk REFERENCES sawon01.dept(dept_id) )
TABLESPACE oltp_tbs;


7. hr.departments 테이블에 있는 department_id, department_name 컬럼들의 모든 데이터를 sawon01.dept 테이블로 데이터 로드한 후 영구히 저장하세요.(데이터이관작업)

1) INSERT 문 실행 후 COMMIT(저장), 확인

INSERT INTO sawon01.dept (dept_id, dept_name) 
SELECT department_id, department_name FROM hr.departments;

COMMIT;

SELECT * FROM sawon01.dept;


8. hr.employees 테이블에 있는 employee_id, last_name, salary, hire_date, department_id 컬럼들의 모든 데이터를 sawon01.emp 테이블로 로드한 후 영구히 저장하세요.

1) INSERT 문 실행 후 COMMIT(저장), 확인 

INSERT INTO sawon01.emp (emp_id, name, sal, day, dept_id) 
SELECT employee_id, last_name, salary, hire_date, department_id FROM hr.employees;

COMMIT;

SELECT * FROM sawon01.emp;



9. sawon01.dept 테이블에 소속 사원이 있는 부서 정보만 출력 하세요.

SELECT *
FROM sawon01.dept d
WHERE EXISTS (
    SELECT 1
    FROM sawon01.emp e
    WHERE e.dept_id = d.dept_id
);


10. sawon01.dept 테이블에 소속 사원이 없는 부서 정보만 출력하세요.

SELECT d.dept_id, d.dept_name
FROM sawon01.dept d
WHERE NOTEXISTS (
    SELECT 1
    FROM sawon01.emp e
    WHERE e.dept_id = d.dept_id
);


11. sawon01 session을 통해서 사원들의 사원 번호, 사원 이름, 급여, 부서 이름을 출력하세요.

SELECT e.emp_id, e.name, e.sal, d.dept_name
FROM sawon01.emp e = sawon01.dept d 
WHERE e.dept_id = d.dept_id;



12. sawon01을 통해서 부서이름별로 부서의 총액 급여, 평균급여를 보는 뷰(dept_agg_view)를 생성하세요.

CREATE VIEW dept_agg_view 
AS
SELECT d.dept_id, agg.total_salary, agg.avg_salary
FROM ( SELECT dept_id, SUM(sal) AS total_salary, ROUND(AVG(sal), 2) AS avg_salary
       FROM sawon01.emp
       GROUP BY dept_id ) agg
JOIN sawon01.dept d ON agg.dept_id = d.dept_id;



13. 생성한 뷰의 정보를 확인하세요.

SELECT * FROM sawon01.dept_agg_view;



14. sawon01(계정) 사원번호를 입력 값으로 받아서 그 사원의 이름, 급여, 부서 이름을 출력하는 프로시저를 생성하세요. 
    만약에 없는 사원 번호 값이 들어 오면 "The sawon does not exist."라고 처리해 주세요.
    프로시저 이름은 emp_proc
#) 실행해보기

set serveroutput on

execute emp_proc(100)
--출력화면) 
NAME : King, SAL : 24000, DEPT_NAME: Executive

execute emp_proc(500)
-- 출력화면)  
The sawon does not exist.
CREATE OR REPLACE PROCEDURE emp_proc(p_emp_id NUMBER) 
AS
  v_emp_name emp.name%type;
  v_salary emp.sal%type;
  v_dept_name dept.dept_name%type;
BEGIN
  -- 사원 정보 조회
  SELECT e.name, e.sal, d.dept_name
  INTO v_emp_name, v_salary, v_dept_name
  FROM emp e
  JOIN dept d ON e.dept_id = d.dept_id
  WHERE e.emp_id = p_emp_id;

  -- 조회된 정보 출력
  DBMS_OUTPUT.PUT_LINE('NAME: ' || v_emp_name || ', SAL: ' || v_salary || ', DEPT_NAME: ' || v_dept_name);
EXCEPTION
  -- 예외 처리: 사원이 존재하지 않는 경우
  WHEN NO_DATA_FOUND THEN
    DBMS_OUTPUT.PUT_LINE('The sawon does not exist.');
  WHEN others THEN
    DBMS_OUTPUT.PUT_LINE(sqlerrm);
END emp_proc;
/


15. emp_proc 소스를 확인하세요.

SELECT text FROM user_source WHERE NAME = 'EMP_PROC' ORDER BY LINE;


16.  emp_proc 프로시저에 대한 execute 권한을 sawon02에게 부여 해주세요

GRANT EXECUTE ON sawon01.emp_proc TO sawon02;

SELECT * FROM user_tab_privs;



17. sawon02 유저는 emp_proc 프로시저에 대한 객체 권한을 확인 한 후 실행해 보세요.

SELECT * FROM user_tab_privs;
DESC sawon01.emp_prog

#) 실행해보기

set serveroutput on

execute emp_proc(100)
NAME : King, SAL : 24000, DEPT_NAME: Executive

execute emp_proc(500)
The sawon does not exist.



18. sawon01 유저는 sawon02 유저에게 부여한 emp_proc 프로시저에 대한 객체 권한을 취소해주세요.

REVOKE EXECUTE ON sawon01.emp_proc TO sawon02;



19. sawon_profile 를 생성하세요.

패스워드 3번 실패하면 계정 잠금 
패스워드 주기는 30일 
패스워드 주기 유예 기간 5일 
이전 패스워드를 재 사용하려면 30일 이후에 최소한 한번은 바꿔야 한다.
패스워드에 복잡성 체크 verify_function_11g 설정
접속한 후 10분 동안 아무작업을 수행하지 않으면 자동으로 kill

 

#1) 확인

SELECT * FROM dba_object WHERE object_name = 'verify_function_11g';
SELECT text FROM dba_source WHERE name ='verify_function_11g' ORDER BY LINE;


#2) 생성

CREATE PROFILE sawon_profile LIMIT
  FAILED_LOGIN_ATTEMPTS 3
  PASSWORD_LOCK_TIME unlimited
  PASSWORD_LIFE_TIME 30
  PASSWORD_GRACE_TIME 5  
  PASSWORD_REUSE_TIME 30
  PASSWORD_REUSE_MAX 1
  IDLE_TIME 10
  PASSWORD_VERIFY_FUNCTION verify_function_11g;

ALTER SYSTEM SET resource_limit = true;


20. 프로파일 확인하세요.

SELECT * FROM dba_profiles WHERE profile = 'sawon_profile';


21. sawon_profile을 수정하세요.

(문제 19번에 맞춰서 수정하세요.)

접속한후 5동안 아무작업을 수행하지 않으면 자동으로 kill 
동일한 유저이름으로 2명만 접속할수 있게 설정


#) 변경

ALTER PROFILE sawon_profile LIMIT
  IDLE_TIME 5
  SESSIONS_PER_USER 2;
SELECT * FROM dba_profiles WHERE profile = 'sawon_profile';



22. sawon_profile을 sawon01, sawon02 유저에게 설정하세요.

ALTER USER sawon01 PROFILE sawon_profile;
ALTER USER sawon02 PROFILE sawon_profile;

#) 확인

SELECT profile FROM dba_users WHERE user IN ('SAWON01', 'SAWON02');


23. sawon_profile을 삭제한 후 sawon01, sawon02 유저의 프로파일을 확인 하세요.

DROP PROFILE sawon_profile cascade;

#) 확인

SELECT profile FROM dba_users WHERE user IN ('SAWON01', 'SAWON02');

 

728x90
반응형
LIST

'문제 > Linux' 카테고리의 다른 글

240104 Oracle DB Linux 문제  (1) 2024.01.04
231228 Linux 복습 겸 문제  (0) 2023.12.28
231218 Linux 문제 겸 test  (0) 2023.12.18
231206 Linux 문제 ⓓ 누적합  (1) 2023.12.06
231206 Linux 문제 ⓒ 제외하고 출력  (1) 2023.12.06