vsftpd 533 create error

Linux 2010/10/08 00:50
원인은 SELinux 정책 때문이다.
SELinux 정책 일시적으로 끄기
# setenforce 0
다시 켜기
# setenforce 1
2010/10/08 00:50 2010/10/08 00:50
TAG ,

방화벽 iptables

Linux 2010/08/06 17:03

 명령어순례

iptables 명령은 리눅스 IPv4 방화벽을 설정하는 명령어이다. 1.1 시리즈 부터 리눅스 커널은 패킷 필터링을 포함하기 시작했다. 제 1세대는 BSD의 ipfw를 기본으로 했고 1994년 후반기에 알란 콕스(Alan Cox) 에 의해서 포트 됐다.
이것은 리눅스 2.0에서 Jos Vos와 다른이들에 의해서 개선됐고 커널의 필터링 규칙을 제어하는 사용자 툴로는 'ipfwadm'이 사용됐다.
1998년 중반에 리눅스 2.2를 위해 사용자 툴로 'ipchains'를 내놓았다. 마지막으로, 제 4세대 툴이 'iptables'이고 리눅스 2.4를 위해 1999년 중반에 커널을 재작성했다.


<리눅스매거진 편집부>

  패킷 필터란? 네트워크를 통하는 모든 것은 패킷의 형태를 가지며, 패킷의 앞부분에는 패킷이 어디서 왔는지 어디로 향하는지, 어떤 프로토콜을 이용하는지 등과 같은 정보를 가지고 있다. 패킷 필터는 이렇게 지나가는 패킷의 헤더를 보고 패킷을 ‘DROP'(마치 전혀 전달되지 않는 것처럼 패킷을 거부) 하거나 ’ACCEPT‘(패킷이 지나가도록 내버려 둠)하는 등의 작업을 하는 프로그램을 말한다. iptables은 이런 패킷 필터링 기능을 설정하는데 사용할 수 있는 프로그램이다. 자신의 시스템에 설치돼 있는 iptables의 버전을 확인하는 방법은 아래명령을 통해 가능하다.

# iptables --version

iptables 1.2.4

커널은 3가지의 방화벽 체인(chain)을 기본적으로 가지고 패킷 필터링을 시작한다. 파이어월 체인 혹은 체인이라 부르는 이 3가지는 입력(Input), 출력(Output), 전달(Forward)이다. 입력체인은 들어오는 패킷을 조사하고 전달체인은 외부의 다른 시스템으로 전달될 패킷을 조사한다. 마지막으로 출력체인은 외부로 나가는 패킷을 조사한다.


■ 패킷검사방법

1. 패킷이 커널에 도착하면 그 패킷의 목적지를 확인한다. 이것을 '라우팅' 이라고 한다.

2. 패킷의 목적지가 이곳이면, 패킷은 전달돼 입력체인에 도달한다. 패킷이 입력체인을 통과하면 패킷을 기다리고 있던 프로세서가 받게 된다.

3. 그렇지 않고 커널이 포워딩 불능이나, 패킷을 어떻게 포워딩해야 하는가를 알지못하면, 그 패킷은 ‘DROP‘ 된다. 포워딩이 가능하게 돼있고 다른 곳이 목적지이면 패킷은 그림의 오른쪽 방향으로 전달돼 포워딩 체인으로 간다. 이 체인이 ’ ACCEPT‘ 하게 되면 이것은 포워딩 할 네트워크로 보내진다.

4. 마지막으로, 로컬에서 수행하던 프로그램은 네트워크 패킷을 전송할 수 있다.
이 패킷은 즉시 출력 체인에 보내지며 이 체인이 ‘ACCEPT’되면 이 패킷은 그 목적지가 어디든지 보내진다.


:::: 사 용 법 ::::

iptables -[ADC] chain rule-specification [options]

iptables -[RI] chain rulenum rule-specification [options]

iptables -D chain rulenum [options]

iptables -[LFZ] [chain] [options]

iptables -[NX] chain

iptables -P chain target [options]

iptables -h (print help information)


# Commands

-A : 새로운 규칙을 추가한다.(--append)

-D : 규칙을 삭제한다.(--delete)

-C : 패킷을 테스트한다.(--check)

-R : 새로운 규칙으로 교체한다.(--replace)

-I : 새로운 규칙을 삽입한다.(--insert)

-L : chain에 설정된 규칙을 출력한다.(--list)

-F : chain으로부터 규칙을 모두 방출(삭제)한다.(--flush)

-Z : 모든 chain의 패킷과 바이트 카운터 값을 0으로 만든다.(--zero)

-N : 새로운 chain을 만든다.(--new)

-X : chain을 삭제한다.(--delete-chain)

-P : 기본정책을 변경한다.(--policy)


# chain

INPUT : 입력에 대한 사용

OUTPUT : 출력에 대한 사용

FORWARD : 전달(forwarding)에 대한 사용


# Options

-s : 패킷의 발신지를 명시한다.(--source)

-p : 패킷의 프로토콜을 명시한다.(--protocol)

-d : 패킷의 도착지를 명시한다.(--destination)

-i : 규칙을 적용할 인터페이스 이름을 명시한다.(--interface)

-j : 규칙에 맛는 패킷을 어떻게 처리할 것인가를 명시한다.(-jump)

-y : 접속 요청 패킷인 SYN패킷을 허용하지 않는다.(--syn)

-f : 두 번째 이후의 조각에 대해서 규칙을 명시한다.(--fragment)


# 사용예

127.0.0.1 IP 주소로부터 오는 모든 ICMP 패킷을 무시하는 경우 사용되는 프로토콜은 ICMP이고 발신 주소는 127.0.0.1 이어야 한다. 그리고 패킷 필터의 목표는 드롭(DROP)이다. 테스트하는 프로그램은 ping이며 ping은 단순히 ICMP type 8로 반응요구를 보내며 이에 협조하는 대상 호스트는 ICMP 타입 0 (echo reply)를 보내어 응답하도록 돼 있다. 이제 iptables의 패킷필터를 통해 로컬호스트가 ping 명령에 반응하지 않도록 하겠다.


# ping -c 1 127.0.0.1

  PING 127.0.0.1 (127.0.0.1): 56 data bytes

  64 bytes from 127.0.0.1: icmp_seq=0 ttl=64 time=0.2 ms

  --- 127.0.0.1 ping statistics ---

  1 packets transmitted, 1 packets received, 0% packet loss

  round-trip min/avg/max = 0.2/0.2/0.2 ms


# iptables -A INPUT -s 127.0.0.1 -p icmp -j DROP

; `INPUT' 체인에 127.0.0.1로부터 오고(`-s 127.0.0.1') ICMP(`-p
ICMP') 패킷에 대해 DROP로 점프하라는 (`-j DROP') 규칙을 추가(-A).

# ping -c 1 127.0.0.1

  PING 127.0.0.1 (127.0.0.1): 56 data bytes

  --- 127.0.0.1 ping statistics ---


  1 packets transmitted, 0 packets received, 100% packet loss


■ 설정된 iptables 규칙의 삭제

지금 현재 입력돼 있는 chain이 하나밖에 없으므로 숫자를 지정하는 명령으로 삭제가 가능하며, 앞의 명령과 똑같이 하되 -A를 -D로 바꾸어 지우는 방법이 있다.

#iptables -D INPUT 1

#iptables -D INPUT -s 127.0.0.1 -p icmp -j DROP


■ 체인 규칙 나열하기

설정돼 있는 체인의 규칙을 모두 볼 수 있다. 명령으로 -L을 사용해 가능하며 -v 옵
션과 같이 사용해 각 체인에 대한 패킷과 바이트 카운터 등의 자세한 정보를 함께
볼 수 있다.




# iptables -A INPUT -s 127.0.0.1 -p icmp -j DROP

# iptables -L -v

Chain INPUT (policy ACCEPT 709 packets, 35362 bytes)

pkts bytes target     prot opt in       out     source              
destination

  0     0 DROP       icmp --  any    any     localhost.localdomain  
anywhere


Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)

pkts bytes target     prot opt in       out     source              
destination


Chain OUTPUT (policy ACCEPT 423 packets, 39549 bytes)

pkts bytes target     prot opt in       out     source              
destination      


■ 체인 비우기

하나의 체인 안의 모든 규칙을 비우는 것은 ‘-F’ 명령을 사용해 간단하게 할 수
있다. 체인을 지정하지 않으면 모든 체인의 규칙을 지울 수 있다.

# iptables -F INPUT


■ 출처와 목적지 지정

출처('-s', '--source', '--src')와 목적지('-d', '--destination', '--dst') IP 주소를 지정하는데 4가지 방법이 있다. 가장 보편적인 방법은 'www.linuzine.com', 'localhost'처럼 도메인 네임을 이용하는 것이다. 두번째 방법은 '127.0.0.1'과 같은 IP 주소를 이용하는 것이다.

세번째와 네번째 방법은 IP 주소의 그룹을 지정하는 것으로 '199.95.207.0/24' 또는 '199.95.207.0/255.255.255.0' 같은 형태이다. 이 둘은 모두 199.95.207.0
부터 199.95.207.255 사이의 모든 IP 주소를 지정한다. '/' 다음의 숫자는 IP 주
소의 어떤 부분이 의미 있는가를 나타낸다. '/32' 나 '/255.255.255.255' 가 기
본 값이다.(IP 주소의 모든 부분이 일치해야 한다.) 모든 IP 주소를 지정하는
데 '/0' 가 사용된다.


# iptables -A INPUT -s 0/0 -j DROP


많은 지시자들('-s'나 '-d' 같은)은 일치하지 않는 주소를 나타내기 위해 '!'('not'을 의미한다)로 시작하는 설정을 할 수 있다. 예로, '-s ! localhost' 는 localhost로부터 오는 패킷이 아닌 경우를 나타낸다.


■ 프로토콜 지정

프로토콜은 '-p' 지시자로 지정할 수 있다. 프로토콜을 숫자가 될 수 있고(IP의 프로토콜 번호를 알고 있다면) 'TCP', 'UDP', 'ICMP' 같은 이름이 될 수도 있다.
그리고 'tcp'는 'TCP'와 같은 역할을 한다. 프로토콜 이름 지정에도 '!'을 이용
할 수 있다. '-p ! TCP'


■ TCP 확장

TCP 확장은 '--protocol tcp' 가 지정되고 다른 적용이 지정되지 않으면 자동으로 적재된다. 이것은 다음과 같은 옵션을 제공한다.

--tcp-flags
뒤에 두개의 단어를 사용한다. 첫번째 것은 검사하고자 하는 지시자 리스트의 마스크이다. 두번째 단어는 지시자에게 어떤 것이 설정 될 것인지를 말해준다.

# iptables -A INPUT --protocol tcp --tcp-flags ALL SYN,ACK -j DROP

이것은 모든것이 검사돼야 함을 말한다. 그러나 SYN과 ACK만 설정된다.

--syn
'!' 옵션이 선행될 수 있다. 이것은 '--tcp-flags SYN,RST,ACK,SYN'의 약어이다.

--source-port,
'!' 옵션이 선행될 수 있다. 이후에 하나의 TCP 포트나 포트의 범위를 지정한다.

--sport
/etc/services 에 기록된 것과 같은 포트 이름이 사용될 수 도 있고 숫자로 나타낼 수도 있다. 범위는 두 개의 포트 이름을 '-'으로 연결해서 사용하거나 하나의 포트 뒤에 '-'를 사용하거나 하나의 포트 앞에 '-' 를 덧붙일 수 있다.

--destination-port, --dport
위의 내용과 같으나 목적지를 지정한다.

--tcp-option
'!' 나 숫자가 옵션에 선행될 수 있는데 숫자가 앞에 올 경우 그 숫자 와 TCP 옵션이 같은 경우의 패킷을 검사한다. TCP 옵션을 검사하려 할 때 완전한 TCP 헤더를 갖지 않는 것은 자동으로 드롭 된다.


■ iptables를 통한 포트관리

iptables는 테이블 형식으로 관리를 한다. 그리고 먼저 등록된 것이 효력을 발생하기 때문에 등록을 하는 순서가 중요하다. 모든 것을 거부하는 설정이 먼저 오게 되면 그 이후에 포트를 열어주는 설정이 와도 효과가 없다. 그러므로 허용하는 정책이 먼저 오고 나서 거부하는 정책이 와야 한다.


iptables -A INPUT -p tcp --dport 25 -j ACCEPT

iptables -A INPUT -p tcp --dport 22:30 -j DROP


이렇게 하면 먼저 25번 포트로 들어오는 것을 허용하고 난 후에 다른 것을 막아내기 때문에 제대로 된 설정이 된다.


iptables -A INPUT -p tcp --dport 22 -j ACCEPT


등록된 라인은 ssh를 사용하는 것을 허용하는 것이다. 출처(source)와 목적지 (destination)는 명시하지 않았기 때문에 전체포트와 IP가 대상이 된다. -dport 는 패킷이 대상으로 삼는 포트를 명시한 것이다 여기에서 22라고 표기한 것은 ssh서비스 포트이다. 그리고 마지막에 -j ACCEPT는 허용하도록 정책을 정하는 것이다.
따라서 여기로의 ssh서비스를 요청하는 패킷은 허용되도록 설정을 한 것이다.


■ 전체적인 설정

#!/bin/sh

# iptables 모듈 등록하기

modprobe iptable_filter

# ssh 열기

/usr/local/bin/iptables -A INPUT -p tcp --dport 22 -j ACCEPT

# httpd 열기

/usr/local/bin/iptables -A INPUT -p tcp --dport 80 -j ACCEPT

# pop3 열기

/usr/local/bin/iptables -A INPUT -p tcp --dport 109 -j ACCEPT

# pop2 열기

/usr/local/bin/iptables -A INPUT -p tcp --dport 110 -j ACCEPT

# imap 열기

/usr/local/bin/iptables -A INPUT -p tcp --dport 143 -j ACCEPT

# mysqld 열기

/usr/local/bin/iptables -A INPUT -p tcp --dport 3306 -j ACCEPT

# ftpd 열기

/usr/local/bin/iptables -A INPUT -p tcp --dport 21 -j ACCEPT

# ftp-data 열기

/usr/local/bin/iptables -A INPUT -p tcp --dport 20 -j ACCEPT

# ircd 열어주기

/usr/local/bin/iptables -A INPUT -p tcp --dport 6667 -j ACCEPT

/usr/local/bin/iptables -A INPUT -p udp --dport 6667 -j ACCEPT

# 전부 거절하기

/usr/local/bin/iptables -A INPUT -p tcp --dport 1:30000 -j DROP

/usr/local/bin/iptables -A INPUT -p icmp --icmp-type echo-request -j
DROP


  이처럼 허용하는 서비스가 한정적이다. 우선 ssh, http, pop3, pop2, imap,
mysql, ftp, ircd를 위해서 서비스를 요청하는 패킷은 허용하고 나머지는 전부 거부하는 설정이다. 이 설정을 자세히 보면 tcp와 icmp를 대상으로 했다. 거절하는 줄인


/usr/local/bin/iptables -A INPUT -p tcp --dport 1:30000 -j DROP


이 라인에서 --dport 다음에 1:30000 으로 지정돼 있다. 이 부분은 서버를 경유해서 다른 곳으로 가고자하는 경우에 클라이언트 프로그램이 사용할 포트를 남겨주기 위함이다. 1번포트에서 30000번 포트까지는 완전히 tcp에 대해서 막는 것이다.

만약에 서버에서 나갈 이유가 없으면 전부 막으면 된다. 1:65535 로 설정하면 전체포트가 막힌다. iptables 설정은 조금만 공부를 하면 쉽게 습득이 가능하다. 그러므로 문서를 보는 것이 중요하다. 이 설정은 기본이므로 좀더 많은 것은 관련 문서를 이용하기를 바란다.

2010/08/06 17:03 2010/08/06 17:03
1. 콘솔에서 beep없애기
$echo -e "\33[11;0]"
## '-e' 옵션은 역슬래쉬 가 esc 키 임을 의미합니다.
## 로그인할 때마다 없애려면 ~[id]/.bashrc 화일에 추가해주세요.

다시 beep 이 그리워지면 다음과 같이 하세요.
$echo -e "\33[10;750]\33[11;250]"

##위 사항에 대해 추가하면,
ESC-[10;xx]는 벨소리의 주파수대를 말하는거구요..
디폴트 는 750Hz 입니다.
ESC-[11;xx]는 벨소리가 얼마나 길게 울리느냐 하는겁니다.

2. X상에서 beep없애기
$xset -b
다시 듣고 싶으면,
$xset b
2010/08/06 17:00 2010/08/06 17:00

 파일을 다운 받아

# rpm -Uvh rlwrap-0.30-1.el4.i386.rpm

설치 후

오라클 접속 계정 홈디렉토리의 .bashrc 파일을 수정

alias sqlplus='rlwrap sqlplus'

수정 후

$ . .bashrc

$ sqlplus / as sysdba

sqlplus 접속하여 사용하면 잘 사용이 된다.

2010/08/06 16:47 2010/08/06 16:47

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

7.12

Oracle/PLSQL 2010/08/06 14:12

 begin
        execute immediate 'create table xce8(x date)';
exception
        when others then
                if sqlcode=-955 then
                        dbms_output.put_line('----------');
                        dbms_output.put_line(sqlerrm);
                        dbms_output.put_line('----------');
                end if;
end;
/


--user-defined exceptions : 논리적 error에 대한 처리
--ex) sal < 0 논리적 오류

--에러 지정 방법
declare
        min exception;
 begin
    for c in (select * from emp where deptno=30) loop
        if c.sal < 0 then
                RAISE min;
        else
            dbms_output.put_line(c.sal);
        end if;
    end loop;
exception
        when min then
                dbms_output.put_line('min error');
end;

--RAISE_APPLICATION_ERROR Procedure : error번호까지 만들어서 error발생 -> 프로그램단에서 처리하기가 용이.
-- error번호 기존 error번호와 겹칠 수 있음 그래서 특정 대역을 사용 –20000 ~ –20999
declare
        min exception;
begin
    for c in (select * from emp where deptno=30) loop
        if c.sal < 0 then
                raise min;
        else
            dbms_output.put_line(c.sal);
        end if;
    end loop;
exception
        when min then
                dbms_output.put_line('min');
                RAISE_APPLICATION_ERROR(-20111,'min error 2');
end;
/

-- 둘다 파라미터가 있음
/*
1.procedures : 리턴값이 없는 function, 재사용 가능
 subprograme : function, trigger

*/
-- functions : 리턴값이 있음

--객체생성
create procedure ce8
as
begin
        dbms_output.put_line('------------');
end;
/
--실행방법 exec ce8


--객체 확인
select object_name, object_type from user_objects where object_name='CE8'

--파마리터값 받아서 평균 출력(user defined function)
create or replace function avgsal(deptnox number)
     return number
  as
     sumx number(10);
 begin
     select avg(sal) into sumx from emp where deptno=deptnox;
  return sumx;
end;
 /

--실행 select ename from emp where sal < avgsal(10);

--EM(Enterprise Manager=(GUI관리툴))
--http://192.168.186.3:1158/em/
-- Performance(튜닝) Administration(셋팅) Maintenance(유지보수)

--구구단
create or replace procedure gugu(dan number)
as
begin
        for i in 2..9 loop
                dbms_output.put_line(dan || 'x' || i || ' = ' || dan*i);
        end loop;
end;

--실행방법 ( exec gugu(8) )

create or replace procedure tp2(su number, su2 out number) as
begin
        su2 := su+1;
end;
/

declare
        x number := 9;
begin
        tp2(1,x);
        dbms_output.put_line(x);
end;
/

--x 결과값은 2

--out의 용도 : 프로시저 내부에서 바꾼 값을 invoke해준 블록에서 적용이 되게 함
create or replace procedure tp3(su in out number) as
begin
        su := su+1;
end;

--in방식에서만 숫자 가능, out방식은 변수만 가능

--procedure 생성(파라미터를 in으로 받아서 out으로 보내는 것으로 이해)
CREATE OR REPLACE PROCEDURE getdl(pdeptno number, pdname out dept.dname%type, ploc out dept.loc%type) as
begin
        select dname, loc into pdname, ploc from dept where deptno = pdeptno;
end;

--생성된 프로시저 실행하기
declare
        dname dept.dname%type;
        loc dept.loc%type;
begin
        getdl(10, dname,loc);
        dbms_output.put_line(dname || ',' || loc);
end;

2010/08/06 14:12 2010/08/06 14:12

7.7 ~7.9

Oracle/PLSQL 2010/08/06 14:11
-- 1.출력 프로시저
exec dbms_output.put_line(3*4);
2. 출력안될때 실행해야 하는 명령
set serveroutput ON

--기본 문
DECLARE
        event VARCHAR2(15); -- 변수 선언
BEGIN
 --변수 정의
        event := q'!Father's day!';
 --출력
        DBMS_OUTPUT.PUT_LINE('3rd Sunday in June is :'||event);
        event := q'[Mother's day]';
        DBMS_OUTPUT.PUT_LINE('2nd Sunday in May is :'||event);
END;

--대입
:=
x NUMBER DEFAULT 2;
--비교
=

--%type : 테이블의 타입정의를 가지고 옴
declare
        v_id txx.id%type := &id;
        v_data txx.data%type := '&data';
begin
        insert into txx values(v_id,v_data);
end;

var x number
EXEC :x := 30
SELECT * FROM dept WHERE deptno=:x;

print x

--암시적 커서 예
begin
        for c in(select * from emp) loop
         dbms_output.put_line(c.ename);
        end loop;
end;

--명시적 커서 예
declare
  cursor c is select ename from emp;
  e emp.ename%type;
begin
  open c;
  loop
        fetch c into e;
        exit when c%notfound;
         dbms_output.put_line(e);
  end loop;
  dbms_output.put_line(c%rowcount);
end;

--IF문
declare
        v_dept varchar(10);
begin
        for c in(select * from emp) loop
          if c.deptno = 10 then
                v_dept := 'acc';
          elsif c.deptno = 20 then
                v_dept := 'res';
          elsif c.deptno = 30 then
                v_dept := 'sal';
          else
                v_dept :='n/a';
          end if;
                dbms_output.put_line(c.ename || ',' || v_dept);
        end loop;
end;

--case 문
declare
        v_dept varchar(10);
begin
        for c in(select * from emp) loop
        dbms_output.put_line(c.ename || ',' ||
        case c.deptno
                when 10 then 'acc'
                when 20 then 'res'
                when 30 then 'sal'
          end
        );
        end loop;
end;

--for문
begin
   for dan in 2..9 loop
        exit when dan >= 2;
        for i in 1..9 loop
                dbms_output.put_line(dan ||'X'||i||'='||dan*i);
        end loop;
   end loop;
end;

-- scalar types( 값 <> vector)
-- records 변수인데 값이 여러개 C언어의 struct
-- collections record를 묶어 놓은 c언어에서의 struct array

--rocord
DECLARE
 --일부 컬럼도 가능
 type dept_type is record(DEPTNO NUMBER(2), DNAME VARCHAR2(14), LOC VARCHAR2(14));
 dept_row dept_type;
 --dept_row dept%rowtype; -- 전체 컬럼만 가능
begin
 select * into dept_row from dept where deptno=10;
 insert into dept values(dept_row.deptno+1, dept_row.dname, dept_row.loc);
end;

--레코드를 이용한 출력 방법
-- 변수 r은 암시적으로  emp%rowtype이 됨.
begin
        for r in (select * from emp) loop
                if r.deptno=10 and r.sal+nvl(r.comm,0) > 2000 then
                        dbms_output.put_line(r.ename || ',' || r.sal);
                end if;
        end loop;
end;


declare
 type t is record(deptno number(2),dname varchar2(14),loc varchar2(13));
 type tt is table of t index by pls_integer;
 r t;
 rs tt;
 i number(2) :=0;
begin
 select * into r from dept where deptno=10;
 dbms_output.put_line(r.dname);
 for r in(select * from dept) loop
  rs(i) :=r;
  -- dbms_output.put_line(r.dname||i);
  i:=i+1;
 end loop;
 for j in 0..i-1 loop
  dbms_output.put_line(rs(j).dname);
 end loop;
end;
/


--Explicit cursors (명시적 커서)

--명시적
begin
 FOR i IN (SELECT * FROM emp) loop
  dbms_output.put_line(i.ename);
        end loop;
end;
/

--명시적 커서
declare
        cursor c is select ename from emp; --선언
        ename emp.ename%type;
begin
        open c; --open
        loop
                fetch c into ename; -- fetch
                exit when c%notfound; --속성이용 나오기
                dbms_output.put_line(ename);
        end loop;
 CLOSE c; --close
end;
/

-- 타입 지정과 명시적 커서 사용
--
declare
        type t is record(ENAME emp.ename%type, SAL emp.sal%type);
        deptnox emp.deptno%type :=10;
        cursor c is select ENAME, SAL from emp
                     where deptno=deptnox;
        r t;
begin
        deptnox:=20;
        open c;
        loop
                fetch c into r;
                exit when c%notfound;
                dbms_output.put_line(r.ename || ',' || r.sal);
        end loop;
        close c;
end;

--- 커서 카운트
declare
        deptnox emp.deptno%type;
        rcount number(2);
        cursor c is select * from emp
                     where deptno=deptnox;
begin
        deptnox:=20;
        for r in c loop
                dbms_output.put_line(r.ename||','||r.sal);
                rcount := c%rowcount;
        end loop;
        dbms_output.put_line(rcount);
end;

----------------중요 코드(함수형식으로 콜) 파라미터
declare
           cursor c(deptnox number) is select ename,sal from emp
                        where deptno=deptnox;
           ename emp.ename%type;
        rcount number(2);
begin
      for r in c(10) loop
              dbms_output.put_line(r.ename||','||r.sal);
                rcount := c%rowcount;
      end loop;
        dbms_output.put_line(rcount);
 end;
/


--select update 동시

declare
 r emp%rowtype;
 cursor e is select * from emp where ename='BLAKE' for update of sal nowait;
begin
 open e;

 fetch e into r;
 dbms_output.put_line(r.ename || ',' || r.sal);
 update emp set sal=sal+1 where current of e;

 close e;
end;


--error handling
begin
        dbms_output.put_line(1/(1-1));
exception
        when ZERO_DIVIDE then
                 dbms_output.put_line('su /0 <--err');
end;


declare
        ename emp.ename%type;
        cursor c is select ename from emp where deptno=40;
begin
        open c;
        loop
                fetch c into ename;
                exit when c%notfound;
                dbms_output.put_line(ename);
        end loop;
end;

--2개의 에러 처리
declare
        r emp%rowtype;
begin
        select * into r from emp where deptno=30;
        dbms_output.put_line(r.ename);
exception
        when NO_DATA_FOUND then
                dbms_output.put_line(' no data');
        when TOO_MANY_ROWS then
                dbms_output.put_line('many row');
end;

2010/08/06 14:11 2010/08/06 14:11

7.2 / DCL

Oracle/SQL 2010/08/06 14:09
with read only 읽기 전용
select view_name from user_views;--뷰 확인
sequences
일련번호 생성기, PK 기본값
next.val : transaction의 영향 안받음., 다음 숫자
currentval.val : transcation의 영향 받음., 세션에서의 마지막 리턴 숫자
cache 메모리에서 미리 읽어 드림.
cycle : maxvlaue에 도착하면 minvalue로 바꿔라

create sequence ss
increment by 10
start with 5
maxvalue 20
minvalue 3
cycle
nocache

select sequence_name from user_sequences;
시퀀스 확인

index
select index_name from user_indexes
인덱스 확인
index은 primary key로 설정하면 인덱스가 자동으로 생성
primary key로 생성된 인덱스 삭제 방법
alter table ttt drop constraint sys_C005440;
수동으로 생성된 인덱스 삭제 방법
drop index index_name;

물리적인 rowid 확인
select comm, rowid from emp where comm is not null order by comm

built-in view
 performance view - from 메모리(V$~~시작 : v$fixed_table)
 data dictionary view - from 파일 [dictionary view] : (DBA_~~ : 전체, ALL_~~ : 접근가능한, USER_~~ : 내가소유한)

 scott 소유한 테이블
 select count(*) from user_tables;
 scott 접근 가능한 테이블
 select count(*) from all_tables;
 db전체의 테이블 수(sysdba)
 select count(*) from dba_tables;
 전체 view(sysdba)
 select count(*) from dba_views;
 현재 접속자(session) 리스트(sysdba)
 select username from v$session where username is not null

세션관련 테이블
select name from v$fixed_table where name like '%SESSION%';

--built-in view검색하기(save fv)
select view_name from dba_views where view_name like upper('%&key%')

select CONSTRAINT_NAME, CONSTRAINT_TYPE from USER_CONSTRAINTS where TABLE_NAME='EMP'

07.02 오후 dcl

grant select on emp to hr;
revoke select on emp from hr;
rol 권한의 집합, 권한 받을 때는 유저처럼 권한 줄때는 system권한처럼...

ddl -- alter문
 add - defualt
 modify - defualt
 drop

flashback 기능 -> 과거의 변화를 추적 혹은 복원
external 테이블 -> text파일을 select할 수 있음.

flashback

external tables -> text파일을 select할수 있음

insert all
insert first

dss 의사결정지원 시스템
dw-dss 분석
1.자료수집 - external table
2.분류작업 -
3.분석
4.레포팅
rollup : 부분합
cube : cross tabulation질의 (차원질의,타블릿질의)

5장
date
timestamp : 소주점 이하 초까지
timestamp with timezone : 위에꺼 플러스 시간대 정보
timestamp with local timezone : 시간대 정보가 자동으로 변경
interval day to second (3 12:13:5) : 3일 12시간 13분 5초
interval year to month 3-4 : 3년 4개월

6장
서브쿼리

7장
트리구조 구현
self조인응용.

8장
Regular Expression(정규표현식)

기존    10g정규표현식 응용(4개 함수로)
컬럼명 like 키문자열  regexp_like(컬럼명,표현식)
replace    regexp_replace
substr    regxp_substr
instr    regxp_instr

2010/08/06 14:09 2010/08/06 14:09

statment-level rollback
ex)ddl 실패시 해당 문장만 rollback되고 자동으로 commit됨
read consistency commit하기 전까지는 다른 유저가 못 봄

table : 데이터를 저장하는 객체
view : select문 저장 객체(table처럼 사용됨)
sequence : 일련번호 생성기
 create sequence t2s;
 t2s.nextval;
 select t2s.currval from dual;

index : 검색속도 향상위해 미리 만든 객체
create index

synonym : 동의어

질의 실행 시간 측정 (set timing on)
질의의 실행 계획 확인 set autot on exp
truncate 공간까지 비워짐(delete은 undo 테이블에 복사하기때문에 느리고 공간도 안비워짐)

select emp.ename from scott.emp; 테이블 명과 유저명 생략(당연한 거니까 ㅋㅋㅋ)
다른 유저의 테이블을 볼러면 유저명을 써서 사용한다.

data types
varchar2(size) 가변길이-> 글자영릐 넓이값까지 저장, 공간은 덜차지
char(size) 고정길이: 글자1이 들어가도 넓이값만큼 공간차지
number(p,s) p: 전체넓이, s : 그중에서도 소주점으로 사용할 자리수.
datetime data types
timestamp : 소주점이하까지
interval year to month
interval day to second
timestamp with local time zone : 자동으로 변환해서 저장.

not null 널을 허용 안함
unique 중복을 허용 안함, 에러위치 모름
primary key not null + unique
foreign key 다른(특정) primary key값만 허용.
check 특정 조건만 허용

talbe level로 하는 것을 권장
inline방식 constraint 지정
create table tc2(xx number unique, x2 number); column level
outline방식 constraint 지정
create table tc2a(xx number, yy number, constraint tc2a_uk unique(xx)) table level

create table tc4( id number, yy number, deptno number, constraint tc4_fk foreign key(deptno) references dept(deptno));
constraint tc5_ck check(xx>0);

not null talbe level constraint을 지원하지 않음

crating table as : constraint는 복사가 안됨

alter table
alter table d2 add(xxx number);
alter table d2 add constraint d2_pk primary key(deptno);
alter table d2 modify(xxx number(4) default 0);
alter table d2 drop column xxx;
alter table d2 drop(loc);

테이블이 이미 있다고 하면 찾아보기 (시퀀스나 인덱스에 있을수 있음)
select object_name, object_type from user_objects where object_name like '%&key%'

simple view는 dml이 모두 가능

2010/08/06 14:08 2010/08/06 14:08