산자부 oracle

산자부 트리거 올리기

말없는채플린씨 2009. 10. 1. 13:06

이건 스풀뜬거

plsqltest.LST

 


SQL> spool
plsqltest.LST에 스풀 중입니다.

SQL> DESC DBMS_OUTPUT
PROCEDURE DISABLE
PROCEDURE ENABLE
 인수명                         유형                    기본 내부/외부?
 ------------------------------ ----------------------- --------- --------
 BUFFER_SIZE                    NUMBER(38)              IN     DEFAULT
PROCEDURE GET_LINE
 인수명                         유형                    기본 내부/외부?
 ------------------------------ ----------------------- --------- --------
 LINE                           VARCHAR2                OUT  
 STATUS                         NUMBER(38)              OUT  
PROCEDURE GET_LINES
 인수명                         유형                    기본 내부/외부?
 ------------------------------ ----------------------- --------- --------
 LINES                          TABLE OF VARCHAR2(32767) OUT  
 NUMLINES                       NUMBER(38)              IN/OUT
PROCEDURE GET_LINES
 인수명                         유형                    기본 내부/외부?
 ------------------------------ ----------------------- --------- --------
 LINES                          DBMSOUTPUT_LINESARRAY   OUT  
 NUMLINES                       NUMBER(38)              IN/OUT
PROCEDURE NEW_LINE
PROCEDURE PUT
 인수명                         유형                    기본 내부/외부?
 ------------------------------ ----------------------- --------- --------
 A                              VARCHAR2                IN   
PROCEDURE PUT_LINE
 인수명                         유형                    기본 내부/외부?
 ------------------------------ ----------------------- --------- --------
 A                              VARCHAR2                IN   

SQL> --이것도 패키지
SQL> --프로지져 모아놓은것이 패키지 비용절감 관리 수월~
SQL> --오버로딩도 지원한다
SQL> --IS만나기 전까지만 복사해서 패키지를 만들면 된다
SQL> --바디에서 실제로 만들어진다

SQL> @C:\PLSQL\090930_01.SQL

PL/SQL 처리가 정상적으로 완료되었습니다.

SQL> CREATE TABLE CDEPT
  2  AS
  3  SELECT * FROM DEPT;

테이블이 생성되었습니다.

SQL> SELECT * FROM DEPT;

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

SQL> SELECT * FROM CDEPT;

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

SQL> --트리거를 만들기 앞서 테이블을 복사
SQL> INSERT INTO CDEPT
  2 
SQL> --DEPT에 넣으면 CDEPT도 들어가야지
SQL> @c:\plsql\091001_trigger.sql

트리거가 생성되었습니다.

SQL> --트리거 생성되었으니 다른곳에 cdept에 한 번 넣어보자
SQL> insert into cdept
  2  values(50,'영업부','seoul');

1 개의 행이 만들어졌습니다.

SQL> --한곳에 넣었으니 이제 다른곳도 확인해보자
SQL> select * from cdept;

    DEPTNO DNAME          LOC                                                  
---------- -------------- -------------                                        
        10 ACCOUNTING     NEW YORK                                             
        20 RESEARCH       DALLAS                                               
        30 SALES          CHICAGO                                              
        40 OPERATIONS     BOSTON                                               
        50 영업부         seoul                                                

SQL> --cdept에 insert를 해주었으니 당연히 영업부가 들어가있다
SQL> --그럼 dept는??
SQL> select * from dept;

    DEPTNO DNAME          LOC                                                  
---------- -------------- -------------                                        
        50 영업부         seoul                                                
        10 ACCOUNTING     NEW YORK                                             
        20 RESEARCH       DALLAS                                               
        30 SALES          CHICAGO                                              
        40 OPERATIONS     BOSTON                                               

SQL> --역시 dept에도 트리거를 했으므로 insert를 안해줘도 들어간게 되었다
SQL> @c:\plsql\091001_trigger_up.sql

트리거가 생성되었습니다.

SQL> select * from cdept;

    DEPTNO DNAME          LOC                                                  
---------- -------------- -------------                                        
        10 ACCOUNTING     NEW YORK                                             
        20 RESEARCH       DALLAS                                               
        30 SALES          CHICAGO                                              
        40 OPERATIONS     BOSTON                                               
        50 영업부         seoul                                                

SQL> update cdept set dname='개발부' where deptno=50;

1 행이 갱신되었습니다.

SQL> select * from dept;

    DEPTNO DNAME          LOC                                                  
---------- -------------- -------------                                        
        50 개발부         seoul                                                
        10 ACCOUNTING     NEW YORK                                             
        20 RESEARCH       DALLAS                                               
        30 SALES          CHICAGO                                              
        40 OPERATIONS     BOSTON                                               

SQL> --cdept를 바꾸니 dept도 바뀌었다
SQL> update dept set dname='인사부' where deptno=50;

1 행이 갱신되었습니다.

SQL> select * from cdept;

    DEPTNO DNAME          LOC                                                  
---------- -------------- -------------                                        
        10 ACCOUNTING     NEW YORK                                             
        20 RESEARCH       DALLAS                                               
        30 SALES          CHICAGO                                              
        40 OPERATIONS     BOSTON                                               
        50 개발부         seoul                                                

SQL> select * from dept;

    DEPTNO DNAME          LOC                                                  
---------- -------------- -------------                                        
        50 인사부         seoul                                                
        10 ACCOUNTING     NEW YORK                                             
        20 RESEARCH       DALLAS                                               
        30 SALES          CHICAGO                                              
        40 OPERATIONS     BOSTON                                               

SQL> --왜 순서가 바뀌면 안바뀌는 거지??
SQL> --자기가 트리거를 해주면 안된다
SQL> --즉 일단은 cdeptno가 먼저 되는것.
SQL> @c:\plsql\091001_trigger_del.sql

경고: 컴파일 오류와 함께 트리거가 생성되었습니다.

SQL> show error
TRIGGER DEL_CDEPT에 대한 오류:

LINE/COL ERROR                                                                 
-------- -----------------------------------------------------------------     
2/2      PL/SQL: SQL Statement ignored                                         
2/14     PL/SQL: ORA-00933: SQL 명령어가 올바르게 종료되지 않았습니다          
SQL> drop del_cdept;
drop del_cdept
     *
1행에 오류:
ORA-00950: DROP 옵션이 부적합합니다


SQL> drop trigger del_cdept;

트리거가 삭제되었습니다.

SQL> @c:\plsql\091001_trigger_del.sql

트리거가 생성되었습니다.


SQL> select * from cdept;

    DEPTNO DNAME          LOC                                                  
---------- -------------- -------------                                        
        10 ACCOUNTING     NEW YORK                                             
        20 RESEARCH       DALLAS                                               
        30 SALES          CHICAGO                                              
        40 OPERATIONS     BOSTON                                               
        50 개발부         seoul                                                

SQL> select * from dept;

    DEPTNO DNAME          LOC                                                  
---------- -------------- -------------                                        
        50 인사부         seoul                                                
        10 ACCOUNTING     NEW YORK                                             
        20 RESEARCH       DALLAS                                               
        30 SALES          CHICAGO                                              
        40 OPERATIONS     BOSTON                                               

SQL> delete from dept where deptno=50;

1 행이 삭제되었습니다.

SQL> select * from cdept;

    DEPTNO DNAME          LOC                                                  
---------- -------------- -------------                                        
        10 ACCOUNTING     NEW YORK                                             
        20 RESEARCH       DALLAS                                               
        30 SALES          CHICAGO                                              
        40 OPERATIONS     BOSTON                                               
        50 개발부         seoul                                                

SQL> select * from dept;

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

SQL> delete from cdept where deptno=50;

1 행이 삭제되었습니다.


SQL> insert into cdept values(50,'개발부','서울');

1 개의 행이 만들어졌습니다.

SQL> select * from dept;

    DEPTNO DNAME          LOC                                                  
---------- -------------- -------------                                        
        50 개발부         서울                                                 
        10 ACCOUNTING     NEW YORK                                             
        20 RESEARCH       DALLAS                                               
        30 SALES          CHICAGO                                              
        40 OPERATIONS     BOSTON                                               

SQL> delete from cdept where deptno=50;

1 행이 삭제되었습니다.

SQL> select * from dept;

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

SQL> --역시 cdept를 먼저 지워야 dept도 지워진다
SQL> --실험한 결과 아직은 cdept가 먼저 실행이 되어야 dept에도 적용이 된다



SQL> desc user_triggers
 이름                                      널?      유형
 ----------------------------------------- -------- ----------------------------
 TRIGGER_NAME                                       VARCHAR2(30)
 TRIGGER_TYPE                                       VARCHAR2(16)
 TRIGGERING_EVENT                                   VARCHAR2(227)
 TABLE_OWNER                                        VARCHAR2(30)
 BASE_OBJECT_TYPE                                   VARCHAR2(16)
 TABLE_NAME                                         VARCHAR2(30)
 COLUMN_NAME                                        VARCHAR2(4000)
 REFERENCING_NAMES                                  VARCHAR2(128)
 WHEN_CLAUSE                                        VARCHAR2(4000)
 STATUS                                             VARCHAR2(8)
 DESCRIPTION                                        VARCHAR2(4000)
 ACTION_TYPE                                        VARCHAR2(11)
 TRIGGER_BODY                                       LONG

SQL> --내가 만든 트리거 정보 볼때
SQL> select trigger_name, trigger_type
  2  from user_triggers
  3  ;

TRIGGER_NAME                   TRIGGER_TYPE                                    
------------------------------ ----------------                                
INS_DEPT                       AFTER EACH ROW                                  
UP_CDEPT                       AFTER EACH ROW                                  
DEL_CDEPT                      AFTER EACH ROW                                  

SQL> drop trigger ins_dept;

트리거가 삭제되었습니다.

SQL> drop trigger up_cdept;

트리거가 삭제되었습니다.

SQL> drop trigger del_cdept;

트리거가 삭제되었습니다.

SQL> --트리거도 오프젝트이다
SQL> @c:\plsql\091001_trigger_dml.sql

경고: 컴파일 오류와 함께 트리거가 생성되었습니다.

SQL> show error
TRIGGER DML_CDEPT에 대한 오류:

LINE/COL ERROR                                                                 
-------- -----------------------------------------------------------------     
5/14     PLS-00103: 심볼 "UPDATEING"를 만났습니다 다음 중 하나가 기대될        
         때: := .                                                              
         ( @ % ;                                                               
                                                                               
11/14    PLS-00103: 심볼 "DELETING"를 만났습니다 다음 중 하나가 기대될         
         때: := . (                                                            
         @ % ;                                                                 
                                                                               
15/4     PLS-00103: 심볼 ";"를 만났습니다 다음 중 하나가 기대될 때: if         
SQL> drop trigger dml_cdept;

트리거가 삭제되었습니다.


SQL> @c:\plsql\091001_trigger_dml.sql

트리거가 생성되었습니다.

SQL> SELECT * FROM CDEPT;

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

SQL> INSERT INTO CDEPT VALUES(50,'개발부','서울');

1 개의 행이 만들어졌습니다.

SQL> SELECT * FROM DEPT;

    DEPTNO DNAME          LOC                                                  
---------- -------------- -------------                                        
        50 개발부         서울                                                 
        10 ACCOUNTING     NEW YORK                                             
        20 RESEARCH       DALLAS                                               
        30 SALES          CHICAGO                                              
        40 OPERATIONS     BOSTON                                               

SQL> DROP TRIGGER DML_CDEPT;

트리거가 삭제되었습니다.



SQL> DROP TABLE CDEPT;

테이블이 삭제되었습니다.


SQL> CONN SYSTEM/TEST
연결되었습니다.

SQL> GRANT CREATE VIEW TO SCOTT;

권한이 부여되었습니다.

SQL> CONN SCOTT/TIGER
연결되었습니다.
SQL> CREATE VIEW CDEPT
  2  AS
  3  SELECT * FROM DEPT;

뷰가 생성되었습니다.

SQL> SELECT * FROM CDEPT;

    DEPTNO DNAME          LOC                                                  
---------- -------------- -------------                                        
        50 개발부         서울                                                 
        10 ACCOUNTING     NEW YORK                                             
        20 RESEARCH       DALLAS                                               
        30 SALES          CHICAGO                                              
        40 OPERATIONS     BOSTON                                               

SQL> --view 권한주기 ...
SQL> insert into cdept values(60,'test','test');

1 개의 행이 만들어졌습니다.

SQL> select * from dept;

    DEPTNO DNAME          LOC                                                  
---------- -------------- -------------                                        
        50 개발부         서울                                                 
        60 test           test                                                 
        10 ACCOUNTING     NEW YORK                                             
        20 RESEARCH       DALLAS                                               
        30 SALES          CHICAGO                                              
        40 OPERATIONS     BOSTON                                               

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

SQL> --view를 실행하면 서브커리처럼 실행한다
SQL> --실제적인 메모리는 없다는 뜻이다
SQL> --view 로만 만들면 끝나는거지
SQL> conn system/test
연결되었습니다.
SQL> alter user system identified by oracle;

사용자가 변경되었습니다.

SQL> conn scott/tiger
연결되었습니다.
SQL> -- scott
SQL> --emp<=dml권한?

SQL> --object모든 권한 ==>창조자..
SQL> --09:00~18:00 dml이 가능하고 그외에는 불가한다
SQL> --이런식으로 만들어서 규정을 지울수도
SQL>
SQL> SELECT SYSDATE FROM DUAL
  2  ;

SYSDATE                                                                        
--------                                                                       
09/10/01                                                                       


SQL> @c:\plsql\091001_trigger_sec.sql

트리거가 생성되었습니다.


SQL> conn system/oracle
연결되었습니다.
SQL> --다시
SQL> drop trigger sec_emp;
drop trigger sec_emp
*
1행에 오류:
ORA-04080: 트리거 'SEC_EMP'가 존재하지 않습니다


SQL> conn scott/tiger
연결되었습니다.
SQL> drop trigger sec_emp;

트리거가 삭제되었습니다.

SQL> conn system/oracle
연결되었습니다.
SQL> @c:\plsql\091001_trigger_sec.sql

트리거가 생성되었습니다.

SQL> CONN SCOTT/TIGER
연결되었습니다.
SQL> UPDATE EMP
  2  SET SAL=100;
UPDATE EMP
       *
1행에 오류:
ORA-20001: 낮에 일하세요 야근 절대불가
ORA-06512: "SYSTEM.SEC_EMP", 줄 4에서
ORA-04088: 트리거 'SYSTEM.SEC_EMP'의 수행시 오류


SQL> --SYSTEM에서 트리거를 만들었기 때문에 SCOTT에서는 사용을 못하는것이다
SQL> --즉 내가 입력한 시간에서는 절대로 SCOTT에서 할 수 없는것이다
SQL> --내가 SYSTEM에서 계정을 했으니깐 내가 주인이다
SQL> --이렇게 트리거는 보안을 위해서 사용이 된다
SQL> USER NAME;
SP2-0042: 알 수 없는 명령어 "USER NAME" - 나머지 줄 무시.
SQL> --현재 이것을 시간을 자꾸 확인하겠지
SQL> CONN SYSTEM/ORACLE
연결되었습니다.
SQL> ALTER TRIGGER SEC_EMP DISABLE;

트리거가 변경되었습니다.

SQL> CONN SCOTT/TIGER
연결되었습니다.
SQL> UPDATE EMP
  2  SET SAL=100;

14 행이 갱신되었습니다.

SQL> ROLLBACK;

롤백이 완료되었습니다.

SQL> --DISABLE을 만들어서 트리거가 있지만 사용을 안한다고 지정해줌
SQL> --나중에 보안사항이 생기면 INABLE을 상요하면 된다
SQL> SELECT * FROM EMP;

     EMPNO ENAME      JOB              MGR HIREDATE        SAL       COMM      
---------- ---------- --------- ---------- -------- ---------- ----------      
    DEPTNO                                                                     
----------                                                                     
      7369 SMITH      CLERK           7902 80/12/17        800                 
        20                                                                     
                                                                               
      7499 ALLEN      SALESMAN        7698 81/02/20       1600        300      
        30                                                                     
                                                                               
      7521 WARD       SALESMAN        7698 81/02/22       1250        500      
        30                                                                     
                                                                               

     EMPNO ENAME      JOB              MGR HIREDATE        SAL       COMM      
---------- ---------- --------- ---------- -------- ---------- ----------      
    DEPTNO                                                                     
----------                                                                     
      7566 JONES      MANAGER         7839 81/04/02       2975                 
        20                                                                     
                                                                               
      7654 MARTIN     SALESMAN        7698 81/09/28       1250       1400      
        30                                                                     
                                                                               
      7698 BLAKE      MANAGER         7839 81/05/01       2850                 
        30                                                                     
                                                                               

     EMPNO ENAME      JOB              MGR HIREDATE        SAL       COMM      
---------- ---------- --------- ---------- -------- ---------- ----------      
    DEPTNO                                                                     
----------                                                                     
      7782 CLARK      MANAGER         7839 81/06/09       2450                 
        10                                                                     
                                                                               
      7788 SCOTT      ANALYST         7566 87/04/19       3000                 
        20                                                                     
                                                                               
      7839 KING       PRESIDENT            81/11/17       5000                 
        10                                                                     
                                                                               

     EMPNO ENAME      JOB              MGR HIREDATE        SAL       COMM      
---------- ---------- --------- ---------- -------- ---------- ----------      
    DEPTNO                                                                     
----------                                                                     
      7844 TURNER     SALESMAN        7698 81/09/08       1500          0      
        30                                                                     
                                                                               
      7876 ADAMS      CLERK           7788 87/05/23       1100                 
        20                                                                     
                                                                               
      7900 JAMES      CLERK           7698 81/12/03        950                 
        30                                                                     
                                                                               

     EMPNO ENAME      JOB              MGR HIREDATE        SAL       COMM      
---------- ---------- --------- ---------- -------- ---------- ----------      
    DEPTNO                                                                     
----------                                                                     
      7902 FORD       ANALYST         7566 81/12/03       3000                 
        20                                                                     
                                                                               
      7934 MILLER     CLERK           7782 82/01/23       1300                 
        10                                                                     
                                                                               

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

SQL> SPOOL OFF

plsqltest.LST
0.03MB

'산자부 oracle' 카테고리의 다른 글

oracle 구조   (0) 2009.10.08
회사들어가서 오라클 계정및 경로 확인하기  (0) 2009.10.08
select update의 과정을 보자^^  (0) 2009.10.07
editplus function 만들기  (0) 2009.09.28
산자부 test2는 function 만든것.  (0) 2009.09.28