TIL 23.09.11

ν™©μ€ν•˜Β·2023λ…„ 9μ›” 11일
0

TIL

λͺ©λ‘ 보기
78/146

πŸ“ŒToday I Learned

였라클 μˆ˜μ—…

ex30_pl/sql

ν”„λ‘œμ‹œμ €

  1. ν”„λ‘œμ‹œμ €
  2. ν•¨μˆ˜
  3. 트리거

트리거, Trigger

  • ν”„λ‘œμ‹œμ €μ˜ ν•œ μ’…λ₯˜
  • 개발자의 호좜이 μ•„λ‹Œ, 미리 μ§€μ •ν•œ νŠΉμ • 사건이 λ°œμƒν•˜λ©΄ μ‹œμŠ€ν…œμ΄ μžλ™μœΌλ‘œ μ‹€ν–‰ν•˜λŠ” ν”„λ‘œμ‹œμ €
  • μ˜ˆμ•½(사건) > 사건 λ°œμƒ > ν”„λ‘œμ‹œμ € 호좜
  • νŠΉμ • ν…Œμ΄λΈ” 지정(κ°μ‹œ λŒ€μƒ) > 지정 ν…Œμ΄λΈ”μ„ 였라클이 κ°μ‹œ > insert or update or delete > 미리 쀀비해놓은 ν”„λ‘œμ‹œμ € 호좜

트리거 ꡬ문

create or replace trigger 트리거λͺ…
    before|after
    insert|update|delete
    on ν…Œμ΄λΈ”λͺ…
    [for each row]
declare
    μ„ μ–ΈλΆ€;
begin
    κ΅¬ν˜„λΆ€;
exception
    μ˜ˆμ™Έμ²˜λ¦¬λΆ€;
end

예제

-- tblInsa > 직원 μ‚­μ œ
create or replace trigger trgInsa
    before      -- μ‚­μ œκ°€ λ°œμƒν•˜κΈ° 직전에 μ•„λž˜μ˜ κ΅¬ν˜„λΆ€λ₯Ό λ¨Όμ € 싀행해라! > before trigger
    delete      -- μ‚­μ œκ°€ λ°œμƒν•˜λŠ”μ§€?
    on tblInsa  -- tblInsa ν…Œμ΄λΈ”μ—μ„œ(κ°μ‹œ)
begin
    dbms_output.put_line(to_char(sysdate, 'hh24:mi:ss') || ' νŠΈλ¦¬κ±°κ°€ μ‹€ν–‰λ˜μ—ˆμŠ΅λ‹ˆλ‹€.');
    
    -- μ›”μš”μΌμ—λŠ” 퇴사가 λΆˆκ°€λŠ₯
    if to_char(sysdate, 'dy') = 'μ›”' then
        -- κ°•μ œλ‘œ μ—λŸ¬ λ°œμƒ
        -- throw new Exception()
        -- -20000 ~ -29999
        raise_application_error(-20001, 'μ›”μš”μΌμ—λŠ” 퇴사가 λΆˆκ°€λŠ₯ν•©λ‹ˆλ‹€.');

    end if;
    
end trgInsa; 


-- μ΄λ ‡κ²Œ ν•œλ²ˆμ— insert, update, deleteλ₯Ό κ°μ‹œν•  수 μžˆλ‹€. -> inserting, updating, deleting ν‚€μ›Œλ“œ μ‚¬μš©
create or replace trigger trgDiary
    after
    insert or update or delete
    on tblDiary
declare
    vmessage varchar2(1000);
begin
    -- dbms_output.put_line(to_char(sysdate, 'hh24:mi:ss') || ' νŠΈλ¦¬κ±°κ°€ μ‹€ν–‰λ˜μ—ˆμŠ΅λ‹ˆλ‹€.');
    
    if inserting then
        -- dbms_output.put_line('μΆ”κ°€');
        vmessage := 'μƒˆλ‘œμš΄ ν•­λͺ©μ΄ μΆ”κ°€λ˜μ—ˆμŠ΅λ‹ˆλ‹€.';
    elsif updating then
        -- dbms_output.put_line('μˆ˜μ •');
        vmessage := 'κΈ°μ‘΄ ν•­λͺ©μ΄ μˆ˜μ •λ˜μ—ˆμŠ΅λ‹ˆλ‹€.';
    elsif deleting then
        -- dbms_output.put_line('μ‚­μ œ');
        vmessage := 'κΈ°μ‘΄ ν•­λͺ©μ΄ μ‚­μ œλ˜μ—ˆμŠ΅λ‹ˆλ‹€.';
    end if;
    
    insert into tblLogDiary values (seqLogDiary.nextVal, vmessage, default);
end trgDiary;

for each row

  1. μƒλž΅
  • λ¬Έμž₯(Query) λ‹¨μœ„ 트리거. Table level trigger
  • 사건에 적용된 ν–‰μ˜ 개수 무관 > 트리거 λ”± 1회 호좜
  • 적용된 λ ˆμ½”λ“œμ˜ μ •λ³΄λŠ” μ€‘μš”ν•˜μ§€ μ•Šμ€ 경우 + 사건 μžμ²΄κ°€ μ€‘μš”ν•œ 경우

  1. μ‚¬μš©
  • ν–‰(Record) λ‹¨μœ„ 트리거

  • 사건에 적용된 ν–‰μ˜ 개수만큼 > νŠΈλ¦¬κ±°κ°€ 호좜

  • 적용된 λ ˆμ½”λ“œμ˜ 정보가 μ€‘μš”ν•œ 경우 + 사건 μžμ²΄λ³΄λ‹€..

  • 상관 관계λ₯Ό μ‚¬μš©ν•œλ‹€. > μΌμ’…μ˜ 가상 λ ˆμ½”λ“œ > :old, :new

      insert
      - :new > 방금 μΆ”κ°€λœ ν–‰
    
      update
      - :old > μˆ˜μ •λ˜κΈ° μ „ ν–‰
      - :new > μˆ˜μ •λœ ν›„ ν–‰
    
      delete
      - :old > μ‚­μ œλ˜κΈ° μ „ ν–‰

예제

create or replace trigger trgMen
    after
    delete
    on tblMen
    --for each row -- ν–‰λ‹¨μœ„ 트리거. 이거 μ—†μœΌλ©΄ λ¬Έμž₯λ‹¨μœ„ νŠΈλ¦¬κ±°λ‹€. μ‹€ν–‰λœ ν–‰μ˜ κ°œμˆ˜μ— 맞게 트리거λ₯Ό μ‹€ν–‰ν•œλ‹€λŠ” 뜻.
begin
    dbms_output.put_line('λ ˆμ½”λ“œλ₯Ό μ‚­μ œν–ˆμŠ΅λ‹ˆλ‹€.' || :old.name);
end trgMen;


delete from tblMen where name = '홍길동'; -- 1λͺ… μ‚­μ œ > 트리거 1회 μ‹€ν–‰

delete from tblMen where age < 25; -- νŠΈλ¦¬κ±°λŠ” 1회 μ‹€ν–‰ - 좜λ ₯은 ν•œλ²ˆλ§Œ λœλ‹€. ν•˜μ§€λ§Œ μ œκ±°λŠ” 3개 λͺ¨λ‘ λ‹€ λ˜μ—ˆλ‹€.

-- μ‚¬μš©. ν•œ ν–‰λ§ˆλ‹€ 좜λ ₯λœλ‹€.
create or replace trigger trgMen
    after
    update
    on tblMen
    for each row
begin
    dbms_output.put_line('λ ˆμ½”λ“œλ₯Ό μˆ˜μ •ν–ˆμŠ΅λ‹ˆλ‹€. > ' || :old.name);
    dbms_output.put_line('μˆ˜μ •ν•˜κΈ° μ „ λ‚˜μ΄: ' || :old.age);
    dbms_output.put_line('μˆ˜μ •ν•œ ν›„ λ‚˜μ΄: ' || :new.age);
end trgMen;

update tblMen set age = age + 1 where name = '홍길동';

update tblMen set age = age + 1;

ex31_account

μƒˆλ‘œμš΄ 계정을 λ§Œλ“€κ³  κΆŒν•œμ„ 생성, μ‚­μ œν•˜λŠ” 것을 λ°°μ› λ‹€.

μ‚¬μš©μž κ΄€λ ¨

  • DCL
  • 계정 생성, μ‚­μ œ λ“± μ œμ–΄
  • λ¦¬μ†ŒμŠ€ μ œμ–΄ κΆŒν•œ

ν˜„μž¬ μ‚¬μš© 계정

  • system
  • hr

ν”„λ‘œμ νŠΈ > 계정 생성

μ‚¬μš©μž 계정 μƒμ„±ν•˜κΈ°

  • μ‹œμŠ€ν…œ κΆŒν•œμ„ 가지고 μžˆλŠ” κ³„μ •λ§Œ κ°€λŠ₯ν•˜λ‹€. > κ΄€λ¦¬μžκΈ‰ > system
  • 계정 생성 κΆŒν•œμ„ 가지고 μžˆλŠ” 일반 계정도 κ°€λŠ₯ν•˜λ‹€.
  • DB Object

  • create user 계정λͺ… identified by μ•”ν˜Έ; //계정 생성
  • alter user 계정λͺ… identified by μ•”ν˜Έ; //μ•”ν˜Έ λ³€κ²½
  • alter user 계정λͺ… account unlock; //계정 잠금 ν•΄μ œ
  • alter user 계정λͺ… account lock; //계정 잠금 μ„€μ •

  • μƒˆλ‘œ λ§Œλ“  계정 > 아무 κΆŒν•œμ΄ μ—†λ‹€. > 접속할 κΆŒν•œλ„ μ—†λ‹€.

μ‚¬μš©μžμ—κ²Œ κΆŒν•œ λΆ€μ—¬ν•˜κΈ°

  • grant κΆŒν•œ to μœ μ €λͺ…;

μ‚¬μš©μžμ—κ²Œ κΆŒν•œ μ œκ±°ν•˜κΈ°

  • revoke κΆŒν•œλͺ… from μœ μ €λͺ…;

  1. 단일 κΆŒν•œ
  • create user
  • drop user
  • drop any table
  • create session -- 접속 κΆŒν•œμ„ μ£ΌλŠ” 이름
  • create table
  • create view
  • create sequence
  • create prodedure
  1. κΆŒν•œ 집합 > Role
  • connect > μ‚¬μš©μž DB 접속 + 기본적 행동
  • resource > ν…Œμ΄λΈ” λ“± 객체 μ‘°μž‘
  • dba > μ€€κ΄€λ¦¬μžκΈ‰ κΆŒν•œ
create user hong identified by java1234; -- ORA-01031: insufficient privileges > hr

grant create session to hong;

grant create table to hong;

revoke create session from hong;


-- ν”„λ‘œμ νŠΈ 진행 > ν”„λ‘œμ νŠΈμš© 계정 생성
create user team identified by java1234;

grant connect, resource, dba to team; -- hrκ³Ό λΉ„μŠ·ν•œ 계정 μœ ν˜•

alter user team account lock; -- 잠금
alter user team account unlock;

DB ν”„λ‘œμ νŠΈ

ꡐ사와 κ΅μœ‘μƒ κΈ°λŠ₯ 뢀뢄에 λŒ€ν•œ μš”κ΅¬μ‚¬ν•­ 뢄석을 λ§ˆμ € μ§„ν–‰ν–ˆλ‹€. 그리고 μ–΄λ–€ ν…Œμ΄λΈ”μ„ μ–΄λ–€ κ΄€κ³„λ‘œ λ§Œλ“€μ§€ νšŒμ˜ν•œ 후에 κ°œλ… λͺ¨λΈλ§μ„ μ§„ν–‰ν–ˆλ‹€.

λ©΄μ ‘ 질문

κ²½ν—˜ 기반 λ©΄μ ‘ λŒ€λΉ„ν•˜κΈ°.
ex) μ €μž₯ ν”„λ‘œμ‹œμ €, μ €μž₯ ν•¨μˆ˜λ₯Ό 직접 써본 것과 써보고 λ“  생각 λ§ν•˜κΈ°
ν•œ ν”„λ‘œμ νŠΈμ— ν•˜λ‚˜μ”© μ‚¬μš©ν•˜κ³  어디에 μ‚¬μš©ν–ˆλŠ”μ§€ μ•Œκ³  있기.
μ–΄λ–€ κ²½ν—˜μ„ ν–ˆλŠ”μ§€ 묻지 μ•Šμ•„λ„ μ§ˆλ¬Έμ— λŒ€ν•œ 닡에 κ²½ν—˜μ„ 덧뢙이면 합격 ν™•λ₯ μ΄ μ˜¬λΌκ°„λ‹€.

profile
μ°¨κ·Όμ°¨κ·Ό ν•˜λ‚˜μ”©

0개의 λŒ“κΈ€