티스토리 툴바


Rebuild Table을 Toad를 이용하여 컬럼위치 변경 하는 방법이다.

처음 생성 되었던 테이블에 컬럼이 추가되는 경우가 있는데 이후 위치를 바꾸고 싶을때가 있다. 
이전엔 테이블을 다시 생성하였지만 이 기능을 이용하면 아주 편리하게 변경이 가능하다.

1. Toad를 실행 후 Schema Browser를 그림과 같이 단축아이콘을 이용해 실행한다.
    메뉴 : Database > Schema Browser



2. Schema Browser화면으로 변경할 컬럼의 위치 부분을 박스로 표시 했듯이
   CCODEMST 테이블의 USEYN <-> REMARK 컬럼 위치를 변경하고자 한다.
   그리고, 좌측 테이블 리스트에서 CCODEMST테이블을 선택 후 오른쪽 마우스를 클릭한다.



3. CCODEMST 테이블에서 오른쪽 마우스를 클릭하면 다음과 같이 메뉴가 나오며, Rebuild Table을 선택한다.




4. 탭 메뉴에서 Columns항목으로 이동한다. USEYN항목을 마우스로 클릭해 위로 한칸 옮긴다.



5. USEYN, REMARK 항목이 변경되었다면 탭 메뉴에서 SQL탭을 선택한다.
    SQL탭 메뉴 변경시 자동 스크립트가 생성된다.


 
6. SQL탭을 선택하면 잠시 로딩 후 버튼이 활성화 된다. 버튼 클릭!!
   (화면 내용을 보면 기존 테이블은 CCODEMST_X로 한다)

 

 

7. 스크립트 실행 후 ERROR가 발생했는지 확인 할 수 있다.




8. 스크립트를 실행한 결과이다. CCODEMST, CCODEMST_X 테이블이 생성된걸  확일 할 수 있다.



9. CCODEMST 테이블에서 USEYN, REMARK의 위치가 변경 된걸 확인 할 수 있다.
   마지막으로 CCODEMST 테이블이 옳바르게 변경되었다면 CCODEMST_X테이블을 삭제(DROP) 한다.

출처 - http://yysvip.tistory.com/149

크리에이티브 커먼즈 라이선스
Creative Commons License

AIX서버 서버상태확인

Linux 2012/04/20 11:11 Posted by 애플자라

topas or nmon

nomn상태에서 아래와 같이 눌름

c : cpu
m : memory
d : disk
t : process

출처 - 하정민 님

크리에이티브 커먼즈 라이선스
Creative Commons License

[ORACLE]Table Lock 걸렸을 때 처리 (ORA-00054)

Database 2012/04/19 11:45 Posted by 애플자라

ORA-00054 발생했을때 처리하는 방법..

발생 가능성은 다양하게 존재한다. Commit가 수행되지 않았을 경우라던가 Toad에서 Schema Browser를 사용하다가 삽질을 했다던가 등의 문제로 다양한 경우에서 발생할 수 있는 문제이다.

Truncate같은 명령은 ORA-00054라는 에러라도 출력하지만, DML(Delete) 문장 실행시엔 그냥 멈춰버리는 경우도 있다고 한다.

해결 방법은 오라클 서비스를 재시작 하면 쉽게 처리가되지만, DB를 사용하는 곳에서 DB 재시작이 그리 녹녹하진 않을 것이다. 이러한 에러가 발생하는 이유는 테이블에 Lock이 걸려서 생기는데 이 원인을 해결해주면 된다.


[Qeury]

SELECT A.sid , A.serial#
FROM v$session A , v$lock B , dba_objects C
WHERE A.sid = B.sid and B.id1 = C.object_id
AND B.type = 'TM' and C.object_name='TABLE_NAME';


[Result]

     SID    SERIAL#
------- ----------
    2391       18325


Lock를 하고 있는 대상의 데이터가 나오면

ALTER system kill session '2391, 18325';

와 같은 쿼리를 날려서 원인이 되는 세션을 날려버리면 된다.

출처 - http://www.secret.pe.kr/6323

크리에이티브 커먼즈 라이선스
Creative Commons License

[ORACLE]테이블명,인덱스명 변경

Database 2012/03/30 14:08 Posted by 애플자라

테이블명 변경: RENAME {변경전이름} TO {변경후이름};
인덱스명 변경: ALTER INDEX {변경전이름} RENAME TO {변경후이름};

1.변경하고자 하는 COLUMN으로 Unique Index를 생성한다.

쿼리 -
CREATE UNIQUE INDEX PK명 ON TABLE명(COLUMN명) TABLESPACE TABLESPACE명;
예제(테이블스페이스는 사용 안함) -
CREATE UNIQUE INDEX PK_FTA_PO_LEDGER ON FTA_PO_LEDGER(COMPANY_CODE, PROJECT_CODE, FTA_CODE, ITEM_CODE);


2.해당하는 PK를 삭제한다
쿼리 -
ALTER TABLE TABLE명 DROP CONSTRAINT PK명;
예제(테이블스페이스는 사용 안함) -
ALTER TABLE FTA_PO_LEDGER DROP CONSTRAINT FTA_PO_LEDGER_PK;


3.PK에 속성을 추가한다.
쿼리 -
ALTER TABLE TABLE명 ADD CONSTRAINT PK명 PRIMARY KEY(COLUMN명);
예제 -
ALTER TABLE FTA_PO_LEDGER ADD CONSTRAINT PK_FTA_PO_LEDGER PRIMARY KEY(COMPANY_CODE, PROJECT_CODE, FTA_CODE, ITEM_CODE);

select * from USER_IND_EXPRESSIONS where table_name = 'COUNSELLING'; -- 인덱스검색

[출처] 테이블의 PK 변경하기 (개발자로 살아남기) |작성자 정우아빠

크리에이티브 커먼즈 라이선스
Creative Commons License

 

//지남하 start!!!

function fnCheckPassword(uid, upw) {

    var chk_num = upw.search(/[0-9]/g);
    var chk_eng = upw.search(/[a-z]/ig);
    var strSpecial = upw.search(/[`~!@#$%^&*|\\\'\";:\/?]/gi);

    var birth = document.forms[0].birth.value;
    var sub_birth = birth.substring(4,8);

    var isCapslock = false;

    //alert("주민등록번호 : "+<%=resident_id%>);  6407201234567
    <%
         String sub_resident_id = resident_id.substring(7,13);
     %>
    var strResident_id = "<%=sub_resident_id%>";

    alert("web_id =>"+document.forms[0].web_id.value +'\n\n'+"web_pwd =>"+document.forms[0].web_pwd.value);
    //alert("birth =>"+document.forms[0].birth.value);
    alert("sub_birth =>"+sub_birth);    
    //alert("strResident_id =>"+strResident_id); 

     if( upw.indexOf( uid ) > -1) {
         alert("비밀번호에 ID를 포함할수 없습니다.");
         return false;
     }

     /* check whether input value is included space or not  */
     var retVal = checkSpace( upw );
     if( retVal ) {
         alert("비밀번호는 공백없이 입력해 주세요.");
         return false;
     }

     if( upw.indexOf( strResident_id ) > -1){
        alert("비밀번호에 주민등록번호를 포함할수 없습니다.");
        return false;
    }
    
     if( upw.indexOf( document.forms[0].birth.value ) > -1 || upw.indexOf( sub_birth ) > -1){
        alert("비밀번호에 생년월일을 포함할수 없습니다.");
        return false;
    }

    if( upw.indexOf( document.forms[0].cellphone_3.value ) > -1){
        alert("비밀번호에 휴대폰을 포함할수 없습니다.");
        return false;
    }

    if( upw.indexOf( document.forms[0].homephone_3.value ) > -1){
        alert("비밀번호에 자택 연락처를 포함할수 없습니다.");
        return false;
    }

    if(upw.search(uid)>-1){
        alert("ID가 포함된 비밀번호는 사용하실 수 없습니다.");
        return false;
     }

    if(upw.length < 8){
        alert("8자 이상의 비밀번호만 입력 가능 합니다.");
        return false;
     }

    if(upw.length > 12){
       alert("12자 이하의 비밀번호만 입력 가능 합니다.");
       return false;
     }

    if(upw.length < 8 || upw.length > 12){
       alert("비밀번호를 8자리 이상 12자리 이하로 입력 가능 합니다.");
       return false;
     }

    if(chk_num < 0 || chk_eng < 0 || strSpecial < 0){ 
       alert('비밀번호는 문자,숫자,특수문자가 조합 되어야 합니다.'); 
       return false;
     }

    return true;
}

// space 가 있으면 true, 없으면 false
function checkSpace( str )
{
     if(str.search(/\s/) != -1){
      return true;
     } else {
        return false;
     }
}

//지남하 end!!!

크리에이티브 커먼즈 라이선스
Creative Commons License

[MSSQL]LPAD,RPAD,프로시저

Database 2012/03/20 11:49 Posted by 애플자라

CREATE PROCEDURE [dbo].[AP_getcustcode] AS
BEGIN
 RETURN SELECT dbo.lpad(
   ( select max(cust_code)+1 from customerinfo ), 15, '0' )

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

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER OFF
GO
CREATE   FUNCTION [dbo].[GetCSContactSeqNew]  ( @CustCode char(15) )
RETURNS char(3) AS 
BEGIN
declare  @id char(3)
 SELECT @id = dbo.LPAD( ISNULL(MAX(CSCON_CODE)+1,1), 3, '0') FROM CSCONTACT WHERE CUST_CODE = @CustCode
 IF @id = NULL
  BEGIN
   SELECT @id = dbo.LPAD( '1', 3, '0')
  END
 RETURN @id
END

dbo.GetCSContactSeqNew('${CUST_CODE}')

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

SET ANSI_NULLS OFF
GO
SET QUOTED_IDENTIFIER OFF
GO
CREATE FUNCTION [dbo].[LPAD]
   ( @sSrcValue nvarchar(20), @nSize int, @sChar nvarchar(2)) 
RETURNS nvarchar(100)  AS 
BEGIN
RETURN (ISNULL( REPLICATE(@sChar, @nSize-len(@sSrcValue))+@sSrcValue, substring(@sSrcValue,len(@sSrcValue)-@nSize+1,len(@sSrcValue) )   ))
END

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

SET ANSI_NULLS OFF
GO
SET QUOTED_IDENTIFIER OFF
GO
CREATE FUNCTION [dbo].[RPAD]
   ( @sSrcValue nvarchar(20), @nSize int, @sChar nvarchar(2)) 
RETURNS nvarchar(100)  AS 
BEGIN
RETURN (@sSrcValue+REPLICATE(@sChar, @nSize-len(@sSrcValue)))
END

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


크리에이티브 커먼즈 라이선스
Creative Commons License

쿼리 깔끔하게 정리하기

Database 2012/03/14 11:16 Posted by 애플자라

Google 에서 SQL Formatter 로 검색하면 많은 SQL문장 정리 싸이트들이 나온다.

그 중에서 나는 http://www.sqlinform.com가 제일 괜찮은 것 같다.

자바 애플릿으로 Java 언어 등에서 String 으로 연결된 문자열을 그냥 던져줘도 알아서 SQL문만 뽑아내서 정리해준다.
반대로 SQL 문장을 Java 문자열로 연결해주기도 한다.
크리에이티브 커먼즈 라이선스
Creative Commons License

SELECT   OWNER,
         OBJECT_NAME,
         OBJECT_TYPE,
         CREATED,
         LAST_DDL_TIME
  FROM   DBA_OBJECTS 
 WHERE   owner = 'APLUSORA' -- 계정
 --AND object_name = 'EMS_V_KIUM_CUSTOMER_LETTER' -- 테이블/INDEX/VIEW

-- 오너, 테이블명, 타입, 테이블생성날짜, 마지막 DDL 날짜
-- 마지막 DDL 날짜는 GRANT, REVOKE등 해당 OBJECT에 대한 권한작업 시에도 갱신됨

크리에이티브 커먼즈 라이선스
Creative Commons License


예를 들어 다른 계정에서 특정 유저가 갖고있는 테이블 "COM_COD_DPT" 의 select 권한을 주고 싶을때 다음과 같이 grant 를 주시면 됩니다.

<< kss user login >>

GRANT SELECT ON EMS_V_KIUM_CUSTOMER_LETTER TO EDM ;

이렇게 하신후 다른 계정 (예, sukwoo 라는 다른 유저) 에서 해당되는 테이블을 select 하시면 select 가 될겁니다..........

<< sukwoo (다른 유저) user login >>

select *
from APLUSORA.EMS_V_KIUM_CUSTOMER_LETTER ;

하시면 select 가 될겁니다.


<예>

GRANT ALTER ON APLUSORA.COM_USR_M TO PUBLIC;
GRANT DELETE ON APLUSORA.COM_USR_M TO PUBLIC;
GRANT INSERT ON APLUSORA.COM_USR_M TO PUBLIC;
GRANT SELECT ON APLUSORA.COM_USR_M TO PUBLIC;
GRANT UPDATE ON APLUSORA.COM_USR_M TO PUBLIC;
GRANT INDEX ON APLUSORA.COM_USR_M TO PUBLIC;
GRANT REFERENCES ON KSSHS.COM_USR_M TO PUBLIC;

GRANT ON COMMIT REFRESH ON APLUSORA.COM_USR_M TO PUBLIC;
GRANT QUERY REWRITE ON APLUSORA.COM_USR_M TO PUBLIC;
GRANT DEBUG ON APLUSORA.COM_USR_M TO PUBLIC;
GRANT FLASHBACK ON APLUSORA.COM_USR_M TO PUBLIC;

 

GRANT SELECT ON APLUSORA.CUSTOMER TO EDM;

=> EDM계정에서 APLUSORA.CUSTOMER SELECT권한주기

 

크리에이티브 커먼즈 라이선스
Creative Commons License

1. 증상
오라클 특정 유저 패스워드 변경 후 처음에는 로그인이 잘 되었는데 어느순간 부터 ORA-28000 : the account is locked 오류 발생

2. 원인
특정 유저 패스워드 변경 후 수시로 DB에 접속하는 프로그램에서 변경된 패스워드를 반영하지 않았음. 프로그램에서 계속 잘못된 패스워드로 접속을 시도하였고 오라클 설정에 따라 자동으로 특정 유저가 LOCK됨.



3. 해결방법

1) USER 패스워드 만료 상태 확인하기
1. system계정으로 로그인 하여 다음을 입력 한다.
C:\> sqlplus "/as sysdba" --system계정으로 로그인
...
SQL> select * from dba_users; --DB유저 정보 확인하기

SELECT USERNAME,
             ACCOUNT_STATUS,
             TO_CHAR(LOCK_DATE,'YYYY.MM.DD HH24:MI') LOCK_DATE          
    FROM DBA_USERS
  WHERE USERNAME = '계정';

2. ACCOUNT_STATUS컬럼을 확인한다.
- OPEN : 정상
- LOCKED(TIMED) : 패스워드 설정 횟수 이상 잘못입력하여 잠김
- EXPIRED & LOCKED : 패스워드 기간이 만료되어 잠김
...
접속 시 오류난 유저의 ACCOUNT_STATUS컬럼을 보면 LOCKED(TIMED)으로 되어 있을 것 이다.

2) LOCK걸린 유저 UNLOCK하기
1. system계정으로 로그인 하여 다음을 입력 한다.
C:\> sqlplus "/as sysdab" --system계정으로 로그인
...
SQL> alter user 유저명 account unlock; --LOCK걸린 유저 UNLOCK하기

2. LOCK되었던 유저로 로그인을 확인한다.

3. 패스워드 변경
ALTER USER SYSTEM IDENTIFIED BY ****;


3. 결과
우리가 은행에서 현금 인출할 때 비밀번호를 3번이상 잘못 입력하면 은행에 가서 풀어야 하는 것처럼 오라클도 이러한 기능을 제공을 하는 것 같다.
보안상 좋은 기능이지만 어찌보면 굉장히 위험한 기능인 것 같다. 외부에서 누군가가 악한 마음을 갖고 잘못된 패스워드로
계속 접근을 시도해서 유저를 LOCK시켜 버린다면... 에효... 물론 이에 대한 해결방안이 있겠지만... 나중에 찾아봐야겠다.

4. 추가로 알아보기
그럼 과연 몇번 패스워드 입력을 실패하면 LOCK이 걸릴까? 한번 알아보았음.

1) 패스워드 LOCK횟수 확인하기
1. system계정으로 로그인 하여 다음을 입력 한다.
C:\> sqlplus "/as sysdab" --system계정으로 로그인
...
SQL> SELECT U.USERNAME,P.PROFILE, P.RESOURCE_NAME, P.LIMIT
FROM DBA_USERS U, DBA_PROFILES P WHERE P.PROFILE=U.PROFILE
AND RESOURCE_NAME='FAILED_LOGIN_ATTEMPTS';
...

2. 위 sql문을 입력 하면 계정별로 몇번의 패스워드 실패시 LOCK이 되는지 확인할 수 있다.
  
크리에이티브 커먼즈 라이선스
Creative Commons License