IO Redirection

: output 될 결과물의 방향을 돌리는 것이라고 생각하자.

예 1)  ls -l > result.txt  

ls -l 을 입력하여 화면에 출력할 결과물을  result.txt 파일에 작성하게 해준다.

이 때 > Standard Output의 경우, 꺾쇠 앞에는 1이 생략되어있다.  

1> 디폴트 값이 1이다. 

2> 2가 되면 Standard Error 를 의미한다.

여기서 ls 가 Unix Process 이다.  이 프로그램에 -l 인자 ( Command-line Arguments )를 넘겨주는 것으로 보면된다.


rm result.txt  로 rm 명령어를 사용하여 result.txt를 삭제해주자.

이 상태에서 다시 rm result.txt를 입력하면 에러내용이 화면에 출력된다.

이렇게 화면에 출력된 에러를 redirection 시켜줄려고 하면 

rm result.txt > error.log 이렇게 하면 될까 ?

안된다.  왜냐하면 error 의 경우에는 standard output Data가 아니기때문이다. 이 때는 꺾쇠 앞에 2를 붙여야 한다.

꺾쇠 앞 2의경우 Standard errorredirection을 의미한다. 


예 2) rm reult.txt 2> error.log로 이 상황을 해결해야한다. 


>> 꺾쇠가 두개면?????

예 3)  ls -l >> result.txt 

ls -l 을 입력하여 수행된 결과를 result.txt 파일에 덮어쓰기 한 것이 아니라,  append 하는 것이다.

덧 붙인다. 기존의 내용을 그대로 두고 !!




순차적 프로그래밍 ( 프로세싱)

 - 하나의 프로그램 결과를 > 다른 프로그램의 입력으로 ..  

 - 하나의 명령 실행결과를 > 다른 명령의 입력으로 ..

 - 하나의 process 출력을 > 다른 process의 입력으로 제공 하는 형태 


파이프 (Pipe) , 파이프라인 (Pipeline)

 - 둘 이상의 명령을 묶어 출력의 결과를 다른 프로그램의  입력으로 전환하는 기능 

 - 즉,  명령어의 표준 출력을 또다른 명령어의 표준 입력과 연결시킬 수 있다. 

 

실습 

 1. ls -l  : 해당위치에서 디렉터리 및 파일 목록을 화면에 출력해준다. 

 2. ls -l  |  grep sort  해당 위치에서 디렉터리 및 파일 목록을 화면에 출력해주는데, sort라는 문자열이 속한 행만 화면에 출력해준다. 

 3. ls -l  |  grep sort  |  grep file  해당 위치에서디렉터리 및 파일목록을 화면에 출력해주는데, sort라는 문자열이 속하면서 file이라는 문자열이 동시에 속

한 행을 화면에 출력해준다.


1. cat 해당 파일의 내용을 화면에 출력한다. 

2. grep [옵션] [문자열] [찾기대상이 될 파일명]

: 파일에서 특정한 패턴(문자열)을 찾는 명령로써, 이는 해당 문자열이 들어있는 파일을 찾아 그 문자열이 들어가 있는 라인을 화면에 출력한다. 


ex) grep test test2222.txt


※ 명령어들도 하나의 프로그램인 것 알아두자. 

왜 서버와 같은 컴퓨터는 CLI환경의 프로그램을 쓰는가 ? (TUI, CLI 프로그램의 장점)

1. GUI 환경의 운영체제는 리소스를 많이 잡아먹는다. 

2. 순차적프로그래밍을 진행하고 싶을 경우, 진행되고있는 해당 프로그램이 완전히 끝난 것을 직접 체크해야한다.

3. 명령어를 사용하여 프로그램을 구성하면 특정 작업이 진행되는동안을 직접적으로 보고있지 않아도된다. 명령어가 끝난 결과만을 확인해주면된다.



 1) 실습 

 mkdir -p /chpark/test1; cd test1 


이렇게 세미콜론을 사용하여 일련의 명령들을 연속적으로 수행시킬수 있다.  굳이 한 명령의 결과를 기다리고 있다가 다른 명령을 실행하지 않고도 

연속적으로 진행이된다. 


 

리눅스 CLI , TUI 환경에서 파일 다운로드 (wget, git) 이용


https://opentutorials.org/course/2598/14188

■ 설치된 패키지 목록 확인 

 # dpkg -l 


 apache2 관련 패키지 목록만 확인해보자.

 # dpkg -l |grep apache2


■ Advanced Packaging Tool

  A. apt-cache  

      apt-cache search [패키지명]

      (ex. # apt-cache search tomcat)


  B. apt-get

     apt-get install [패키지명]

(ex. # apt-get install tomcat7)


# apt-get update;  - 최신상태의 패키지매니저 목록을 보여준다. 

# apt-cache search htop - htop과 관련된 패키지가 있는지를 찾아본다. (패키지 스토어에서)

# apt-get install htop - 설치되어있지 않으면 해당 패키지를 설치하면된다.

# apt-get upgrade htop  - 이미 설치되어있는 패키지 프로그램에 대하여 버전 업그레이드를 하고싶을경우에 업그레이드 명령을 사용하면된다.

# apt-get remove htop - htop 패키지를 제거해보자.



sudo 명령어는 유닉스 및 리눅스 계열에서 다른 사용자의 보안권한과 관련된 프로그램을 구동할 수 있게 해주는 프로그램이다.


Substitute user do 의 줄임말로 다른사용자의 권한으로 명령을 이행하라는 뜻이다.


사용목적 : 관리자(root)가 특정 사용자(특정 그룹)에게 특정 명령(명령그룹)을 root계정으로 실행할 수 있는 권한부여

 

작동 원리 : sudo명령어다음에 사용하고자 하는 명령어를 입력하면, sudo유틸리티는 구성파일인 /etc/sudoers 파일내에 현재 호스트에서 그 명령어를 사용하는 것이 허가 되어 있는지를 확인한뒤, 허가 되어 있으면 패스워드를 입력하여 사용하도록 함.


결론 :  Linux sudo 명령어는 일반 사용자가 패스워드없이 root 권한의 명령어를 실행할 수 있다.



1. 패키지를 사용해야 하는 이유

 1) 정보 은닉화

 2) 유지보수의 용이성 

 3) 성능 향상

 4) 오버로딩 가능 


2. 패키지 구성요소

 1) 명세 (spec) : body 에서 구현 할 프로시저, 함수, 전역변수의 이름을 선언

 2) 몸체 (body): 실제 구현코드 ( 프로시저 , 함수 ) 



3. 패키지의 오버로딩 명세 (spec) 예제 

CREATE OR REPLACE PACKAGE OVER_PACK

IS

PROCEDURE ADD_DEPT

( P_DEPT_NO IN DEPT.DEPT_NO%TYPE ,

 P_DEPT_NM IN DEPT.DEPT_NM%TYPE DEFAULT 'UNKNOWN',

 P_LOC IN DEPT.LOC%TYPE DEFAULT 0);


PROCEDURE ADD_DEPT

( P_DEPT_NM IN DEPT.DEPT_NM%TYPE DEFAULT 'UNKNOWN',

 P_LOC IN DEPT.LOC%TYPE DEFAULT 0);

END OVER_PACK;

/



CREATE TABLE LOGIN_INFO 

  ( USER_ID VARCHAR2(20),

    LOGIN_DATE DATE,

    ACTION VARCHAR2(50) );



1. 오라클에 접속할 때마다 LOGIN_INFO 테이블에 접속정보가 남겨지게 하시오.


CREATE OR REPLACE TRIGGER LOGIN_INFO

  AFTER LOGON ON DATABASE

BEGIN 

  INSERT INTO LOGIN_INFO

  VALUES ('CHPARK',TO_CHAR(SYSDATE,'YYYYMMDDHH24MISS'),'로그인 액션 취함');

END;

/



2. DB를 SHUTDOWN 하기 전에 LOGIN_INFO 테이블에 접속정보가 남겨지게 하시오.


CREATE OR REPLACE TRIGGER LOGIN_INFO

 BEFORE SHUTDOWN ON DATABASE

BEGIN 

  INSERT INTO LOGIN_INFO

  VALUES ('CHPARK',TO_CHAR(SYSDATE,'YYYYMMDDHH24MISS'),'로그인 액션 취함');

END;

/

1. Trigger (트리거) 의 종류

1) DML 트리거

2) DDL 트리거

3) DB  작업에 대한 트리거 ( log on, log off, startup, shutdown ) 


트리거란 ?

1) INSERT, UPDATE, DELETE 문이 TABLE에 대해 묵시적으로 수행되는 PROCEDURE이다.

2) 트리거는 TABLE과는 별도로 DATABASE에 저장된다.

3) 트리거는 VIEW에 대해서가 아니라 TABLE에 관해서만 정의될 수 있다. 

4) 행트리거 : 컬럼의 각각의 행의 데이터 행 변화가 생길 때마다 실행되며, 그 데이터 행의 실제값을 제어할 수 있다. 

5) 문장 트리거 : 트리거 사건에 의해 단 한번 실행되며, 컬럼의 각 데이터 행을 제어할 수 없다. 


==========================================================


트리거 문법 


CREATE OR REPLACE TRIGGER 트리거명

BEFORE | AFTER

트리거이벤트[ INSERT | UPDATE | DELETE ] (OF 컬럼명ON 테이블명

FOR EACH ROW

WHEN ( CONDITION )

[ PL/SQL BLOCK ]


==========================================================




- DML 트리거의 사용 예    

==========================================================

예제 1. 


CREATE OR REPLACE TRIGGER TRIG_TEST_EMP

  BEFORE INSERT OR UPDATE OF SAL ON TB_LS_EMP867


BEGIN 


-- IF문을 사용해서 트리거를 공통으로 사용할 수있다. 혼합트리거 

-- 사용자정의 예외처리


  IF (TO_CHAR(SYSDATE,'DY') IN ('토','일')) 

  THEN RAISE_APPLICATION_ERROR(- 20003,'토요일, 일요일에는 데이터 갱신을 할 수 없습니다.');

  END IF;

  

  IF (TO_CHAR(SYSDATE,'HH24MI') NOT BETWEEN '09:00' AND '11:30' ) 

  THEN RAISE_APPLICATION_ERROR(- 20005,' 오전업무시간 외에는 수정할 수 없습니다.');

  END IF;

  

END;


SQL >  SELECT * FROM TB_LS_EMP867;

SQL >  UPDATE TB_LS_EMP867 

  SET SAL = '3000000'

  WHERE EMP_NO = 20;  

SQL >  SELECT * FROM TB_LS_EMP867;



============================================================




예제 2. 사원테이블의 부서를 갱신하면, 변경되기 전 월급과 변경 후의 월급이 TB_LS_EMP867_HIST

테이블에 입력되게 하시오.


2-1. 테이블 생성을 먼저 해주자. 


CREATE TABLE TB_LS_EMP867_HIST

( EMP_NO NUMBER(8), 

  OLD_DEPT_NO NUMBER(4)

  NEW_DEPT_NO NUMBER(4), 

  WR_DTM VARCHAR2(14));


2-2. 트리거 생성을 해주자. 


CREATE OR REPLACE TRIGGER TRIG_EDIT_DEPT

AFTER UPDATE OF DEPT_NO ON TB_LS_EMP867

FOR EACH ROW


  • :old - refers to Old Value
  • :new - refers to New value


BEGIN  

INSERT INTO TB_LS_EMP867_HIST 

VALUES ( :OLD.EMP_NO, :OLD.DEPT_NO, :NEW.DEPT_NO, TO_CHAR(SYSDATE ,'YYYYMMDDHH24MISS') );


-- 트리거에서는 이곳에 COMMIT을 하면 에러가 발생한다. 


END;

/


SQL > UPDATE TB_LS_EMP_SET ....으로 테스트


============================================================


예제 3. TB_LS_EMP867_DELETE 테이블을 생성하고 TB_LS_EMP867 의 데이터를 삭제하면,

삭제한 레코드 중 EMP_NO, DEPT_NO, SAL 데이터가  TB_LS_EMP867_DELETE 테이블에 입력하되게 

TRIGGER를 생성하시오.


2-1. 테이블 생성을 먼저 해주자. 


CREATE TABLE TB_LS_EMP867_DELETE

( EMP_NO NUMBER(8), 

  DEPT_NO NUMBER(4)

  SAL NUMBER(12), 

  WR_DTM VARCHAR2(14));



2-2. 트리거 생성을 해주자. 



CREATE OR REPLACE TRIGGER TRIG_DEL_EMP_INFO

AFTER DELETE ON TB_LS_EMP867

FOR EACH ROW


  • :old - refers to Old Value
  • :new - refers to New value


BEGIN 

INSERT INTO TB_LS_EMP867_DELETE

VALUES (:OLD.EMP_NO, :OLD.DEPT_NO, :OLD.SAL, TO_CHAR(SYSDATE ,'YYYYMMDDHH24MISS') );


END;

/


SQL > DELETE FROM TB_LS_EMP_SET ....으로 테스트



============================================================


- DDL 트리거 예제


예제 1. TB_LS_EMP867 테이블을 DROP 혹은 ALTER 작업이 수행되지 않도록 TRIGGER(트리거) 를 생성하라.

CREATE OR REPLACE TRIGGER NO_DDL

BEFORE DROP OR ALTER ON chpark.SCHEMA

BEGIN 

RAISE_APPLICATION_ERROR(-20010,'테이블을 삭제하거나 변경할 수 없습니다.');

END;

/


SQL > DROP TABLE TB_LS_EMP867;  으로 테스트 



+ Recent posts