블로그 이미지
숏퐁숑

카테고리

분류 전체보기 (70)
게임기획자 준비 (18)
게임기획 참고자료 (7)
프로그램 (33)
숨쉬기 활동 (10)
Total
Today
Yesterday

달력

« » 2025.2
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28

공지사항

태그목록

최근에 올라온 글

1. USER

 

Database 내에서 Username은 Unique(중복되지 않아야)해야 한다.

 

User create syntax

 

CREATE USER user_name

IDENTIFIED {BY password | EXTERNALLY | GLOBALLLY} => 인증

(OS인증방식) (제3의 App을 이용한 인증 ex: Directory/LDAP)

[DEFAULT TABLESPACE tablespace] - 지정 안하면 USER TABLESPACE로 지정

[TEMPORARY TABLESPACE tablespace] - default temporary tablespace : temp

[QUOTA {integer[K|M] | UNLIMITED} on tablespace -Tablespace에서 사용할 수 있는 할당값

[QUOTA {integer[K|M] | UNLIMITED} on tablespace]...]

[ACCOUNT LOCK | UNLOCK] - default UNLOCK

[PASSWORD EXPIRE] - 사용자가 로그인시 passwd만료를 표시해주고 바꾸도록 해주는 옵션

[PROFILE {Profile | DEFAULT}]

- default로 DEFAULT라는 이름의 profile이 있음 자원제한 9개 패스워드제한 6개

 

CREATE문을 ALTER로 바구면 수정문이 됨

EM에서 사용자 생성시 CONNECT권한 자동 부여

데스알고리즘(DES)으로 오라클의 password를 복구 가능 11g부터는 password컬럼에 내용이 보안상 안보임

 

사용자 삭제시 사용자가 로그인 시에는 DROP이 안됨!!

사용자가 object 소유시에는 cascade 옵션을 사용해서 DROP시켜야 함!!

 

SQL> alter database default tablespace 테이블 스페이스 명; - 해주면 Default tablespace가 바뀜

SQL> alter database default temporary tablespace 테이블 스페이스 명;

 

2. ROLE

 

CREATE ROLE rolename

 

role은 일반 사용자에게 권한ㅇ르 부여 및 회수 하듯이 롤에 권한을 부여, 회수할 수 있다.

시스템 권한처럼 사용자나 롤로부터 부여 및 회수가 가능하다.

시스템 권한(System Privilege)과 객체 권한(Object Privilege)으로 구성 될 수 있다.

각 사용자에게 부여된 롤은 활성화 되거나 비 활성화 될 수 있따.

role은 활성화하기 위해 암호가 필요 할 수 있다.

role은 특정 사용자가 소유하는 것이 아니기 때문에 어떤 스키마에도 저장되지 않는다.

 

권한부여

GRANT privilege on [user.]object TO USER[or ORLENAME] = object privilege

GRANT privilege TO USER[orPROLENAME] = system privilege

 

ALTER user HR default role {role_name | none};

SET ROLE {vacationdba | all | none};

 

CREATE ROLE secure_application_role

IDENTIFIED USING <security_procedure_name>; pl/sql로 만든 프로그램을 이용한 롤사용

 

3. profiles(자원제한 설정)

why?? 한정된 자원을 효과적으로 사용하기 위해

SQL>select * from dba_profiles;

session level = limit(한계) 초과시 session이 강제로 log out 당함 (error message 뜸)

call level = limit초과시 해당 작업이 중단됨(error message 뜸)

자원 제한이 설정되어 있을 때 실행 계획에 의해서 실행과 동시에 작업을 안하고 error를 발생시킴

현재 등록 되어 있는 profiles 조회

SQL> select * from dba_profiles;

PROFILE 만들기

CREATE PROFILE profilename LIMIT

CPU_PER_SESSION - 1/100 초 단위로 측정한 총 CPU이용시간

SESSIONS_PER_USER - 각 사용자마다 허용된 동시 세션의 수

CONNECT_TIME - 분 단위로 측정한, 경과된 접속시간

IDLE_TIME -분 단위로 측정한 비활동 시간
: 서버 프로세스에 대해서만 IDLE_TIME이 계산됩니다.
응용프로그램 작업은 포함되지 않습니다.
IDLE_TIME은 오랜시간 수행되는 질의나 다른 작업들은 포함하지 않습니다.

LOGICAL_READS_PER_SESSION - 데이터 블록 수 (물리적:디스크로부터,논리적:메모리로부터 읽은)
: LOGICAL_READS_PER_SESSION은 메모리와 디스크 모두 에게서
읽는 총 횟수를 제한 합니다.

PRIVATE_SGA - 바이트 단위로 측정한 SGA 내의 전용(private) 공간(MTS만)
: PRIVATE_SGA는 다중 스레드 서버(MTS) 구성 일 때만 적용됩니다.

CPU_PER_SEESION - 하나의 Call 당 CPU 사용시간

SESSIONS_PER_USER - 한 Call 당 I/O를 할 수 있는 데이터 블록 수

COMPOSITE_LIMIT - cpu_per_session, read_per_session, connect_time, private_sga의 합이 설정한 수치를 넘어가면 제한

패스워드 제한설정

권장 : 30일 마다 변경 권장

PASSWORD history : 이전 암호를 기억해 놓았다가 다음에 변경시 동일한 암호사용을 금지함

password_reuse_time : 동일한 password를 적용한 기간동안 사용금지

password_reuse_max : 입력된 value값만큼만 사용가능한 횟수를 제한 ex: 3이라고 입력하면 3번만 사용가능

password_life_time : password 생명주기 ex : 30 -> 30일마다 변경해야함

password_grace_time : password 변경 만료 알림을 value일 전부터 알림

failed_login_attempts : password 입력실패시 재시도 가능횟수 최종 실패시 계정 lock걸림

password_lock_time : lock걸렸을때 value값만큼 잠겨있음 1일단위임 1/24는 1시간 1/1440은 1분

password complexity verification(패스워드 복잡성)password설정시 제약조건

VERIFY_FUNCTION password 복잡도 함수

rdbms/admin/utlpwdmg.sql (이경로에 관리용 스크립트가 700여개 존재)-수정가능

scripts 실행

해제시

SQL>alter profile default limit password_verify_function null

password_reuse_time unlimited

password_reuse_max unlimited;

SQL>drop fuction verify_function;

ORACLE error코드중 20001~21000은 비어있는데 사용자정의 오류코드로 사용자가 만들어 쓴다

'프로그램 > ORACLE' 카테고리의 다른 글

오라클 수동DB설치 정리  (0) 2016.11.30
WORKSHOP - TABLESPACE에 관하여...  (0) 2016.11.30
마스터 TABLE 데이터 간단히 BACKUP 하기!  (0) 2016.11.30
Linux 기반의 Oracle10g 설치  (0) 2016.11.30
Backup & Recovery  (0) 2016.11.30
Posted by 숏퐁숑
, |

지금까지 개발 중에 마스터성 테이블의 데이터를 건들기전에 엑셀파일로 export 해서 백업해놓고 변경해서 사용하곤 했다. 근데 더 간단하게 테이블을 생성해서 백업해놓고 데이터 변경한 후 필요없으면 테이블 삭제하면 좀더 간단한 것 같아 정리해 본다.

 

1. 백업하고 싶은 테이블을 다른 명으로 해서 만든다

==> create table ppp_role_management_bak as select * from ppp_role_management

    요렇게 하면 ppp_role_management_bak으로 원본 테이블이 복사되어 백업되어진다.

    이렇게 만들어 놓고 ppp_role_management를 수정 하다 혹시 문제가 생기면 ppp_role_management_bak의

    테이블 명을 바꾸어서 사용하면 된다.

 

2. 백업해 놓은 테이블이 필요 없어지면 삭제한다.

==> drop table ppp_role_management_bak

 

요기서 DB 테이블 명 및 테이블 컬럼 이름 바꾸는 명령어를 정리해 보고자 한다.

 

1. DB 테이블 변경하기

ALTER TABLE 현재 테이블 이름 RENAME TO 바꾸고자 하는 테이블 이름

예를 들면

ALTER TABLE ppp_role_management(현재 사용 테이블) RENAME TO ppp_role_management_bak(바꾸고자 하는 테이블 명)

 

2. DB 테이블 컬럼 수정하기

ALTER TABLE 바꾸고자 하는 테이블 명 RENAME COLUNM 현재 테이블의 컬럼(필드명) TO 바꾸고자 하는 컬럼(필드명)

예를 들면

ALTER TABLE ppp_role_management(컬럼명을 바꾸고자 하는 테이블) RENAME COLUNM ppp_role_id(현재 사용되고 있는 테이블 컬럼명) TO  role_id(현재 사용되고 있는 테이블에 바꾸고자 하는 커럼명)

 

근데 오렌지나 ,TOAD 혹은 SQL DEVELOPER를 사용한다면 명령어 알 필요 없을 듯 하다 !

'프로그램 > ORACLE' 카테고리의 다른 글

WORKSHOP - TABLESPACE에 관하여...  (0) 2016.11.30
Administering User Security  (0) 2016.11.30
Linux 기반의 Oracle10g 설치  (0) 2016.11.30
Backup & Recovery  (0) 2016.11.30
with grant option & with admin option 차이  (0) 2016.11.30
Posted by 숏퐁숑
, |

Oracle 10g를 리눅스에서 설치하던 기억이 난다. 오라클 양성반 과정에서 오라클 설치를 위한 커널 설정부터

필요한 패키지 설정까지 다 외우고 시험보던 기억들이 새록새록 하다. 오랫만에 리눅스 기반에서 Oracle 10g 설치 방법을 정리해 보았다. 

 

1. Hosts File

 

# vi /etc/hosts

 

127.0.0.1 expert.oracle.com~

192.168.100.100 expert.oracle.com~

 

2. Kernel Parameters 설정

 

# Controls the maximum size of a message, in bytes
kernel.msgmnb = 65536

# Controls the default maxmimum size of a mesage queue
kernel.msgmax = 65536

 

# Controls the maximum shared segment size, in bytes
kernel.shmmax = 2147483648

# Controls the maximum number of shared memory segments, in pages
kernel.shmall = 2097152
kernel.shmmni = 4096
kernel.sem = 250 32000 100 128
fs.file-max = 65536
net.ipv4.ip_local_port_range = 1024 65000
net.core.rmem_default = 262144
net.core.rmem_max = 262144
net.core.wmem_default = 262144
net.core.wmem_max = 262144

 

3. Kernel Parameters를 변경 적용

[root@ocm52 ~]# /sbin/sysctl -p
net.ipv4.ip_forward = 0
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
kernel.sysrq = 0
kernel.core_uses_pid = 1
net.ipv4.tcp_syncookies = 1
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 2147483648
kernel.shmall = 2097152
kernel.shmmni = 4096
kernel.sem = 250 32000 100 128
fs.file-max = 65536
net.ipv4.ip_local_port_range = 1024 65000
net.core.rmem_default = 262144
net.core.rmem_max = 262144
net.core.wmem_default = 262144
net.core.wmem_max = 262144
 

4. /etc/security/limits.conf 파일에 아래의 내용을 추가.

[root@ocm52 ~]# vi /etc/security/limits.conf

 

oracle soft nproc 2047
oracle hard nproc 16384
oracle soft nofile 1024
oracle hard nofile 65536


5. /etc/pam.d/login 파일에 아래의 내용이 없다면 추가

[root@ocm52 ~]# vi /etc/pam.d/login 

session required pam_selinux.so open
session optional pam_keyinit.so force revoke
session required /lib/security/pam_limits.so


6. /etc/selinux/config 파일에 아래의 내용을 변경.

[root@ocm52 ~]# vi /etc/selinux/config

SELINUX=disabled (enforce를 disable로 변경)

 

7. RedHat Enterprise linux AS에 오라클 설치시 필요한 package

(oracle 설치 전 반드시 조회한 후 각 CD를 이용하여 설치되지 않은 패키지를 설치해야 함.)

=> 대부분의 패키지가 전부 설치 되어있으니 확인만 하면 됨.

=> RPM 조회 : rpm -qa | grep 패키지명

 

#From RedHat AS4 Disk 2

cd /media/media/Enterprise linux cd | 20071115/server

 

[root@ocm52 Server]# rpm -Uvh compat-db-4.2.52-5.1.i386.rpm
warning: compat-db-4.2.52-5.1.i386.rpm: Header V3 DSA signature: NOKEY, key ID 1e5e0159
Preparing... ########################################### [100%]
1:compat-db ########################################### [100%]
[root@ocm52 Server]# cd
[root@ocm52 ~]# cd /mnt/hgfs/shared
[root@ocm52 shared]# ls
10201_database_linux32.zip libaio-devel-0.3.107-2.i386.rpm
[root@ocm52 shared]# rpm -Uvh libaio-devel-0.3.107-2.i386.rpm
Preparing... ########################################### [100%]
1:libaio-devel ########################################### [100%]

8. Create the new groups and user(새로운 사용자 및 그룹 추가)

 

[root@ocm52 shared]# groupadd dba
[root@ocm52 shared]# groupadd oinstall
[root@ocm52 shared]# groupadd oper
[root@ocm52 shared]# groupadd asmadmin
[root@ocm52 shared]# useradd -g oinstall -G dba,oper,asmadmin oracle
[root@ocm52 shared]# passwd oracle
Changing password for user oracle.
New UNIX password:
BAD PASSWORD: it is based on a dictionary word
Retype new UNIX password:
passwd: all authentication tokens updated successfully.
[root@ocm52 shared]# mkdir -p /u01/app/oracle/product/10.2.0/db_1
[root@ocm52 shared]# chown -R oracle.oinstall /u01
[root@ocm52 shared]# more /etc/passwd | grep oracle
oracle:x:502:503::/home/oracle:/bin/bash

 

9. 오라클 설치할 폴더 생성

 

[root@ocm52 shared]# su - oracle
[oracle@ocm52 ~]$ mkdir -p /u01/app/oracle/product/10.2.0
[oracle@ocm52 ~]$ mkdir -p /u01/app/oracle/tmp
[oracle@ocm52 ~]$ mkdir -p /u01/app/oracle/java

 

10. DISPLAY 설정 (*root 계정으로 설정)

#xhost+<machine-name | ip>

ex) #xhost +192.168.100.100 or xhost+expert.oracle.com

[root@ocm52 ~]# xhost +192.168.100.100
192.168.100.100 being added to access control list

 

11. .bash_profile에다가 아래의 내용을 추가 해준다.

[root@ocm52 ~]# su - oracle
[oracle@ocm52 ~]$ vi .bash_profile (or$vi.bashrc)

 

#User specific envirnment and startup programs

 

PATH=$PATH:$HOME/bin:.:/u01/app/oracle/product/10.2.0/bin
export PATH
export ORACLE_BASE=/u01/app/oracle
export ORACLE_OWNER=oracle
export ORACLE_HOME=/u01/app/oracle/product/10.2.0
export ORACLE_TERM=vt100
export TMPDIR=$ORACLE_BASE/tmp
export TEMP=$ORACLE_BASE/tmp
export NLS_LANG=AMERICAN_AMERICA.KO16KSC5601
export ORACLE_SID=DB01
export JAVA_HOME=$ORACLE_HOME/jdk
export TNS_ADMIN=$ORACLE_HOME/network/admin
export ORA_NLS33=$ORACLE_HOME/ocommon/nls/admin/data
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib
export CLASSPATH=$ORACLE_HOME/JRE:$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib
umask 022

:wq

[oracle@ocm52 ~]$ . .bash_profile ==>적용 ($source.bash_profile)

 

12. profile 변경

[oracle@ocm52 ~]$ su - (root로 접속 변경)

Password:

[root@ocm52 ~]# vi /etc/profile 

if [ $USER = "oracle" ]; then
if [ $SHELL = "/bin/ksh" ]; then
ulimit -p 16384
ulimit -n 65536
else
ulimit -u 16384 -n 65536
fi
fi

13. X-win 변경

[root@ocm52 ~]# vi /etc/inittab (runlever)

id:5 =============================>id:3으로 변경

 

[root@ocm52 ~]# reboot

Posted by 숏퐁숑
, |

현업으로 시스템 관련 변경 요청사항들이 계속 들어온다.  패스워드 변경 관련 처리를 해주다가 다음에 또 쓰게 될 것같아 정리 해보려 한다.

 

요청 1 :  패스워드 표시할 때 앞의 두자리는 보이고 나머지는 보안을 위해 *로 표시해달라고 한다. 어떻게 처리하면 될까? 단 12자리 이상 넘어가지 않도록 하고 싶다.

 

mask를 사용해서 간단하게  처리할 수 있다.

입력된 문자 일부를 Password로 처리하여 '*'의 형태로 출력하고자 할때에는 Password로 출력하고자 하는 영역을 { } 로

지정하면 된다.

mask="@@{@@@@@@@@@} 요렇게 처리해주면 {} 안에 들어가는  password는 '*'로 표시되게 된다.

 

소스 코드

  <Form id="test" classname="test" inheritanceid="" position="absolute 0 0 667 364" titletext="New Form">
    <Layouts>
      <Layout>
        <MaskEdit id="MaskEdit01" taborder="0" position2="absolute l:60 w:230 t:50 h:24" positiontype="position2"

                 mask="@@{@@@@@@@@@}" type="string" maskchar=" "/>
      </Layout>
    </Layouts>
  </Form>

 

요청 2 :  보안을 위해 패스워드 저장시 특수문자를 꼭 넣도록 하고 싶을때 어떻게 처리해주면 될까?


 var strVal = Edit00.text; // abc12345입력시
 //특수문자 정의_간단히 10가지만 정의해 봄.  
 var rtn1 = strVal.indexOf("!");//rtn  값은 !가 존재하지 않으면 -1 존재하면 4 값을 리턴한다.
 var rtn2 = strVal.indexOf("@");//rtn 값은 @가 존재하지 않으면 -1 존재하면 4 값을 리턴한다.
 var rtn3 = strVal.indexOf("#");//rtn 값은 #가 존재하지 않으면 -1 존재하면 4 값을 리턴한다.
 var rtn4 = strVal.indexOf("$");//rtn 값은$가 존재하지 않으면 -1 존재하면 4 값을 리턴한다.
 var rtn5 = strVal.indexOf("%");//rtn 값은 %가 존재하지 않으면 -1 존재하면 4 값을 리턴한다.
 var rtn6 = strVal.indexOf("^");//rtn 값은 ^가 존재하지 않으면 -1 존재하면 4 값을 리턴한다.
 var rtn7 = strVal.indexOf("&");//rtn 값은 &가 존재하지 않으면 -1 존재하면 4 값을 리턴한다.
 var rtn8 = strVal.indexOf("*");//rtn 값은 *가 존재하지 않으면 -1 존재하면 4 값을 리턴한다.
 var rtn9= strVal.indexOf("(");//rtn 값은 (가 존재하지 않으면 -1 존재하면 4 값을 리턴한다.
 var rtn10 = strVal.indexOf(")");//rtn 값은 )가 존재하지 않으면 -1 존재하면 4 값을 리턴한다.
 

var check =  rtn1 + rtn2 + rtn3 + rtn4 + rtn5 + rtn6 + rtn7 + rtn8 + rtn9 + rtn10;
  if(check  == -10)
 {
    alert("패스워드에 특수 문자를 넣어주세요.");

    return;
 }

Posted by 숏퐁숑
, |

알면 간단하게 해결 되는 TextArea에 대한 설정 방법중,

textArea에서 스크롤바를 최상단, 최하단으로 보내는 방법이다.

var maxVal= TextArea00.vscrollbar.max;
TextArea00.vscrollbar.pos = maxVal;

var minVal= TextArea00.vscrollbar.min;
TextArea00.vscrollbar.pos = minVal;

 

간단하게 설정이 가능하지만 모르면 모르는 기능이다.

Posted by 숏퐁숑
, |

엑스플랫폼... 모든 프로퍼티와 기능을 다 알면 무지 좋은 툴이지만 모르고 사용하면 시간만 잡아 먹을 수 있다는 단점을 같이 가지고 있다. 소계를 구하는거.. 물론 쿼리에서 해결해서 결과를 뿌려 줄수도 있지만 그리드에서 간단하게 해결할 수 있을 것 같아서 해보았다가 잘 몰라서 시간을 많이 빼았겼기에.. 이렇게 정리하고 넘어가려 한다.

 

아주 간단하다.

 

1. 담아온 데이터 셋(DS_XXXX)의 PROPERIES 속성중에 keystring이라는 속성이 있는데 거기에 그룹으로 묶을  컬럼명을 넣어준다.

이때 중요한 것은 데이터 셋을 작성할 때 해당 소계할 컬럼의 TYPE은 INT 형으로 되어 있어야 한다.?

 

2. 그리드를 더블 클릭해서 속성을 보면 Binding에 subsumtext 라는 속성이 있는데 그룹 컬럼을 선택한 후 속성안에 소계라고 적어주고 해당 더할 속성의 subsumtext 에는 다음과 같이 적어주면 된다.?

getSum('toNumber(더해줄 컬럼명)',getGroupRangeStart(currow), getGroupRangeStart(currow)+getGroupRangeCount(currow))

 

그럼 그룹별로 소계를 구하는 그리드 작업은 끝!!

Posted by 숏퐁숑
, |

UI/UX...  이제 프로그래밍만 잘한다고 사용자가 원하는 시스템을 만들 수 있는 것이 아니다. 당연한 애기 이겠지만 이젠 디자인 적인 부분을 간과 할 수 없게 되었다. 사용자가 원하는 화면, 사용자 정의 화면을 개발하기 위해 우리 회사는 2012년 엑스플랫폼이란 것을 도입하였다. 물론 개발자 편의성도 고려해서다.

(예전에 HTML, JSP로 코딩 할때보다 생산성이 2배 향상되어진 것 같다).

여튼 엑스플렛폼은 개발 편의성이 좋아진 것은 분명하지만 여러 기능들을 숙지 하고 있을때나 가능한 애기이다. 정말 다양한 기능들을 제공하기 때문에 가능한 많은 기능과 프로퍼티들을 알고 있으면 좋을 것 같다.

 

간단한 기능 하나!

 

어떻게 입력되어지는 텍스트의 값을 모두 대문자로 입력되도록 할 수 있을까?

 

방법은 간단하다. editfilter 라는 프로퍼티만 알면 해결 끝!!

 

Grid Contents Editor에서 해당 셀을 클릭한 후 프로퍼티 중

editfilter를 upper로 선택하면 대문자로만 입력되어지도록 할 수있다!!

Posted by 숏퐁숑
, |

엑스플랫폼으로 PC의 시간을 보여달라는 요청을 처리해 준 후 년/월/일/시/분/초를 자바 스크립트로 구현하는 방법을 정리해 보았다.

 

/*******************************************************************************
 ★ 설명
    해당 PC의 오늘 날짜 + 시간을 가져온다.
 ★ parameter
 ★ return
    - 성공 = yyyyMMddhhmiss형태의 오늘 날짜 ( 예 : "20121122223010" )
    - 실패 = 없음
******************************************************************************/
function TodayTime()
{
 var strToday = "";
 var objDate = new Date();
 var sToday  = objDate.getFullYear().toString();
 sToday += Right("0" + (objDate.getMonth() + 1), 2);
 sToday += Right("0" + objDate.getDate(), 2);
 sToday += Right("0" + objDate.getHours(), 2);
 sToday += Right("0" + objDate.getMinutes(), 2);
 sToday += Right("0" + objDate.getSeconds(), 2);
 //strToday += objDate.getMilliseconds();
 return sToday;

 

/*******************************************************************************
 ★ 설명
    문자열의 오른쪽에서 nSize만큼의 문자열을 가져온다.
 ★ Parameter
    1. sOrg   : 원래 문자열( 예 : "aaBBbbcc" )
    2. nSize  : 가져올문자열 길이 ( 예 : 2 )
 ★ return
    - 성공 = 오른쪽에서 nSize만큼의 문자열 ( 예 : "cc" )
    - 실패 = ""
 ★ 주의사항
    sOrg의 길이가 nSize보다 작은경우는 sOrg가 Return된다.
    ( 예 : sOrg="a", nSize=2 ==> return = "a" )
 ******************************************************************************/
function Right(sOrg, nSize)
{
 if( IsNull(sOrg) || IsNull(nSize) )  return "";
 
 if( sOrg.length < nSize )
  return sOrg;
 else
  return sOrg.substr(sOrg.length-nSize, nSize);
}

////////////////////////////////////////////////////////////////////////////////
// String & Number Start
////////////////////////////////////////////////////////////////////////////////
/*******************************************************************************
 ★ 설명
    입력값이 null에 해당하는 경우 모두를 한번에 체크한다.
 ★ Parameter
    1. sValue : 체크할 문자열( 예 : null 또는 undefined 또는 "" 또는 "abc" )
 ★ return
    - sValue가 undefined, null, NaN, "", Array.length = 0인 경우 = true
    - 이외의 경우 = false
******************************************************************************/
function IsNull(sValue)
{
 if( new String(sValue).valueOf() == "undefined")
  return true;
 if( sValue == null )
  return true;
 if( ("x"+sValue == "xNaN") && ( new String(sValue.length).valueOf() == "undefined" ) )
  return true;
 if( sValue.length == 0 )
  return true;
 return false;
}

 

// 시계처리 함수
function Clock()
{
 date_str = TodayTime();
 yy = date_str.substr(0,4);  //년
 mm = date_str.substr(4,2);  //월
 dd = date_str.substr(6,2);  //요일
 hh = date_str.substr(8,2);  //시간
 mi = date_str.substr(10,2); //분
 ss = date_str.substr(12,2); //초
 return hh + " : " + mi + " : " + ss;
}

 

function comp_timer_ontimer(obj:Form, e:TimerEventInfo)
{
 Static_clock.text = Clock();   //한국 시간
}

 

요렇게 추가해 놓으면 일단 작업은 끝!!

그리고 중요한 부분은 엑스플랫폼의 Source 부분을 열어서 밑에 빨간부분처럼 수정해주어야 한다.

<Form id="work" classname="main" inheritanceid="" position="absolute 0 0 1012 617" titletext="Work Frame" scrollbars="none" onload="work_onload" onsize="work_onsize" ontimer="comp_timer_ontimer" visible="true" style="background:darkgray;">

 

마지막으로 화면이 실행되자마자 실행되게 하기위해 onload 부분에

Static_clock.text = Clock(); // 시계표시용 Static Component에 시간표시
this.setTimer(1,1000);  // Timer구동 <= 타이머를 1초간격으로 설정해주면 위에 ontimer에 설정되어있는 함수를 호출해준다. 그럼 실제 시간이 초당 흘러가는 효과를 나타낼 수 있다!

 

한국 시간은 이렇게 구해왔는데... 워싱턴의 시간과 베이징의 시간도 표현하고 싶어서~~

 

function Clock() {
  var arg = arguments;
  var time = new Date();
 
 if(arg[1])
 time.setHours(time.getHours()+arg[1]);
 
 var yy = time.getFullYear();
  var mm = time.getMonth() + 1;
  var dd = time.getDate();
 
 var minute = time.getMinutes();
  var second = time.getSeconds();
  var hour = time.getHours();
 
 if(hour<=12) {
   if(hour<10) hour = "AM 0" + hour;
   else hour = "AM " + hour;
  }
  else hour = "PM " + (hour-12);
  if(mm<10) mm = "0" + mm;
  if(dd<10) dd = "0" + dd;
  if(minute<10) minute = "0" + minute;
  if(second<10) second = "0" + second;
 
  return yy +"년 "+ mm +"월 "+ dd +"일 "+ hour +":"+ minute +":"+ second;
 }

 

요렇게 만들면 모든 나라의 날짜와 시차를 구할 수 있다.

 

호출 할때는  clock('usa',-14) 요렇게 호출하면 미국과 14시간 차이남으로 미국의 현재 시간을 불러올 수 있다. clock('bejing',1) 요렇게 하면 베이징과의 시차가 1시간 이니까 베이징의 현재시간을 나타낼 수 있다.

Posted by 숏퐁숑
, |

Backup & Recovery

프로그램/ORACLE / 2016. 11. 30. 09:47

 - 관리자로써의 의무

  • 데이터베이스를 어떠한 오류로 부터로의 보호
  • MTBF를 늘리고
  • MTTR을 줄인다
    • MTTR : Fail이 난 이후 복구해서 다시 정상적으로 작동할 때까지(복구시간)
    • MTTF : Fail이 발생하고 다음번 Fail이 발생하는 시간
    • MTBF : MTTR+MTTF(DB신뢰도/가용도)
  • 최소의 데이터 손실을 줄인다
  • Case by Case에 대한 Test를 모두 해본다 -> 결제

- Fail의 종류

  • 구문(문장) 오류
  • 사용자 실수의 오류
  • 네트워크 오류
  • 세션 오류
  • 인스턴스 오류(껐다 켜라..!)
    • SMON의 복구 과정을 거쳐라!
  • 매체 오류(Storage, Device, File)

일반적인 문제

해결책

부적합한 데이터의 입력시도

정상적인 데이터만 입력해라

불충분한 권한으로 작업시도

적절한 오브젝트나 시스템 권한을 부여

공간할당 실패

· Resumable Space를 가동시키면 Space가 꽉 찰 경우 작업이 일시정지되고 Alert!이 발생한다.

· 사용자에 대한 공간할당을 해준다

· 테이블 스페이스를 추가한다

잘못된 어플리케이션 에러

개발자나 사용자에게 정확한 에러를 찾게한다

 

 

 

- User Process Failure

  • 비정상적 종료
  • 세션을 종료시키는 프로그램에 오류발생
  • Solution : DBA의 개입이 필요없다. PMON이 알아서 처리해준다. 문제를 발생한 Trend를 보고 판단한다
  • 계속해서 연결 끊김현상(비정상적인 종료)가 발생하면
    • 사용자의 교육이 필요
    • Network Fail을 의심해본다
    • 비정상적으로 종료되는 Application도 확인해본다

- Network Failure

  • Listener오류
    • 백업 리스너를 구성해서 재빠르게 대응한다
    • Failover(계속적인 접근시도) 기능을 이용한다
  • 네트워크 카드 오류
    • 백업 랜카드를 준비해둔다
  • 네트워크 장비 오류
    • 백업 네트워크 장비를 준비해둔다

- User Error

  • 데이터를 실수로 삭제하거나 수정했을경우(DML실수)
  • 실수로 드랍을 할경우(DDL 실수)
  • Solution : 휴지통을 이용해서 복구 & 롤백, Purge로 삭제했을 경우는 Backup(불완전복구) 정보로 복구한다
  • LogMiner : FlashBack 보다는 기능이 떨어지지만, 예전부터 사용해왔던 복구도구이다.

- Instance Failure

  • 정전
  • 하드웨어 오류
  • 필수 백그라운드 프로세서중 오류
  • 비상종료
  • Solution : Startup 명령을 사용해서 Restart(SMON이 복구)
  • 복구된후 Alert!로그와 Trace File & EM을 보고 오류를 분석한다
  • ※ Commit된 정보를 DataFile로 적용시키는것 : Roll Fowarding

- CKPT

  • DBWr Process에게 Signal을 보낸다
  • 신호받은 DBWr는 Dirty Block(Buffer Cache에 있다)를 Data File로 기록한다
    • Check Point Queue에 Dirty Block의 정보가 있다.
  • DB FIle Header와 Contorl 파일의 정보를 Update한다.
  • 무결성 체크!
  • Check Point Position : Check Point Position과 현재 DB 상태의 거리가 가까울수록 Recovery 시간이 짧다
  • Check Point가 존재하는 이유
    • Dirty Block을 Data FIle로 주기적으로 내려쓰기 위해
    • Recovery Time을 줄일수있다.
    • Shutdown시 Data 기록을 확실히 보장한다

- LGWr

  • Redo Log FIle
    • DB의 모든 변경사항
    • 데이터 손실로부터 보호하기 위해 다중화를 하고 다중화된 멤버는 서로다른 Disk에 위치시킨다!
      • 단점 : I/O를 많이 발생하고, Disk 공간을 차지한다
  • 언제?
    • Commit 할때마다
    • 3초마다
    • DBWn Wirte가 쓰기전

- ARCn

  • 옵션 프로세서이다
  • 아카이브로그 모드가 활성되어 있는 경우 online Redo Log 파일을 자동으로 아카이브한다
  • DB의 모둔 변경 사항을 영원히 보존한다.
  • EM & CMD로 할수있다.

- Instance Recovery

  • 종료될때 제대로 종료되지 않은 DB가 있으면 복구후 OPEN한다
  • 자동설정되어있다
  • Rego Log Group에 있는 내용으로 재적용 해준다
    • Roll Fowarding -> Commit된 정보와 DataFile이 일치가 안되면 적용
    • Roll Back -> Commit 되지 않은 값을 Undo Segment에 있는 값(Orinigal) 과 DataFIle값을 비교해서 롤백
  • OPEN이 되면 DataFile과 Redo Log이 열린다. 이때 복구작업이 진행된다(SMON)
  • Check Point Position의 마지막 정보와 Redo Log File의 마지막 정보를 비교해서 동기화시킨다

- RBA(Redo Log File의 전체 Address)

- fast-start-mttr-target = 900 -> Instance Recovery 하는데 걸리는 최대 시간

  • 900초 분량의 Dirty Blcok의 개수
  • 시간이 짧을경우 : 복구시간은 짧아지지만 DBWr I/O는 많이발생
  • 시간이 길경우 : 복구시간은 길어지지만 DBWr I/O는 적게발생

- Media Failure

  • Disk Driver 오류
  • Disk Controller 오류
  • DB 파일 오류
  • Solution
    • 백업한 데이터로 부터 복구
    • 필요에 따라서 Redo(Redo Log FIle & Archive File) 정보 적용
    • 새로운 위치를 지정(Disk Fail일 경우)

- 복구능력 향상을 위한 구성

  • 최대한 일반적인 백업 스케쥴을 구성(증분백업정책)
  • Control 파일과, Redo Log Group의 다중화
  • Redo Log의 Archive를 잘 보관

- Control Files

  • 최소한 2개이상의 Control 파일은 다중화 시켜라
  • 서로다른 디스크에 각각 저장
  • Control File 백업
    • alter database backup controlfile to trace -> udump/*.trc
    • alter database backup controlfile to trace as '경로/파일"
    • alter database backup controlfile to '경로/파일' -> Image Backup(File로 생성)
  • 실습
    • WS1-2-ch14. Managed Control File LAB

- Redo Log File

 

  • 그룹이 2개 이상이여야 하는 이유 : Log Switch가 가능!
  • 다중화는 성능의 심각한 영향을 준다(I/O 발생)
  • v$log_stats
    • Current (LGWr)
    • Active -> Checkpoint (ARCn이 작업중일경우)
    • Inactive -> 삭제가능
    • Unused -> 초기화(Clear), 생성직후
    • Clearing -> Alter database clear logfile group n; 그룹 초기화
    • Clearing_Current -> I/O 오류가 발생한 상황
  • 실습
    • WS1-2-ch14. Managed Redolog File LAB

- Archive Log

  • Redo 정보를 유지 & 보존
  • 아카이브 과정
    1. 이름에 대한 규칙성을 정하고
    2. 하나이상의 로그파일 위치를 지정한다
    3. 아카이브 로그모드 설정(마운트에가서)
  • 이름의 규칙성을 정하는 파라미터 : log_archive_format

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

- Performing Database Backup

  • Secure Backup
    • End-to-End 기능
    • 중앙화된 백업 관리를 수행할수 있다
    • RMAN Backup의 한창 강화된 기능을 포함
    • 네트워크상의 백업이 가능
    • Resource 문제를 해결
    • 저렴한 비용과 신뢰할수 있는 데이터보호 정책등이 보장된다

  • User Managed Backup
  • Backup이 필요한건지 Backup상태가 어떤지 사용자가 직접 체크한다(스크립트 이용 권고)
  • 일반 TBS 백업시
    • 정보조회를 먼저한다
      • v$datafole
      • v$logfile
      • v$controlfile
    • alter tablespace xxx begin backup -> 백업모드로 전환(Check Point 발생)
    • v$backup으로 backup모드인지 확인
    • cp
    • alter tablespace xxx end backup
Posted by 숏퐁숑
, |

with grant option 과 with admin option에 대해 테스트를 하기 전에

쉽게 이해하실수 있도록 기본적인 셋팅을 하도록 하겠다.

 

C:\> sqlplus "/as sysdba"

 

1. 사용자 생성(USER_1, USER_2)

SQL> create user user_1 identified by user_1 default tablespace users;

사용자가 생성되었습니다.

SQL> create user user_2 identified by user_2 default tablespace users;

사용자가 생성되었습니다.

 

2. 접속 권한 및 간단한 권한 주기

SQL> grant create session, create table, create view to user_1;

권한이 부여되었습니다.

SQL> grant create session, create table to user_2;

권한이 부여되었습니다.

 

이제 with grant option 과 with admin option 을 알아보자.

 

(1) with grant option

 

기본적으로 scott 계정은 다들 가지고 계시니 scott 계정으로 접속한다.

SQL> conn scott/tiger

연결되었습니다.

 

scott이 user_1에게 emp 테이블을 select 할수 있는 권한을 with grant option을 써서 부여 하도록 한다.

SQL> grant select on emp to user_1 with grant option;

권한이 부여되었습니다.

SQL> select * from user_tab_privs
2 where table_name='EMP';

GRANTEE OWNER TABLE_NAME GRANTOR PRIVILEGE GRA HIE
---------- ---------- --------------- --------------- --------------- ---- ---
USER_1 SCOTT EMP SCOTT SELECT YES NO

 

 

scott에게 받은 권한을 똑같이 user_2에게 부여한다.

SQL> conn user_1/user_1
연결되었습니다.
SQL> grant select on scott.emp to user_2 with grant option;

권한이 부여되었습니다.

SQL> select * from user_tab_privs
2 where table_name='EMP';

GRANTEE OWNER TABLE_NAME GRANTOR PRIVILEGE GRA HIE
---------- ---------- --------------- --------------- --------------- ---- ---
USER_1 SCOTT EMP SCOTT SELECT YES NO
USER_2 SCOTT EMP USER_1 SELECT YES NO

 

USER_TAB_PRIVS 테이블은 누구의 소유이며 권한자 및 권한을 부여 받은 자를 확인 할 수 있다.

 

이제 부여한 권한을 다시 회수 할 것이다. 어떻게 회수가 되는지 확인이 필요하다.

 

SQL> conn scott/tiger
연결되었습니다.
SQL> revoke select on emp from user_1;

권한이 취소되었습니다.

 

SQL> conn user_1/user_1;
연결되었습니다.
SQL> select * from user_tab_privs
2 where table_name='EMP';

선택된 레코드가 없습니다.

 

SQL> conn user_2/user_2;
연결되었습니다.
SQL> select * from user_tab_privs
2 where table_name='EMP';

선택된 레코드가 없습니다.

 

※ scott이 user_1의 권한 revoke 하였지만, user_1이 user_2에게 부여한 권한도 같이 회수가 되는 것을 볼 수 있다.

 

(2) with admin option

 

SQL> conn /as sysdba

연결되었습니다.

 

SQL> grant alter session to user_1 with admin option;

권한이 부여되었습니다.

 

SQL> select * from dba_sys_privs where grantee like 'USER%';

GRANTEE PRIVILEGE ADM
---------- ------------------- ---
USER_1 CREATE VIEW NO
USER_1 CREATE TABLE NO
USER_1 ALTER SESSION YES
USER_1 CREATE SESSION NO
USER_2 CREATE TABLE NO
USER_2 CREATE SESSION NO

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

 

SQL> conn user_1/user_1
연결되었습니다.
SQL> grant alter session to user_2 with admin option;

권한이 부여되었습니다.

SQL> select * from user_sys_privs where username like 'USER%';

USERNAME PRIVILEGE ADM
----------------------- ------------------ ---
USER_1 CREATE VIEW NO
USER_1 CREATE TABLE NO
USER_1 ALTER SESSION YES
USER_1 CREATE SESSION NO

 

SQL> conn user_2/user_2
연결되었습니다.
SQL> select * from user_sys_privs where username like 'USER%';

USERNAME PRIVILEGE ADM
----------------------- ------------------ ---
USER_2 CREATE TABLE NO
USER_2 ALTER SESSION YES
USER_2 CREATE SESSION NO

SQL>

 

위 테이블을 보시면 ADM 컬럼에 YES로 나와있는 것을 볼수 있다.

 

이제 GRANT 권한을 회수한 것처럼 똑같이 해보겠다.

 

SQL> conn /as sysdba

 

SQL> revoke alter session from user_1;

권한이 취소되었습니다.

 

SQL> select * from dba_sys_privs where grantee like 'USER%';

GRANTEE PRIVILEGE ADM
---------- --------------- ---
USER_1 CREATE VIEW NO
USER_1 CREATE TABLE NO
USER_1 CREATE SESSION NO
USER_2 CREATE TABLE NO
USER_2 ALTER SESSION YES
USER_2 CREATE SESSION NO

 

※ dba_sys_privs를 보시면 user_2의 권한은 그대로 남아있고 user_1의 권한 회수 된것을 볼수 있다.

 

결론을 내리자면 with grant option 은 revoke 시 다른사용자에게도 부여한 권한을 같이 회수하지만 with admin option은 특정 사용자의 권한만 회수가 되고 나머지 다른사용자에게 부여된 권한은 회수가 되지 않는다.

 

사용된 테이블 : user_tab_privs

: dba_sys_privs

: user_sys_privs

'프로그램 > ORACLE' 카테고리의 다른 글

Linux 기반의 Oracle10g 설치  (0) 2016.11.30
Backup & Recovery  (0) 2016.11.30
데이터베이스]SEQUENCE(시퀀스)란 무엇인가?  (0) 2016.11.30
view에 사용되는 with check option  (0) 2016.11.30
오라클 함수 정리  (0) 2016.11.30
Posted by 숏퐁숑
, |

최근에 달린 댓글

글 보관함