linux - gcc와 make

System/Linux 2012. 7. 16. 09:50

'System > Linux' 카테고리의 다른 글

linux - 표준 출력 및 에러 재지향  (0) 2012.07.16
linux - scp 사용법  (0) 2012.07.16
centos - python 2.6.x 설치  (1) 2012.07.13
CentOS - RPMforge EPEL Remi 저장소 설치  (0) 2012.07.13
linux - 프로세스 디버깅  (0) 2012.07.09
Posted by linuxism
,


트리거(Trigger)란?

트리거(Trigger)의 원 의미는 ‘방아쇠’이다. 데이터베이스에서 트리거는 바로 이러한 의미를

유추한다면 어떤 역할을 하는지 쉽게 짐작할 수 있을 것이다.

데이터베이스에서 트리거는 특정 이벤트(event)나 DDL, DML 문장이 실행되었을 때, 자동

적으로 어떤 동작(Operation)이나 처리를 수행하도록 하는 데이터베이스 객체의 하나이다.

일반적으로 트리거는 임의의 테이블에 데이터를 추가(insert), 삭제(delete), 갱신(delete) 할

때, 또 다른 테이블에 있는 데이터를 자동적으로 조작할 경우에 사용된다. 이러한 경우 가

장 흔히 사용되는 형태가 로그(log) 정보를 기록하는 경우이다.

예를 들어보자.

신규 사원을 등록하려면 employees 테이블에 데이터를 한 건 입력해야 한다. 그런데, 신규

사원을 등록(입사처리)하거나 삭제(퇴사처리)할 경우, 누가, 언제 작업 했는지를 기록해야

한다고 하자. 이러한 경우 일반적으로 로그 테이블을 별도로 생성하여 그 정보를 기록해 두

는데, 입사처리를 수행한 뒤 로그 테이블에 또 다시 정보를 기록하는 일은 단순한 작업이면

서도 번거로운 작업이다. 따라서 로그 테이블에 정보를 저장하는 작업을 자동화 하는 것이

여러 모로 좋은 방법이라 할 수 있다. 물론 이러한 로그 정보처리는 어플리케이션에서 처리

할 수도 있지만, 데이터베이스 상에서 직접 처리한다면 훨씬 더 효율적일 것이다. (마치 저

장 프로시져를 사용하거나 테이블의 컬럼에 디폴트 속성을 넣는 것처럼) 바로 이러한 경우

에 트리거를 사용하여 처리하게 된다.

2. 트리거의 사용

간단한 예를 들어, 트리거에 대해 좀 더 자세히 살펴보도록 하자.

먼저 employees 테이블에 있는 정보에 변경사항이 가해질 경우 이 내용을 저장하는 로그

테이블을 만들어 보자.

CREATE TABLE emp_logs (

employee_id NUMBER, /* 사번 */

user_name VARCHAR2(30), /* 작업자 */

proc_type VARCHAR2(30), /* 작업 유형 (insert, update, delete) */

proc_date DATE DEFAULT SYSDATE); /* 작업일자 */

이제 employees 테이블에 데이터를 신규 입력할 경우 emp_logs 테이블에 해당 정보를 저

장하는 트리거를 만들어 보자.

CREATE OR REPLACE TRIGGER emp_logs_tr

BEFORE INSERT ON employees

FOR EACH ROW

WHEN (new.employee_id > 0)

DECLARE

v_user varchar2(10);

BEGIN

SELECT USER

INTO v_user

FROM DUAL;

INSERT INTO emp_logs (employee_id, user_name, proc_type)

VALUES ( :new.employee_id, v_user, 'INSERT');

END;

트리거는 특정한 처리를 하는 데이터베이스 객체이므로, 저장 프로시져와 그 형태가 비슷하

다 할 수 있다. emp_logs_tr 이란 이름의 트리거는 employees 테이블에 데이터를 insert

할 경우 작동해서, 신규로 입력되는 사원번호(:new.employee_id), 작업자(v_user), 작업유

형(‘INSERT’) 정보를 emp_logs 테이블에 저장하고 있다. 트리거 생성 구문을 자세히 알아

보자.

• CREATE OR REPLACE : 뷰나 프로시져 생성 처럼 이 구문을 사용하여 트리거 내용을

수시로 변경할 수 있다. 즉 DROP 하고 다시 생성할 필요가 없다.

• BEFORE : 트리거를 언제 실행시킬지를 명시한다. BEFORE나 AFTER를 명시할 수 있는

데, 위 트리거의 경우 employees 테이블에 신규 데이터를 넣기 전에 실행된다. 즉 신규 데

이터를 데이터 파일에 쓰기 전에 수행된다.

• INSERT ON : INSERT 문이 실행되었을 경우 트리거를 수행하라는 의미이다. 만약

INSERT와 UPDATE 모두에 해당될 경우에는 ‘INSERT OR UPDATE ON’ 처럼 OR 를 사

용하여 명시할 수 있다.

• FOR EACH ROW : employees 테이블에서 변경이 되는 각각의 로우에 대해 트리거가 수

행됨을 의미한다. 예를 들어, INSERT도 마찬가지지만 UPDATE나 DELETE의 경우 한 번

의 SQL문 수행에 의해 여러 개의 로우가 변경될 수 있다. 이러한 경우 변경이 가해진 로우

각각에 대해 트리거가 수행됨을 의미한다. 즉 10개의 로우가 변경되면 트리거가 10번이 수

행되게 된다. 이러한 유형의 트리거를 로우 트리거라고 하며, 변경된 로우의 수에 상관없이

한 번만 수행되는 유형의 트리거를 STATEMENT 트리거라 한다.

• WHEN : INSERT나 UPDATE, DELETE가 수행되었을 때, 무조건 트리거는 실행되지만

특정 조건을 만족할 때만 수행하도록 할 수 있는데, 이러한 경우 WHEN 다음에 조건을 명

시한다.

• NEW : 트리거에서만 사용할 수 있는 구문으로 new.employee_id 가 의미하는 것은 새로

입력되는 employee_id 값을 말한다. New와 반대 개념으로 old를 사용할 수 있는데, 이는

변경되기 전의 값을 가리킨다.

그럼 실제로 데이터를 입력하여 트리거가 작동되는지 살펴보자.

INSERT INTO employees ( employee_id, first_name, last_name, email,

hire_date, job_id, salary, department_id)

VALUES ( 300, '세종', '대왕', 'king', sysdate, 'AD_VP', 2000, 10);

1 rows inserted.

SELECT employee_id, first_name, last_name

FROM employees

WHERE employee_id = 300;

EMPLOYEE_ID FIRST_NAME LAST_NAME

----------------- ----------------- -------------------------

300 세종 대왕

1 rows selected

로그 테이블도 확인해 보자.

SELECT * FROM emp_logs;

EMPLOYEE_ID USER_NAME PROC_TYPE PROC_DATE

------------ ----------- ------------- -------------------

300 HR INSERT 2008-01-21 13:38:37

1 rows selected.

INSERT 문장에 의해 트리거가 수행되어 로그 테이블에 데이터가 저장되었음을 확인할 수

있다. 마찬가지로 UPDATE나 DELETE 문이 수행될 때에도 동작하는 트리거를 다음과 같

이 생성할 수 있다.

CREATE OR REPLACE TRIGGER emp_logs_tr2

BEFORE DELETE ON employees

FOR EACH ROW

WHEN (new.employee_id > 0)

DECLARE

v_user varchar2(10);

BEGIN

SELECT USER

INTO v_user

FROM DUAL;

INSERT INTO emp_logs (employee_id, user_name, proc_type)

VALUES ( :new.employee_id, v_user, 'DELETE');

END;

HR 스키마에 있는 JOB_HISTORY란 테이블은 각 사원별로 부서와 직급이 변경된 내역의

정보를 가지고 있다. 다시 말한다면 임의의 한 사원의 부서(DEPARTMENT_ID)나 직급

(JOB_ID) 값이 변경되면 JOB_HISTORY 테이블에 데이터가 한 건 입력이 된다. 이러한 경

우, 트리거를 사용하면 쉽게 처리할 수 있다.

HR 스키마에는 UPDATE_JOB_HISTORY 란 트리거가 있는데, 이는 EMPLOYEES 테이블

의 JOB_ID 컬럼값에 변경이 가해지면, 이 내용을 JOB_HISTORY 테이블에 기록하게 된다.

UPDATE_JOB_HISTORY란 트리거를 살펴보자.

CREATE OR REPLACE TRIGGER "HR".update_job_history

AFTER UPDATE OF job_id, department_id ON employees

FOR EACH ROW

BEGIN

add_job_history(:old.employee_id, :old.hire_date, sysdate,

:old.job_id, :old.department_id);

END;

위 트리거는 EMPLOYEES 테이블의 JOB_ID, DEPARTMENT_ID 값을 변경할 경우

(UPDATE 문을 수행할 경우), ADD_JOB_HISTORY란 프로시져를 호출하여 JOB_HISTORY

테이블에 변경된 내역을 저장하고 있음을 보여주고 있다.

이렇듯 트리거는 특정한 경우 매우 유용하게 사용할 수 있는 데이터베이스 객체의 하나라

할 수 있다.


출처 - http://www.google.co.kr/url?sa=t&rct=j&q=%ED%8A%B8%EB%A6%AC%EA%B1%B0&source=web&cd=2&ved=0CCoQFjAB&url=http%3A%2F%2Fwww.hanb.co.kr%2Fbrain%2Fboard%2Fdown_file.php%3Fmcf_id%3D73%26mt_id%3D272&ei=e3UCUOWXFKf8mAWwhOnrCQ&usg=AFQjCNGl9r9XvtugsiaMcOXVvoqX_tnI7g&cad=rjt

'DB > Oracle' 카테고리의 다른 글

oracle - sqldeveloper in fedora  (0) 2015.09.24
오라클 11g 기본 계정  (0) 2012.03.13
뇌를 자극하는 오라클 프로그래밍 내용 정리  (0) 2012.02.29
Pro*C 개요  (0) 2012.02.24
Pro*C 파헤치기  (0) 2012.02.24
Posted by linuxism
,


파이썬 2.6 설치

파이썬 2.6 소스 패키지 다운로드, 압축해제 그리고 작업디렉토리 진입:

 

  1. $ cd
    $ wget http://www.python.org/ftp/python/2.6.2/Python-2.6.2.tgz
    $ tar xvfz Python-2.6.tgz
    $ cd Python-2.6

 

기존 시스템 설치 파이썬을 덮어쓰지 않도록 파이썬 2.6 설정:

 

$ ./configure --prefix=/opt/python2.6 --with-threads --enable-shared

컴파일 후 설치:

$ make
$ make install

root의 .bash_profile에 alias 추가:

alias python='/opt/python2.6/bin/python'

 

※ .bash_profile 에 추가된 alias 는 해당 계정으로 다시 로그인을 해야 적용된다.

 

심볼릭 링크 생성:

$ ln -s /opt/python2.6/bin/python /usr/bin/python2.6

 

ld가 공용라이브러리를 찾을 수 있도록 설정:

$ cat >> /etc/ld.so.conf.d/opt-python2.6.conf
/opt/python2.6/lib (hit enter)
(hit ctrl-d to return to shell)
$ ldconfig

 

설치된 파이썬 2.6 설치 테스트:

$ python

 

아래와 같은 파이썬 2.6 인터랙티브 세션이 나타난다:

 

Python 2.6.2 (r262:71600, Aug  5 2009, 00:51:31)

[GCC 4.1.2 20080704 (Red Hat 4.1.2-44)] on linux2

Type "help", "copyright", "credits" or "license" for more information.

>>>

Hit ctrl-d to exit

 

http://hdformat202.springnote.com/pages/3971699


출처 - http://blog.naver.com/PostView.nhn?blogId=aries84&logNo=100157702157


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


CentOS 5.3 + Python 2.6 + modwsgi + django 1.1 설치

 

Matt Reiferson 와 Eric Farkas 가 운영하는 Perplexed Labs 의

'Setup Python 2.5, mod_wsgi, and Django 1.0 on CentOS 5 (cPanel)' 을 참조하여 작성

http://blog.perplexedlabs.com/2008/11/10/setup-python-25-mod_wsgi-and-django-10-on-centos-5-cpanel/

 

CentOS 5.3 설치

 

엔터 + 엔터 + ... + 엔터 완료

 

  1. $ yum groupinstall "Web Server"
  2. $ yum groupinstall "MySQL database"

 

Python 2.6 설치

 

파이썬 2.6 의존 프로그램 설치

 

sqlite3 설치:

 

  1. $ wget http://www.sqlite.org/sqlite-amalgamation-3.6.16.tar.gz
    $ tar xvfz sqlite-amalgamation-3.6.16.tar.gz
    $ cd sqlite-3.6.16
    $ ./configure
    $ make
    $ make install

 

파이썬 2.6 설치

 

파이썬 2.6 소스 패키지 다운로드, 압축해제 그리고 작업디렉토리 진입:

 

  1. $ cd
    $ wget http://www.python.org/ftp/python/2.6.2/Python-2.6.2.tgz
    $ tar xvfz Python-2.6.tgz
    $ cd Python-2.6

 

기존 시스템 설치 파이썬을 덮어쓰지 않도록 파이썬 2.6 설정:

 

$ ./configure --prefix=/opt/python2.6 --with-threads --enable-shared

컴파일 후 설치:

 

$ make
$ make install

root의 .bash_profile에 alias 추가:

 

alias python='/opt/python2.6/bin/python'

 

※ .bash_profile 에 추가된 alias 는 해당 계정으로 다시 로그인을 해야 적용된다.

 

심볼릭 링크 생성:

 

$ ln -s /opt/python2.6/bin/python /usr/bin/python2.6

 

ld가 공용라이브러리를 찾을 수 있도록 설정:

 

$ cat >> /etc/ld.so.conf.d/opt-python2.6.conf
/opt/python2.6/lib (hit enter)
(hit ctrl-d to return to shell)
$ ldconfig

 

설치된 파이썬 2.6 설치 테스트:

 

$ python

 

아래와 같은 파이썬 2.6 인터랙티브 세션이 나타난다:

 

Python 2.6.2 (r262:71600, Aug  5 2009, 00:51:31)

[GCC 4.1.2 20080704 (Red Hat 4.1.2-44)] on linux2

Type "help", "copyright", "credits" or "license" for more information.

>>>

Hit ctrl-d to exit

 

setuptools 설치:

 

  1. $ cd
  2. $ wget http://pypi.python.org/packages/2.6/s/setuptools/setuptools-0.6c9-py2.6.egg
  3. $ sh setuptools-0.6c9-py2.6.egg --prefix=/opt/python2.6

 

MySQLdb 패키지 설치:

 

  1. $ cd
    $ wget http://sourceforge.net/projects/mysql-python/files/mysql-python-test/1.2.3c1/MySQL-python-1.2.3c1.tar.gz/download
    $ tar xvfz MySQL-python-1.2.3c1.tar.gz
    $ cd MySQL-python-1.2.3c1
    $ python setup.py build
    $ python setup.py install

 

1. 빌드 과정 중 에러가 발생하면 MySQL-dev 관련 패키지를 추가로 설치한다. (yum install mysql-dev*)

2. $ python2.6 setup.py build 시  /usr/bin/ld: cannot find -lpython2.6 에러발생하면 python2.6 setup.py build_ext --library-dirs=/opt/python2.6/lib/ 시도

 

PIL(Python Image Library) 설치

 

  1. $ cd
  2. $ wget http://effbot.org/downloads/Imaging-1.1.6.tar.gz
  3. $ tar xvfz Imaging-1.1.6.tar.gz
  4. $ cd Imaging-1.1.6
  5. $ python setup.py install

 

파이썬 2.6 설치 검증:

 

  1. $ cd
    $ python
    Python 2.6.2 (r262:71600, Aug  5 2009, 00:51:31)
    [GCC 4.1.2 20080704 (Red Hat 4.1.2-44)] on linux2
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import sqlite3
    >>> import MySQLdb
    >>> import Image
  2. >>>

 

MySQLdb 임포트시 경고 메시지가 출력되는 경우가 있는데 재로그인 하면 사라진다. (이유는 모름. 누가 설명 좀.)

 

mod_wsgi 설치

 

mod_wsgi 다운로드:

 

  1. $ cd
    $ wget http://modwsgi.googlecode.com/files/mod_wsgi-2.5.tar.gz
    $ tar xvfz mod_wsgi-2.5.tar.gz

 

mod_wsgi가 파이썬 2.6 공용라이브러리를 링크하도록 설정

 

  1. $ cd /opt/python2.6/lib/python2.6/config
    $ ln -s ../../libpython2.6.so .

 

configure 실행

 

  1. $ cd
    $ cd mod_wsgi-2.5
    $ ./configure --with-python=/opt/python2.6/bin/python

 

apx가 없다고 에러메시지가 나올 경우 httpd-dev 관련 패키지를 추가로 설치한다. (yum install httpd-dev*)

 

컴파일 후 설치:

 

  1. $ make
    $ make install

 

컴파일 확인

 

mod_wsgi.so의 사이즈가 약250kb인지 확인:

 

$  ls -Al /etc/httpd/modules/mod_wsgi.so

-rwxr-xr-x 1 root root 338629  8월  5 01:24 /etc/httpd/modules/mod_wsgi.so

 

반드시 250kb 여야 하는 건 아닌 듯 하다. (필자의 경우 32bit CentOS 5.3 에선 250kb였으나 64bit CentOS 5.2에선 340Kb 정도로 컴파일됨)

 

아파치 2.x 설정에 mod_wsgi 추가:

 

/etc/http/conf/httpd.conf 파일에 다음 내용을 추가한다.

 

  1. LoadModule wsgi_module modules/mod_wsgi.so
  2. AddHandler wsgi-script .wsgi

 

변경된 설정으로 httpd 서버를 재시동한다.

 

  1. $ service httpd restart
    httpd 를 정지 중:                                         [  OK  ]
    httpd (을)를 시작 중:                                     [  OK  ]

 

mod_wsgi 설치 검증:

 

CentOS 기본 웹서버 문서 디렉토리인 /var/www/html 에 vi 등을 통해 다음 내용을 입력하고 test.wsgi 란 이름으로 저장한다.

 

  1. def application(environ, start_response):
        status = '200 OK'
        output = 'Hello World! +_+'

        response_headers = [('Content-type', 'text/plain'),
                            ('Content-Length', str(len(output)))]
        start_response(status, response_headers)

        return [output]

 

httpd.conf 에 다음 내용을 추가한다.

 

  1. WSGIScriptAlias /myapp /var/www/html/test.wsgi

 

브라우저에서 http://localhost/myapp 로 접근하면 다음과 같은 내용이 출력된다.

 

Clipboard01.png

 

django 설치를 위한 추가 검증:

 

위 단계에서 생성한 test.wsgi 파일의 상단에 import socket 을 추가한다.

 

  1. import socket
  2. def application(environ, start_response):
        status = '200 OK'
        output = 'Hello World! +_+'

        response_headers = [('Content-type', 'text/plain'),
                            ('Content-Length', str(len(output)))]
        start_response(status, response_headers)

        return [output]

 

브라우저에서 접근시 서버 에러가 발생하면 시스템 보안설정으로 인한 오류이므로 lokkit 명령어 등을 통해 SELINUX 보안을 해제시켜준다.

 

django 1.1 설치

 

본 예제에선 다음과 같은 환경 하에서의 설치를 가정한다.

 

서버 도메인 : luckyzzang.com

사용자 : kangunma

사용자의 도메인 : kangunma.luckyzzang.com

 

django 프로젝트 디렉토리 생성:

 

django 프로젝트들이 놓일 디렉토리를 생성한다. 예제에선 sites 로 가정한다.

 

  1. $ mkdir -p /home/kangunma/sites/

 

프로젝트 디렉토리에 django를 svn으로 설치:

 

  1. $ cd /home/kangunma/sites/
    $ svn co http://code.djangoproject.com/svn/django/trunk/ django-trunk
    $ ln -s django-trunk/django django
    $ mkdir .python-eggs
    $ chmod 777 .python-eggs

 

django-admin.py로 프로젝트를 생성:

 

  1. $ /home/kangunma/sites/django/bin/django-admin.py startproject 108combo

 

사용자의 .bash_profile 설정:

 

사용자 홈 디렉토리의 .bash_profile에 다음과 같은 내용을 추가한다.

 

  1. alias python='/opt/python2.6/bin/python'
    export PYTHONPATH='$PYTHONPATH:/home/kangunma/sites/'

 

.bash_profile 에 추가된 alias 는 해당 계정으로 다시 로그인을 해야 적용된다.

 

mod_wsgi를 통해 django 프로젝트가 실행될 수 있도록 설정:

 

mod_wsgi를 통해 wsgi 스크립트를 동작시킬 디렉토리를 생성한다. 

 

  1. $ mkdir /home/kangunma/wsgi-scripts
  2. $ cd /home/kangunma/wsgi-scripts

 

신규 생성한 django 프로젝트를 호출하는 wsgi스크립트 파일인 108combo.wsgi를 다음과 같은 내용으로  생성한다.

 

  1. #!/opt/python2.6/bin/python
    import os, sys
    sys.path.append('/home/kangunma/sites/')
    os.environ['PYTHON_EGG_CACHE'] = '/home/kangunma/sites/.python-eggs'
  2. os.environ['DJANGO_SETTINGS_MODULE'] = '108combo.settings'

    import django.core.handlers.wsgi

    application = django.core.handlers.wsgi.WSGIHandler()

 

httpd.conf 의 사용자 VirtualHost 설정을 다음과 같은 내용으로 설정한다.

 

  1. <VirtualHost *:80>

        ServerName kangunma.luckyzzang.com
        DocumentRoot /home/kangunma/public_html

        <Directory /home/kangunma/sites>
        Order allow,deny
        Allow from all
        </Directory>
  2.  
  3.     <IfModule mod_alias.c>
        Alias /robots.txt /home/kangunma/sites/108combo/media/robots.txt
        Alias /site_media /home/kangunma/sites/108combo/media
        Alias /admin_media /home/kangunma/sites/django/contrib/admin/media
        </IfModule>

        WSGIScriptAlias /108combo /home/kangunma/wsgi-scripts/108combo.wsgi
        <Directory /home/kangunma/wsgi-scripts>
        Order allow,deny
        Allow from all
        </Directory>

    </VirtualHost>

 

site_media와 admin_media의 Alias 설정은 장고 프로젝트의 settings.py의 media, admin media 섹션에서 필요한 부분이다

 

변경된 설정으로 httpd 서버를 재시동한다.

 

  1. $ service httpd restart
    httpd 를 정지 중:                                         [  OK  ]
    httpd (을)를 시작 중:                                     [  OK  ]

 

웹브라우저를 통해 gunma.luckyzzang.com/108combo 로 접근하면 다음과 같은 메시지를 볼 수 있다.

 

Clipboard02.png


출처 - http://hdformat202.springnote.com/pages/3971699


'System > Linux' 카테고리의 다른 글

linux - scp 사용법  (0) 2012.07.16
linux - gcc와 make  (0) 2012.07.16
CentOS - RPMforge EPEL Remi 저장소 설치  (0) 2012.07.13
linux - 프로세스 디버깅  (0) 2012.07.09
Linux - iptables를 이용한 포트포워딩  (1) 2012.05.26
Posted by linuxism
,