국비학원/공부

12일차 oracle(5)

mikan- 2023. 5. 8. 23:02

Q 102.
rollback 실습

SQL>UPDATE b_dept2 SET dname = 'TEST', loc = 'SUWON'
WHERE deptno = 50;

SQL> SELECT * FROM b_dept2;

    DEPTNO DNAME          LOC
---------- -------------- -------------
        10 ACCOUNTING     NEW YORK
        20 RESEARCH       DALLAS
        30 SALES          CHICAGO
        40 OPERATIONS     BOSTON
        50 TEST           SUWON

SQL> ROLLBACK;
롤백이 완료되었습니다.

SQL> SELECT * FROM b_dept2;
    DEPTNO DNAME          LOC
---------- -------------- -------------
        10 ACCOUNTING     NEW YORK
        20 RESEARCH       DALLAS
        30 SALES          CHICAGO
        40 OPERATIONS     BOSTON
        50 SUPPORT        GWANGJU


Q 103.
시나리오 트랜잭션 =>ppt에서 또 다른 실습?(Q&A)

 select ->해당 사항X
----------------------------------------
  insert
  ------------->savepoint 별칭(A)
  update
  ------------>savepoint 별칭(B)
  delete

  rollback->insert,update,delete 전부 복구
  rollback to 별칭A ->update,delete 복구
  rollback to 별칭B ->delete만 복구
-----------------------------------------------
SQL>insert into b_dept2 values(60, 'TESTING', 'SEOUL');
1 개의 행이 만들어졌습니다.

SQL>SELECT * FROM b_dept2;
    DEPTNO DNAME          LOC
---------- -------------- -------------
        10 ACCOUNTING     NEW YORK
        20 RESEARCH       DALLAS
        30 SALES          CHICAGO
        40 OPERATIONS     BOSTON
        50 SUPPORT        GWANGJU
        60 TESTING        SEOUL
6 개의 행이 선택되었습니다.

형식)savepoint 별칭명;//책갈피
SQL>savepoint A;

SQL> UPDATE b_dept2 set dname = 'IMSI', loc = 'BUSAN' WHERE deptno = 50;
1 행이 갱신되었습니다.

SQL>savepoint B;
저장점이 생성되었습니다.

SQL>select * from b_dept2

    DEPTNO DNAME          LOC
---------- -------------- -------------
        10 ACCOUNTING     NEW YORK
        20 RESEARCH       DALLAS
        30 SALES          CHICAGO
        40 OPERATIONS     BOSTON
        50 IMSI           BUSAN =>수정됨을 확인
        60 TESTING        SEOUL

SQL> DELETE FROM b_dept2 WHERE deptno = 40;
1 행이 삭제되었습니다.

SQL>select * from b_dept2

    DEPTNO DNAME          LOC
---------- -------------- -------------
        10 ACCOUNTING     NEW YORK
        20 RESEARCH       DALLAS
        30 SALES          CHICAGO
        50 IMSI           BUSAN
        60 TESTING        SEOUL

  rollback->insert,update,delete 전부 복구
  rollback to 별칭A ->update,delete 복구
  rollback to 별칭B ->delete만 복구

SQL> rollback to B;
롤백이 완료되었습니다.
    DEPTNO DNAME          LOC
---------- -------------- -------------
        10 ACCOUNTING     NEW YORK
        20 RESEARCH       DALLAS
        30 SALES          CHICAGO
        40 OPERATIONS     BOSTON -> 삭제된거 다시 복구됨
        50 IMSI           BUSAN
        60 TESTING        SEOUL

SQL>rollback to A;
롤백이 완료되었습니다.

SQL> select * from b_dept2;
    DEPTNO DNAME          LOC
---------- -------------- -------------
        10 ACCOUNTING     NEW YORK
        20 RESEARCH       DALLAS
        30 SALES          CHICAGO
        40 OPERATIONS     BOSTON
        50 SUPPORT        KWANGJU =>바꾼거 다시 복구됨
        60 TESTING        SEOUL

SQL>SHOW AUTOCOMMIT -> 현재 commit이 자동으로 실행되는지 안되는지를 확인시켜주는 환경변수명
autocommit OFF

DB관리 = 백업관리가 중요


Q 104.
ppt로 시나리오 실습 2가지 체크해서 정리
---------------------------------------------------------------
테이블,트랜잭션=>**시컨스,** 동의어(Synonym)=>사용권한**
---------------------------------------------------------------
                              pk
시컨스(sequence)=>특정필드에 연결시켜서 데이터를 입력할때
                                                       =========insert into 할때
                            자동적으로 지정한 번호를 넣어주는 역할을 하는 오라클 객체
                         =>중복이 되면 안되는 필드(=>primary key에 해당하는 필드)
                             
                           <->rownum(화면에 출력할때 레코드 앞에 번호를 부여(구분하기위해서))

               dept->deptno 10,20,30,40,50,60,70,80(중복X 유일한값)=>자동

형식)
CREATE SEQUENCE sequence_name (시컨스이름=>테이블명_필드명)
[START WITH n] ① ->시작번호 (10)
[INCREMENT BY n] ② ->증가치 (2)  10,12,14,16,18,20,,,,
[{MAXVALUE n | NOMAXVALUE}] ③  최대값 | NOMAXVALUE(무제한)
[{MINVALUE n | NOMINVALUE}] ④  최소값  | 최소값 설정
[{CYCLE | NOCYCLE}] ⑤ 순환유무(최대값->다시 처음부터 시작~)
[{CACHE n | NOCACHE}] ⑥  메모리 저장 유무

ex)CREATE SEQUENCE sequence_name; //1,2,3,4,5,,,,,
                                                            10 20 30 
                                                            100
SQL> create sequence b_emp5_empno;  //1,2,3,4,,,
시퀀스가 생성되었습니다.

***********시컨스 속성 2가지*****************************************************************************************
            시컨스명.속성명(currval or nextval)

1.currval:현재값을 반환(현재 설정된값을 확인)->nextval를 통해서 저장된 값을 확인
2.nextval:현재 지정된 시컨스값의 다음값을 반환(확인)->새로운 값을 저장시킬때 사용
                                                                     중복되지 않게

****************************************************************************************************************

SQL> SELECT b_depte2_deptno.currval from dual;
1행에 오류:
ORA-08002: 시퀀스 B_DEPT2_DEPTNO.CURRVAL은 이 세션에서는 정의 되어 있지 않습니다
= 생성되고 맨처음에는 CURRVAL은 값이 저장X
   맨처음 nextval로 값을 저장시켜야 그제서야 CURRVAL에 값이 저장되고 사용할 수가 있다.

SQL> SELECT b_dept2_deptno.nextval from dual;
   NEXTVAL
----------
         1

SQL> select b_dept2_deptno.currval from dual;
   CURRVAL
----------
         1

SQL> SELECT b_dept2_deptno.nextval from dual;
   NEXTVAL
----------
         2


Q 105.
새롭게 시컨스를 만들어서 테이블에 적용시켜보자.

SQL> SELECT * FROM b_dept2;
    DEPTNO DNAME          LOC
---------- -------------- -------------
        10 ACCOUNTING     NEW YORK
        20 RESEARCH       DALLAS
        30 SALES          CHICAGO
        40 OPERATIONS     BOSTON
        50 SUPPORT        GWANGJU
6 개의 행이 선택되었습니다.
        insert 60,70,시작값 60, 증가치 10

SQL> CREATE SEQUENCE b_dept2_deptno2
  2  START WITH 60
  3  INCREMENT BY 10
  4  MAXVALUE 10000
  5  NOCYCLE
  6  NOCACHE;
시퀀스가 생성되었습니다.

형식)
SQL>insert into b_dept2 values
     (b_dept2_deptno2.nextval,'TESTING','SEOUL');
1 개의 행이 만들어졌습니다.
****************************************************************************************************************
시컨스가 넣어주는 부분의 필드값에 시컨스명.nextval
****************************************************************************************************************
내부적으로 값이 중복되지 않게 저장만 하는 경우 -> 시컨스를 많이 사용
화면에 출력할때 시컨스 -> 중간에 값이 갑자기 증가할 때가 있어서 시컨스를 잘 사용안함
    ex) select max(필드명) from 테이블명
         최대값 +1 -> 코딩(jsp 게시판 번호)

SQL> SELECT * FROM b_dept2;
    DEPTNO DNAME          LOC
---------- -------------- -------------
        10 ACCOUNTING     NEW YORK
        20 RESEARCH       DALLAS
        30 SALES          CHICAGO
        40 OPERATIONS     BOSTON
        50 SUPPORT        GWANGJU
        60 TESTING        SEOUL  -> 시컨스.nextval을 사용해서 들어감

SQL> INSERT INTO b_dept2 VALUES(b_dept2_deptno2.nextval, 'TESTING2', 'BUSAN');
1 개의 행이 만들어졌습니다.

SQL> SELECT * FROM b_dept2;
    DEPTNO DNAME          LOC
---------- -------------- -------------
        10 ACCOUNTING     NEW YORK
        20 RESEARCH       DALLAS
        30 SALES          CHICAGO
        40 OPERATIONS     BOSTON
        50 SUPPORT        GWANGJU
        60 TESTING        SEOUL
        70 TESTING2       BUSAN
7 개의 행이 선택되었습니다.

치명적인 단점)
------------------------------------------------------------------------------------------------------------
시컨스  b_dept2              b_dept3
             80                      100
             90
            110
------------------------------------------------------------------------------------------------------------
하나의 테이블에 작성 -> 다른 테이블에 또 작성 중간에 번호가 사라진다.

중간에 번호가 사라진다.    250
                                 249
                                 300
                                 500=>널띄기 =>rownum을 이용

1 ㅁㅁㅁㅁ
2. ㅁㅁㅁㅁ
3
4=> select max(deptno) from 테이블 =>웹에서 사용(JSP)
                    3------------------------->3+1=4(최대값+1)


Q 106.
시컨스->시스템 테이블에 저장 =>user_sequences에 저장=>뷰를 이용해서 조회
desc user_sequences                               (v_sequence_seq)

SQL> desc user_sequences
 이름                                      널?      유형
 ----------------------------------------- -------- ----------------------------
 SEQUENCE_NAME                             NOT NULL VARCHAR2(30)
 MIN_VALUE                                          NUMBER
 MAX_VALUE                                          NUMBER
 INCREMENT_BY                              NOT NULL NUMBER
 CYCLE_FLAG                                         VARCHAR2(1)
 ORDER_FLAG                                         VARCHAR2(1)
 CACHE_SIZE                                NOT NULL NUMBER
 LAST_NUMBER                               NOT NULL NUMBER

****************************************************************************************************************
오라클에서 자주 사용이 되거나, 반복적인 SQL구문은 따로 파일로 저장해서 불러온다.
-> 명령어 : save 경로포함 파일명
-> save 경로 파일명 일일이 쓰기 힘든게 단점

view -> 오라클 객체 -> 자주 사용이 되거나, 반복적인 SQL구문 -> 시스템 테이블에 저장(텍스트 형태로 저장)
-> 가상테이블
형식) create view 뷰명 
       as SQL구문

실행시키는 방법 : select * from 실행시킬 뷰명;
*주의 : 파라미터 인수질의를 사용하는 경우 -> save명령어를 사용할 것.
****************************************************************************************************************

SQL> CREATE VIEW v_sequence_sq
  2  AS
  3  SELECT sequence_name, min_value, max_value, increment_by, last_number
  4  FROM user_sequences;
CREATE VIEW v_sequence_sq
                       *
1행에 오류:
ORA-01031: 권한이 불충분합니다

이유 : scott 계정이 view를 작성할 수 있는 권한이 없기 때문
-> 관리자로 로그인해서 create view 권한을 주면 됨

SQL> conn sys/sys12345 as sysdba
연결되었습니다.

형식) grant 권한종류, 권한종류2..... to 권한을 줄 계정명 -> DCL명령어

SQL> grant create view, create synonym to scott, test;
권한이 부여되었습니다.

SQL>conn scott/tiger
연결되었습니다.

SQL>create view v_sequence_seq
      as
      select sequence_name,min_value,
      max_value,increment_by,last_number
      from user_sequences;
뷰가 생성되었습니다.

SQL> SELECT * FROM v_sequence_seq;
SEQUENCE_NAME                   MIN_VALUE  MAX_VALUE INCREMENT_BY LAST_NUMBER
------------------------------ ---------- ---------- ------------ -----------
B_DEPT2_DEPTNO                          1 1.0000E+28            1          21
B_DEPT2_DEPTNO2                         1      10000           10          80
B_EMP5_EMPNO                            1 1.0000E+28            1           1


Q 107.
시컨스 수정=>시컨스 생성과 형식이 거의 같다.

SQL> alter sequence b_dept2_deptno2
  2  increment by 2
  3  maxvalue 23 ===>현재값 80 (모순) =>항상 최대값보다 적어야 된다.
  4  minvalue 1
  5  nocycle
  6  nocache;
alter sequence b_dept2_deptno2
*
1행에 오류:
ORA-04009: MAXVALUE 에 현재치보다 작은 값을 지정할 수 없습니다

                         DDL
시컨스를 삭제 ->drop sequence 삭제시킬 시컨스명
SQL> drop sequence b_dept2_deptno2; //삭제=>시스템테이블에서도 삭제

SQL> select * from v_sequence_seq;

SEQUENCE_NAME                   MIN_VALUE  MAX_VALUE INCREMENT_BY LAST_NUMBER
------------------------------ ---------- ---------- ------------ -----------
B_DEPT2_DEPTNO                          1 1.0000E+28            1        21
B_EMP5_EMPNO                            1 1.0000E+28            1         1

SQL>
========>삭제됨을 확인할것.

****************************************************************************************************************************
정리->숫자데이터 중에서 중복되지 않게 숫자데이터를 순차적으로 저장시킬때 사용하는 오라클 객체
****************************************************************************************************************************


Q 108.
select * from tab;//테이블의 별칭(=동의어)(Synonym(시노님))개요,사용->사용권한
                     ->단어는 다르지만 의미가 같은것(별칭,별명(사람))
                    ->테이블에 부여(테이블은 하나인데====>이름이 2개)
                                        dept-------------->백업테이블 b_dept(X) = 서로 같은 테이블이 아니기 때문에 동의어가 아님(분리X)

create view, create synonym
뷰를 만드는 권한, 동의어를 만드는 권한

         DDL
형식) create synonym 동의어이름 for 대상객체명(=테이블명)
SQL> create synonym buser for b_dept2;
동의어가 생성되었습니다.

SQL> SELECT * FROM tab;

TNAME                          TABTYPE  CLUSTERID
------------------------------ ------- ----------
BONUS                          TABLE
BUSER                          SYNONYM  -> 개인동의어
B_DEPT2                        TABLE
B_EMP2                         TABLE
B_EMP3                         TABLE
DEPT                           TABLE
EMP                            TABLE
EMP_DEPTNO                     TABLE
SALGRADE                       TABLE
V_SEQUENCE_SEQ                 VIEW
ZIPCODE                        TABLE
11 개의 행이 선택되었습니다.

SQL> select * FROM b_dept2;
    DEPTNO DNAME          LOC
---------- -------------- -------------
        10 ACCOUNTING     NEW YORK
        20 RESEARCH       DALLAS
        30 SALES          CHICAGO
        40 OPERATIONS     BOSTON
        50 SUPPORT        GWANGJU
        60 TESTING        SEOUL
        70 TESTING2       BUSAN
7 개의 행이 선택되었습니다.

SQL> select * from buser;
    DEPTNO DNAME          LOC
---------- -------------- -------------
        10 ACCOUNTING     NEW YORK
        20 RESEARCH       DALLAS
        30 SALES          CHICAGO
        40 OPERATIONS     BOSTON
        50 SUPPORT        GWANGJU
        60 TESTING        SEOUL
        70 TESTING2       BUSAN
7 개의 행이 선택되었습니다.
****************************************************************************************************************************
                                   b_dept2---------->buser(동의어)(테이블이 연결)
                                       80                     80
                                   b_dept2---------->b_dept22(백업) -> 각 독립적인 테이블이라(새로만듦) 서로 연결이 안됨
                                       80                     80(X)
****************************************************************************************************************************

SQL> INSERT INTO buser VALUES(80, 'TESTING3', 'TEST');
1 개의 행이 만들어졌습니다.

SQL> SELECT * FROM b_dept2;
    DEPTNO DNAME          LOC
---------- -------------- -------------
        10 ACCOUNTING     NEW YORK
        20 RESEARCH       DALLAS
        30 SALES          CHICAGO
        40 OPERATIONS     BOSTON
        50 SUPPORT        GWANGJU
        60 TESTING        SEOUL
        70 TESTING2       BUSAN
        80 TESTING3       TEST  -> 서로 연결이 됐기 때문에 b_dept2에도 생성이 됨
8 개의 행이 선택되었습니다.


Q 109.
동의어를 왜 만드는가? ->사용권한과 연관이 있다.
                               (DCL문)->Data Control Language

오라클은 기본적으로 해당 계정에 있는 테이블만 사용이 가능하기 때문에 동의어를 통해서 다른 계정에 있는거 사용 가능
계정별로 관리->속한 테이블만 사용이 가능하다.
   test ----------------------->scott
                                     b_emp5, b_dept2,,,
                                     insert,update,delete,select)

서로 다른 계정에서의 특정 계정의 테이블을 사용? yes(허락을 받아야 된다.)

** 동의어의 종류 **

1.개인용(private synonym)->각 계정별로 따로따로 필요에 따라서
                                       만드는 경우(자기 계정만 사용이 가능)

2.공용(public synonym)->관리자만 만드는 경우=>select * from tab;
                                    모든 계정들이 사용할 수 있는 동의어를
                                    만드는 경우

--------------------------------------------------------------------------------------------------------------------------------
시나리오=>test===>scott계정 b_dept2(insert,select)

SQL> show user
USER은 "SCOTT"입니다

SQL> conn test/t1234
연결되었습니다.

SQL> select * from b_dept2;
select * from b_dept2
                  *
1행에 오류:
ORA-00942: 테이블 또는 뷰가 존재하지 않습니다  -> 실제로 가지고 있지 않기 때문에(권한도 X) 존재하지 않음

 사용권한->사용하고자하는 테이블의 주인(소유자)에게 허락을 받는 것
  DCL            (인증)
           권한주기->grant
           권한회수(=몰수)->revoke

=================================
SQL>conn scott/tiger

      객체권한->소유자가 특정계정에게 부여하는것.

DCL->형식) grant 권한종류,,,(all) on 적용테이블명 to 계정명1,,,
                         insert,update,delete,select  to public
                                                                (모든 계정)
SQL> grant insert,select on b_dept2 to test; //통보
------------------------------------------------

SQL> grant insert,select on b_dept2 to test;
권한이 부여되었습니다.

SQL> conn scott/tiger
연결되었습니다.

SQL> select * from scott.b_dept2;
                             ==========>내것처럼 편하게 
                                                      이름을 붙여서 사용
                                                     (동의어)
    DEPTNO DNAME          LOC
---------- -------------- -------------
        10 ACCOUNTING     NEW YORK
        20 RESEARCH       DALLAS
        30 SALES          CHICAGO
        40 OPERATIONS     BOSTON
        80 TESTING3       TEST
        50 SUPPORT        GWANGJU
        60 TESTING        SEOUL
        70 TESTING2       BUSAN
8 개의 행이 선택되었습니다.

scott.b_dept2==>buser2 이름을 내것처럼 사용

SQL> create synonym buser2 for scott.b_dept2;
동의어가 생성되었습니다.

SQL> select * from buser2;  -> buser2 = scott.b_dept2 를 동의어로 지정
    DEPTNO DNAME          LOC
---------- -------------- -------------
        10 ACCOUNTING     NEW YORK
        20 RESEARCH       DALLAS
        30 SALES          CHICAGO
        40 OPERATIONS     BOSTON
        50 SUPPORT        KWANGJU
        60 TESTING        SEOUL
        70 TESTING2       BUSAN
        80 TESTING3       TEST
8 개의 행이 선택되었습니다.

*********************************************************************************************
동의어를 사용하는 목적=>다른 계정이 소유한 테이블을 데이터 작업(DML)
                            을 할때 소유자명.테이블명
                        =>편리하게 자기만의 이름으로 변경해서 사용하고자
                            할때 사용하는 오라클 객체
**********************************************************************************************


Q 110.
공용 동의어? 관리자가 만들어주는 경우
(모든 계정이 다 사용이 가능한 동의어)

형식] create [public] synonym 동의어 for 대상객체(소유자명.테이블명)

SQL> conn sys/sys12345 as sysdba
연결되었습니다.

SQL> show user
USER은 "SYS"입니다

SQL> create public synonym butest for scott.b_dept2;
동의어가 생성되었습니다.

통보받은 계정들은 로그인=>butest -> 운영

SQL> conn test/t1234
연결되었습니다.

SQL> SELECT * FROM butest;
    DEPTNO DNAME          LOC
---------- -------------- -------------
        10 ACCOUNTING     NEW YORK
        20 RESEARCH       DALLAS
        30 SALES          CHICAGO
        40 OPERATIONS     BOSTON
        80 TESTING3       TEST
        50 SUPPORT        GWANGJU
        60 TESTING        SEOUL
        70 TESTING2       BUSAN
        90 TESTING        TEST2
9 개의 행이 선택되었습니다.


Q 111.
scott계정이 b_dept2테이블에 대한 권한(insert,select)->test계정
권한부여(grant)<---->권한회수(=몰수)

객체권한

형식)revoke 회수할 권한종류,,, on 적용테이블명 from 계정명
                                                            to(X)
SQL> conn scott/tiger
연결되었습니다.

SQL> revoke select,insert on b_dept2 from test;
권한이 취소되었습니다.

SQL> select * from buser2;
select * from buser2
                    *
1행에 오류:
ORA-00942: 테이블 또는 뷰가 존재하지 않습니다


Q 112.
불필요로한 동의어는 삭제?
형식) drop synonym 삭제시킬 동의어명

SQL> conn test/t1234
연결되었습니다.

SQL> show user
USER은 "TEST"입니다

SQL> drop synonym buser2;  -> 만든 사람이 삭제할 권한이 있다.
동의어가 삭제되었습니다.

=========================================
 DB구현->관리자(오라클 설치,계정관리,사용권한)
 SQL활용->계정->데이터 작업(DML,DQL)
--------------------------------------------

권한->관리자가 각 계정별로 사용할 수 있는 작업의 범위를 지정해주는 것.
                                                   회사의 직책(대리,부장,이사,,,)

1.시스템 권한->관리자가 주로 작업(계정관리(생성,수정,삭제,공용동의어 생성,,,))
2.객체권한->각 계정이 관리(소유자)->테이블,뷰,시컨스,시노님,인덱스,,(사용권한)
=========================================

******************************************************************************************
Q 113.
계정관리->계정생성->암호의 유효기간을 만료시키는 방법
******************************************************************************************
->계정생성  create user 계정명(test) identified by 암호(t1234) //다른 사람이 사용
->특정계정에 암호를 변경할 수 있도록 권고?->alter 구문

형식) alter user 수정할계정명 password expire
                           
 hong/h1234 계정->로그인 새로 암호를*
//관리자-> 1.계정생성 2. 권한부여(connect,resource)3.암호를 변경 가능o

SQL> create user hong identified by h1234;  -> DDL
사용자가 생성되었습니다.

SQL> alter user hong password expire;  -> expire : 만료
사용자가 변경되었습니다.

SQL> grant connect,resource to hong;
권한이 부여되었습니다.

  = hong/h1234=>암호변경?

SQL> conn hong/h1234
ERROR:
ORA-28001: the password has expired
hong에 대한 비밀번호를 변경합니다.
새 비밀번호:t7890
새 비밀번호 다시 입력:t7890
비밀번호가 변경되었습니다.
연결되었습니다.


Q 114.
계정을 사용중인 직원이 퇴사하거나,잠시 휴가를 가는 경우
그 계정을 임시로 사용하지 못하게 하고 싶다.(관리자)?=>락을 건다

계정삭제=> 테이블생성=> 작업,뷰,,,연결(같이 삭제될 가능성이 존재)
계정을 삭제하지 않고 암호를 변경해서 계속 사용 할수 있도록 조치

scott,hr계정 락이 걸려있는 상태

SQL> conn sys/s as sysdba
연결되었습니다.

형식) alter user 락을 풀어줄계정명 account unlock | lock (락걸기)
형식2) alter user 락을 풀어줄 계정명 identified by 새암호 account unlock
        : 암호도 변경해 주면서 락 걸기, 풀기

SQL> conn hr/hr1234
ERROR:
ORA-28000: the account is locked
경고: 이제는 ORACLE에 연결되어 있지 않습니다.  -> 락이 걸린 상태
= 1. 퇴사 or 다른부서로 발령받아서 간 상태
   2. 임시로 사용을 중지시킬 필요가 있을때

SQL> alter user hr identified by hr1234 account unlock;
사용자가 변경되었습니다.

SQL> conn hr/hr1234
연결되었습니다.

SQL> alter user hong account lock;
alter user hong account lock
*
1행에 오류:
ORA-01031: 권한이 불충분합니다

SQL> conn sys/sys12345 as sysdba
연결되었습니다.
SQL> alter user hong account lock;
사용자가 변경되었습니다.

SQL> conn hong/h7890
ERROR:


Q 115.
관리자로 로그인을 해야 되는 데 관리자가 암호를 잃어버리는 경우를 위한 대처

scott=>락이 걸린상태->관리자로 로그인이 가능

관리자) conn  sys/sys12345 as sysdba

          conn  / as sysdba (로컬(자기컴))->비상(참조)


Q 116.
계정을 삭제
--------------------------------------------------------------------------------------------------------------------------
형식) drop user 삭제시킬 유저명 =>아무런 작업을 하지 않은 유저
         계정만       hong

        drop user 삭제시킬 유저명 [cascade] //테이블,뷰,시컨스,,,
        ->계정뿐만 아니라 이 계정으로 작업한 내용까지 다 삭제하라.
 
        락을 걸기/풀기

SQL> drop user hong; //관리자만이 삭제가 가능
사용자가 삭제되었습니다.
--------------------------------------------------------------------------------------------------------------------------


Q 117.
권한의 종류
->시스템 권한->system_privilege_map 테이블 = 관리자만 볼수있음

 PRIVILEGE NAME                                       PROPERTY
---------- ---------------------------------------- ----------
        -3 ALTER SYSTEM                                      0
        -4 AUDIT SYSTEM                                      0
        -----------------------------------------------------------
        -5 CREATE SESSION  ->로그인할때 사용하는 권한  (connect(롤)와 연관)                                
         ----------------------------------------------------------
        -6 ALTER SESSION                                     0
        -7 RESTRICTED SESSION                                0
          ------------------------------데이터 저장영역(TABLESPACE)-------------------------
       -10 CREATE TABLESPACE                                 0
       -11 ALTER TABLESPACE                                  0
       -12 MANAGE TABLESPACE                                 0
       -13 DROP TABLESPACE                                   0
-----------------------------------------------------------------
       -15 UNLIMITED TABLESPACE                              0
       -20 CREATE USER   (계정을 생성)                                    0

 PRIVILEGE NAME                                       PROPERTY
---------- ---------------------------------------- ----------
       -21 BECOME USER                                       0
       ============================
       -22 ALTER USER(수정)->락걸기,락풀기,암호새로 부여                                        0
       -23 DROP USER (계정 삭제)                                        0
       ============================
       -30 CREATE ROLLBACK SEGMENT                           0
       -31 ALTER ROLLBACK SEGMENT                            0
       -32 DROP ROLLBACK SEGMENT                             0
         -------------------------------------------
       -40 CREATE TABLE  (테이블 생성권한)  =>Resource롤(폴더)과 연관                                   0
         -------------------------------------------
       -41 CREATE ANY TABLE                                  0
       -42 ALTER ANY TABLE                                   0
       -43 BACKUP ANY TABLE                                  0
       -44 DROP ANY TABLE                                    0

 PRIVILEGE NAME                                       PROPERTY
---------- ---------------------------------------- ----------
       -45 LOCK ANY TABLE                                    0
       -46 COMMENT ANY TABLE                                 0
       -47 SELECT ANY TABLE                                  0
       -48 INSERT ANY TABLE                                  0
       -49 UPDATE ANY TABLE                                  0
       -50 DELETE ANY TABLE                                  0
       -60 CREATE CLUSTER                                    0
       -61 CREATE ANY CLUSTER                                0
       -62 ALTER ANY CLUSTER                                 0
       -63 DROP ANY CLUSTER                                  0
       -71 CREATE ANY INDEX                                  0

 PRIVILEGE NAME                                       PROPERTY
---------- ---------------------------------------- ----------
       -72 ALTER ANY INDEX                                   0
       -73 DROP ANY INDEX                                    0
          ----------------------------------------------
       -80 CREATE SYNONYM  (동의어 생성)                                  0
          -----------------------------------------------
       -81 CREATE ANY SYNONYM                                0
       -82 DROP ANY SYNONYM                                  0
         -------------------------------------------------------------
       -83 SYSDBA (관리자 권한)롤                                           0
        --------------------------------------------------------------
       -84 SYSOPER                                           0
      --------------------------------------------------
       -85 CREATE PUBLIC SYNONYM(공용 동의어)                             0
       -86 DROP PUBLIC SYNONYM                               0
       -90 CREATE VIEW  ->Resource롤에 포함X->단독으로 존재                                      0
       --------------------------------------------------
       -91 CREATE ANY VIEW                                   0

 PRIVILEGE NAME                                       PROPERTY
---------- ---------------------------------------- ----------
       -92 DROP ANY VIEW                                     0
      -105 CREATE SEQUENCE (시컨스 생성권한)                                 0
      -106 CREATE ANY SEQUENCE                               0
      -107 ALTER ANY SEQUENCE                                0
      -108 DROP ANY SEQUENCE                                 0
      -109 SELECT ANY SEQUENCE                               0
      -115 CREATE DATABASE LINK                              0
      -120 CREATE PUBLIC DATABASE LINK                       0
      -121 DROP PUBLIC DATABASE LINK                         0
     ====================================
      -125 CREATE ROLE (롤을 생성할 수 있는 권한)                                      0
     ========================================
      -126 DROP ANY ROLE                                     0

 PRIVILEGE NAME                                       PROPERTY
---------- ---------------------------------------- ----------
      -127 GRANT ANY ROLE                                    0
      -128 ALTER ANY ROLE                                    0
      -130 AUDIT ANY                                         0
      -135 ALTER DATABASE                                    0
      -138 FORCE TRANSACTION                                 0
      -139 FORCE ANY TRANSACTION                             0
      -140 CREATE PROCEDURE                                  0
      -141 CREATE ANY PROCEDURE                              0
      -142 ALTER ANY PROCEDURE                               0
      -143 DROP ANY PROCEDURE                                0
      -144 EXECUTE ANY PROCEDURE                             0

 PRIVILEGE NAME                                       PROPERTY
---------- ---------------------------------------- ----------
      -151 CREATE TRIGGER                                    0
      -152 CREATE ANY TRIGGER                                0
      -153 ALTER ANY TRIGGER                                 0
      -154 DROP ANY TRIGGER                                  0
      -160 CREATE PROFILE                                    0
      -161 ALTER PROFILE                                     0
      -162 DROP PROFILE                                      0
      -163 ALTER RESOURCE COST                               0
      -165 ANALYZE ANY                                       0
      -167 GRANT ANY PRIVILEGE                               0
      -172 CREATE MATERIALIZED VIEW                          0

 PRIVILEGE NAME                                       PROPERTY
---------- ---------------------------------------- ----------
      -173 CREATE ANY MATERIALIZED VIEW                      0
      -174 ALTER ANY MATERIALIZED VIEW                       0
      -175 DROP ANY MATERIALIZED VIEW                        0
      -177 CREATE ANY DIRECTORY                              0
      -178 DROP ANY DIRECTORY                                0
      -180 CREATE TYPE                                       0
      -181 CREATE ANY TYPE                                   0
      -182 ALTER ANY TYPE                                    0
      -183 DROP ANY TYPE                                     0
      -184 EXECUTE ANY TYPE                                  0
      -186 UNDER ANY TYPE                                    0

 PRIVILEGE NAME                                       PROPERTY
---------- ---------------------------------------- ----------
      -188 CREATE LIBRARY                                    0
      -189 CREATE ANY LIBRARY                                0
      -190 ALTER ANY LIBRARY                                 0
      -191 DROP ANY LIBRARY                                  0
      -192 EXECUTE ANY LIBRARY                               0
      -200 CREATE OPERATOR                                   0
      -201 CREATE ANY OPERATOR                               0
      -202 ALTER ANY OPERATOR                                0
      -203 DROP ANY OPERATOR                                 0
      -204 EXECUTE ANY OPERATOR                              0
      -205 CREATE INDEXTYPE                                  0

 PRIVILEGE NAME                                       PROPERTY
---------- ---------------------------------------- ----------
      -206 CREATE ANY INDEXTYPE                              0
      -207 ALTER ANY INDEXTYPE                               0
      -208 DROP ANY INDEXTYPE                                0
      -209 UNDER ANY VIEW                                    0
      -210 QUERY REWRITE                                     0
      -211 GLOBAL QUERY REWRITE                              0
      -212 EXECUTE ANY INDEXTYPE                             0
      -213 UNDER ANY TABLE                                   0
      -214 CREATE DIMENSION                                  0
      -215 CREATE ANY DIMENSION                              0
      -216 ALTER ANY DIMENSION                               0

 PRIVILEGE NAME                                       PROPERTY
---------- ---------------------------------------- ----------
      -217 DROP ANY DIMENSION                                0
      -218 MANAGE ANY QUEUE                                  1
      -219 ENQUEUE ANY QUEUE                                 1
      -220 DEQUEUE ANY QUEUE                                 1
      -222 CREATE ANY CONTEXT                                0
      -223 DROP ANY CONTEXT                                  0
      -224 CREATE ANY OUTLINE                                0
      -225 ALTER ANY OUTLINE                                 0
      -226 DROP ANY OUTLINE                                  0
      -227 ADMINISTER RESOURCE MANAGER                       1
      -228 ADMINISTER DATABASE TRIGGER                       0

 PRIVILEGE NAME                                       PROPERTY
---------- ---------------------------------------- ----------
      -233 MERGE ANY VIEW                                    0
      -234 ON COMMIT REFRESH                                 0
      -235 EXEMPT ACCESS POLICY                              0
      -236 RESUMABLE                                         0
      -237 SELECT ANY DICTIONARY                             0
      -238 DEBUG CONNECT SESSION                             0
      -241 DEBUG ANY PROCEDURE                               0
      -243 FLASHBACK ANY TABLE                               0
      -244 GRANT ANY OBJECT PRIVILEGE                        0
      -245 CREATE EVALUATION CONTEXT                         1
      -246 CREATE ANY EVALUATION CONTEXT                     1

 PRIVILEGE NAME                                       PROPERTY
---------- ---------------------------------------- ----------
      -247 ALTER ANY EVALUATION CONTEXT                      1
      -248 DROP ANY EVALUATION CONTEXT                       1
      -249 EXECUTE ANY EVALUATION CONTEXT                    1
      -250 CREATE RULE SET                                   1
      -251 CREATE ANY RULE SET                               1
      -252 ALTER ANY RULE SET                                1
      -253 DROP ANY RULE SET                                 1
      -254 EXECUTE ANY RULE SET                              1
      -255 EXPORT FULL DATABASE                              0
      -256 IMPORT FULL DATABASE                              0
      -257 CREATE RULE                                       1

 PRIVILEGE NAME                                       PROPERTY
---------- ---------------------------------------- ----------
      -258 CREATE ANY RULE                                   1
      -259 ALTER ANY RULE                                    1
      -260 DROP ANY RULE                                     1
      -261 EXECUTE ANY RULE                                  1
      -262 ANALYZE ANY DICTIONARY                            0
      -263 ADVISOR                                           0
      -264 CREATE JOB                                        0
      -265 CREATE ANY JOB                                    0
      -266 EXECUTE ANY PROGRAM                               0
      -267 EXECUTE ANY CLASS                                 0
      -268 MANAGE SCHEDULER                                  0

 PRIVILEGE NAME                                       PROPERTY
---------- ---------------------------------------- ----------
      -269 SELECT ANY TRANSACTION                            0
      -270 DROP ANY SQL PROFILE                              0
      -271 ALTER ANY SQL PROFILE                             0
      -272 ADMINISTER SQL TUNING SET                         0
      -273 ADMINISTER ANY SQL TUNING SET                     0
      -274 CREATE ANY SQL PROFILE                            0
      -275 EXEMPT IDENTITY POLICY                            0
      -276 MANAGE FILE GROUP                                 1
      -277 MANAGE ANY FILE GROUP                             1
      -278 READ ANY FILE GROUP                               1
      -279 CHANGE NOTIFICATION                               0

 PRIVILEGE NAME                                       PROPERTY
---------- ---------------------------------------- ----------
      -280 CREATE EXTERNAL JOB                               0
      -281 CREATE ANY EDITION                                0
      -282 DROP ANY EDITION                                  0
      -283 ALTER ANY EDITION                                 0
      -284 CREATE ASSEMBLY                                   0
      -285 CREATE ANY ASSEMBLY                               0
      -286 ALTER ANY ASSEMBLY                                0
      -287 DROP ANY ASSEMBLY                                 0
      -288 EXECUTE ANY ASSEMBLY                              0
      -289 EXECUTE ASSEMBLY                                  0
      -290 CREATE MINING MODEL                               0

 PRIVILEGE NAME                                       PROPERTY
---------- ---------------------------------------- ----------
      -291 CREATE ANY MINING MODEL                           0
      -292 DROP ANY MINING MODEL                             0
      -293 SELECT ANY MINING MODEL                           0
      -294 ALTER ANY MINING MODEL                            0
      -295 COMMENT ANY MINING MODEL                          0
      -301 CREATE CUBE DIMENSION                             0
      -302 ALTER ANY CUBE DIMENSION                          0
      -303 CREATE ANY CUBE DIMENSION                         0
      -304 DELETE ANY CUBE DIMENSION                         0
      -305 DROP ANY CUBE DIMENSION                           0
      -306 INSERT ANY CUBE DIMENSION                         0

 PRIVILEGE NAME                                       PROPERTY
---------- ---------------------------------------- ----------
      -307 SELECT ANY CUBE DIMENSION                         0
      -308 CREATE CUBE                                       0
      -309 ALTER ANY CUBE                                    0
      -310 CREATE ANY CUBE                                   0
      -311 DROP ANY CUBE                                     0
      -312 SELECT ANY CUBE                                   0
      -313 UPDATE ANY CUBE                                   0
      -314 CREATE MEASURE FOLDER                             0
      -315 CREATE ANY MEASURE FOLDER                         0
      -316 DELETE ANY MEASURE FOLDER                         0
      -317 DROP ANY MEASURE FOLDER                           0

 PRIVILEGE NAME                                       PROPERTY
---------- ---------------------------------------- ----------
      -318 INSERT ANY MEASURE FOLDER                         0
      -319 CREATE CUBE BUILD PROCESS                         0
      -320 CREATE ANY CUBE BUILD PROCESS                     0
      -321 DROP ANY CUBE BUILD PROCESS                       0
      -322 UPDATE ANY CUBE BUILD PROCESS                     0
      -326 UPDATE ANY CUBE DIMENSION                         0
      -327 ADMINISTER SQL MANAGEMENT OBJECT                  0
      -328 ALTER PUBLIC DATABASE LINK                        0
      -329 ALTER DATABASE LINK                               0
      -350 FLASHBACK ARCHIVE ADMINISTER                      0

208 개의 행이 선택되었습니다.


Q 118.
role(롤)->권한을 줄때 이 롤을 사용(권한을 담아놓은 그릇(또는 폴더))
리눅스->그룹과 비슷 (단순,반복적인 권한을  롤을 이용)
=>편리하게 권한을 부여하기 위해서 
시스템에서 현재 사용중인 롤을 조회하는 SQL 작성?
어떤 롤이 있는지?  dba_roles->권한

SQL> SELECT * FROM dba_roles;  -> dba_XXX, sys_XXX,v$_XXXX로 시작하는 테이블 = 관리자만볼 수 있는 권한

ROLE(롤이름)                   PASSWORD AUTHENTICAT
------------------------------ -------- -----------
CONNECT                        NO       NONE
RESOURCE                       NO       NONE
DBA                            NO       NONE
SELECT_CATALOG_ROLE            NO       NONE
EXECUTE_CATALOG_ROLE           NO       NONE
DELETE_CATALOG_ROLE            NO       NONE
EXP_FULL_DATABASE              NO       NONE
IMP_FULL_DATABASE              NO       NONE
LOGSTDBY_ADMINISTRATOR         NO       NONE
DBFS_ROLE                      NO       NONE
AQ_ADMINISTRATOR_ROLE          NO       NONE

ROLE                           PASSWORD AUTHENTICAT
------------------------------ -------- -----------
AQ_USER_ROLE                   NO       NONE
DATAPUMP_EXP_FULL_DATABASE     NO       NONE
DATAPUMP_IMP_FULL_DATABASE     NO       NONE
ADM_PARALLEL_EXECUTE_TASK      NO       NONE
GATHER_SYSTEM_STATISTICS       NO       NONE
JAVA_DEPLOY                    NO       NONE
RECOVERY_CATALOG_OWNER         NO       NONE
SCHEDULER_ADMIN                NO       NONE
HS_ADMIN_SELECT_ROLE           NO       NONE
HS_ADMIN_EXECUTE_ROLE          NO       NONE
HS_ADMIN_ROLE                  NO       NONE

ROLE                           PASSWORD AUTHENTICAT
------------------------------ -------- -----------
GLOBAL_AQ_USER_ROLE            GLOBAL   GLOBAL
OEM_ADVISOR                    NO       NONE
OEM_MONITOR                    NO       NONE
WM_ADMIN_ROLE                  NO       NONE
JAVAUSERPRIV                   NO       NONE
JAVAIDPRIV                     NO       NONE
JAVASYSPRIV                    NO       NONE
JAVADEBUGPRIV                  NO       NONE
EJBCLIENT                      NO       NONE
JMXSERVER                      NO       NONE
JAVA_ADMIN                     NO       NONE

ROLE                           PASSWORD AUTHENTICAT
------------------------------ -------- -----------
CTXAPP                         NO       NONE
XDBADMIN                       NO       NONE
XDB_SET_INVOKER                NO       NONE
AUTHENTICATEDUSER              NO       NONE
XDB_WEBSERVICES                NO       NONE
XDB_WEBSERVICES_WITH_PUBLIC    NO       NONE
XDB_WEBSERVICES_OVER_HTTP      NO       NONE
ORDADMIN                       NO       NONE
OLAPI_TRACE_USER               NO       NONE
OLAP_XS_ADMIN                  NO       NONE
OWB_USER                       NO       NONE

ROLE                           PASSWORD AUTHENTICAT
------------------------------ -------- -----------
OLAP_DBA                       NO       NONE
CWM_USER                       NO       NONE
OLAP_USER                      NO       NONE
SPATIAL_WFS_ADMIN              NO       NONE
WFS_USR_ROLE                   YES      PASSWORD
SPATIAL_CSW_ADMIN              YES      PASSWORD
CSW_USR_ROLE                   YES      PASSWORD
MGMT_USER                      NO       NONE
APEX_ADMINISTRATOR_ROLE        NO       NONE
OWB$CLIENT                     YES      PASSWORD
OWB_DESIGNCENTER_VIEW          NO       NONE

55 개의 행이 선택되었습니다.


Q 119.
특정롤에 부여된 시스템 권한의 종류를 확인하는 SQL구문을 작성?
->save 를 이용(뷰)=>dba_sys_privs

SQL> SELECT * FROM dba_sys_privs
  2  WHERE GRANTEE = 'CONNECT';  -> CREATE SESSION(권한 종류 1개)

GRANTEE(롤이름)              PRIVILEGE(권한종류)                       ADM
------------------------------ ---------------------------------------- ---
CONNECT                        CREATE SESSION                           NO

SQL> SELECT * FROM dba_sys_privs
        WHERE GRANTEE = upper('&rolename');
rolename의 값을 입력하십시오:resource
구   2: WHERE GRANTEE = upper('&rolename')
신   2: WHERE GRANTEE = upper('resource')

GRANTEE                        PRIVILEGE                                ADM
------------------------------ ---------------------------------------- ---
RESOURCE                       CREATE TRIGGER                           NO
RESOURCE                       CREATE SEQUENCE                          NO
RESOURCE                       CREATE TYPE                              NO
RESOURCE                       CREATE PROCEDURE                         NO
RESOURCE                       CREATE CLUSTER                           NO
RESOURCE                       CREATE OPERATOR                          NO
RESOURCE                       CREATE INDEXTYPE                         NO
RESOURCE                       CREATE TABLE
                                                 +
                                       CREATE VIEW(옛날 버전 ->7,8i,9i)
                                       CREATE SYNONYM

SQL> /
rolename의 값을 입력하십시오: dba
구   2:       where grantee=upper('&rolename')
신   2:       where grantee=upper('dba')

GRANTEE                        PRIVILEGE                             ADM
------------------------------ ---------------------------------------- ---
DBA                            DROP ANY CUBE BUILD PROCESS           YES
DBA                            CREATE CUBE     
                                       ,,,
                                    202개


Q 120.
룰을 생성 관리자 권한->로그인을 할 수 있는 usercreate롤을 생성->
          ->scott,test계정에게 권한을 부여?

형식) 롤을 생성->create role 생성시킬 롤이름; //관리자가 사용하는 명령어
SQL> create role usercreate;   -> DDL
DDL롤이 생성되었습니다.

SQL> select * from dba_roles;
ROLE                           PASSWORD AUTHENTICAT
------------------------------ -------- -----------
CONNECT                        NO       NONE
...
ROLE                           PASSWORD AUTHENTICAT
------------------------------ -------- -----------
USERCREATE                     NO       NONE
  =>맨마지막에 추가
56 개의 행이 선택되었습니다.


Q 121.
만들어진 롤에 권한을 넣어준 뒤 특정계정에게 권한을
           롤을 이용->부여
동일한 권한을 여러개의 롤에게 동시에 부여 가능

형식) grant 권한종류,,,, to 롤명1,롤명2,,,  //롤에게 넣어준다.

SQL> grant create user, alter user to usercreate;  -> create session
권한이 부여되었습니다.

SQL> @c:\webtest\2.db\print\searchrole.txt
rolename의 값을 입력하십시오: usercreate
구   2: WHERE GRANTEE = upper('&rolename')
신   2: WHERE GRANTEE = upper('usercreate')
GRANTEE                        PRIVILEGE                                ADM
------------------------------ ---------------------------------------- ---
USERCREATE                     CREATE USER                              NO
USERCREATE                     ALTER USER                               NO
                                    +create session,create table권한 추가
=====================================================
SQL> grant create session,create table to usercreate;
=====================================================

SQL> @c:\webtest\2.db\print\searchrole.txt
rolename의 값을 입력하십시오: usercreate
구   2: WHERE GRANTEE = upper('&rolename')
신   2: WHERE GRANTEE = upper('usercreate')

GRANTEE                        PRIVILEGE                                ADM
------------------------------ ---------------------------------------- ---
USERCREATE                     CREATE TABLE                             NO
USERCREATE                     CREATE SESSION                           NO
USERCREATE                     CREATE USER                              NO
USERCREATE                     ALTER USER                               NO

1.롤생성--->2.롤에 권한 부여-->3.권한이 있는 롤==>어떤계정?
형식) grant 권한이 들어있는 롤명,,,to 계정명1,,계정명n

SQL> grant usercreate to scott, test;  ->scott->imsi계정생성 ->t1234 부여
권한이 부여되었습니다.

SQL> conn scott/tiger
연결되었습니다.

SQL> create user imsi identified by t1234;
사용자가 생성되었습니다.  -> scott 계정에 create 권한이 부여되서 생성이 가능해짐

SQL> alter user imsi identified by imtest;
사용자가 변경되었습니다.  -> scott 계정에 alter user 권한이 부여되서 비밀번호 변경이 가능해짐

SQL> drop user imsi;
drop user imsi
*
1행에 오류:
ORA-01031: 권한이 불충분합니다  -> scott 계정에 drop 권한이 없어서 삭제가 불가능함


Q 122.
시나리오 : 관리자가 usercreate롤을 생성->권한준뒤->scott,test 해준 상태에서
                만약에 usercreate롤을 삭제->scott,test에게 부여된 그 권한을
                                                    계속 사용? or 사용X

SQL> conn sys/sys12345 as sysdba
연결되었습니다.

SQL> drop role usercreate;
롤이 삭제되었습니다.

SQL> conn scott/tiger
연결되었습니다.

SQL> alter user imsi identified by imtest1;
alter user imsi identified by imtest1
                                    *
1행에 오류:
ORA-01031: 권한이 불충분합니다

SQL> create user ktest identified by t1234;
create user ktest identified by t1234
                                        *
1행에 오류:
ORA-01031: 권한이 불충분합니다

*********************************************************************************************************************
※role을 삭제시 이 롤을 통해서 권한을 부여받은 모든 계정들의 권한은 자동적으로 회수하게 됨

롤을 이용하는 장점은 한꺼번에 많은 권한을 여러명의 계정들에게 동시에 부여할 수 있고, 한꺼번에 회수도 편리함
*********************************************************************************************************************

'국비학원 > 공부' 카테고리의 다른 글

13일차 java(1)  (0) 2023.05.09
13일차 oracle(6)  (1) 2023.05.09
11일차 oracle(4)  (0) 2023.05.04
10일차 oracle(3)  (1) 2023.05.04
9일차 oracle(2)  (0) 2023.05.04