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이 되는지 확인할 수 있다.


Posted by 사라링

1. 다운로드 할 파일 주소에서 파일 이름 취득.

2. 파일 주소로 접속해 파일을 읽어들임.

3. 읽어들인 파일을 다운로드 디렉토리에 1.에서 취득한 파일 이름으로 쓰기.

4. 종료.

 

import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;
import java.net.URLConnection;

public class FileUrlDownload {
 /**
  * 버퍼 사이즈
  */
 final static int size = 1024;

 /**
  * fileAddress에서 파일을 읽어, 다운로드 디렉토리에 다운로드
  * 
  * @param fileAddress
  * @param localFileName
  * @param downloadDir
  */
 public static void fileUrlReadAndDownload(String fileAddress,
   String localFileName, String downloadDir) {
  OutputStream outStream = null;
  URLConnection uCon = null;

  InputStream is = null;
  try {

   System.out.println("-------Download Start------");

   URL Url;
   byte[] buf;
   int byteRead;
   int byteWritten = 0;
   Url = new URL("fileAddress);
   outStream = new BufferedOutputStream(new FileOutputStream(
     downloadDir + "\\" + localFileName));

   uCon = Url.openConnection();
   is = uCon.getInputStream();
   buf = new byte[size];
   while ((byteRead = is.read(buf)) != -1) {
    outStream.write(buf, 0, byteRead);
    byteWritten += byteRead;
   }

   System.out.println("Download Successfully.");
   System.out.println("File name : " + localFileName);
   System.out.println("of bytes  : " + byteWritten);
   System.out.println("-------Download End--------");

  } catch (Exception e) {
   e.printStackTrace();
  } finally {
   try {
    is.close();
    outStream.close();
   } catch (IOException e) {
    e.printStackTrace();
   }
  }
 }

 /**
  * 
  * @param fileAddress
  * @param downloadDir
  */
 public static void fileUrlDownload(String fileAddress, String downloadDir) {

  int slashIndex = fileAddress.lastIndexOf('/');
  int periodIndex = fileAddress.lastIndexOf('.');

  // 파일 어드레스에서 마지막에 있는 파일이름을 취득
  String fileName = fileAddress.substring(slashIndex + 1);

  if (periodIndex >= 1 && slashIndex >= 0
    && slashIndex < fileAddress.length() - 1) {
   fileUrlReadAndDownload(fileAddress, fileName, downloadDir);
  } else {
   System.err.println("path or file name NG.");
  }
 }

 /**
  * main
  * 
  * @param args
  */
 public static void main(String[] args) {

  // 파일 어드레스
  String url = "http://localhost/download/index.php";
  // 다운로드 디렉토리
  String downDir = "C:/Temp";

  // 다운로드 호출
  fileUrlDownload(url, downDir);

 }
}

 

저는 localhost/download/index.php란 파일을 다운로드하는 샘플 소스입니다.

실행하면 아래와 같이 출력됩니다.

-------Download Start------
Download Successfully.
File name : index.php
of bytes  : 2605
-------Download End--------



Posted by 사라링

select /* 오늘날짜 시분초 포함*/ 

              to_char(sysdate,'yyyy/mm/dd hh24:mi:ss') 

    from dual


 

select /* 오늘날짜 00시 00분 00초 */ 

              to_char(trunc(sysdate),'yyyy/mm/dd hh24:mi:ss') 

    from dual

 

select /* 오늘날짜 00시 00분 00초 위와 동일*/ 

              to_char(trunc(sysdate,'dd'),'yyyy/mm/dd hh24:mi:ss') 

    from dual


select /* 이번달 1일 00시 00분 00초 */ 

              to_char(trunc(sysdate,'mon'),'yyyy/mm/dd hh24:mi:ss') 

    from dual


select /* 올해 1월 1일 00시 00분 00초 */ 

              to_char(trunc(sysdate,'year'),'yyyy/mm/dd hh24:mi:ss') 

    from dual

 

select /* 올해 1월 1일 00시 00분 00초 */ 

              to_char(to_date('2002','yyyy'),'yyyy/mm/dd hh24:mi:ss') 

    from dual

 

select /* 2월 1일 00시 00분 00초 */ 

              to_char(to_date('200202','yyyymm'),'yyyy/mm/dd hh24:mi:ss') 

    from dual


select /* 2월 2일 00시 00분 00초 */ 

              to_char(to_date('20020202','yyyymmdd'),'yyyy/mm/dd hh24:mi:ss') 

    from dual

 

select /* 2월 2일 00시 00분 01초 */ 

              to_char(to_date('20020202','yyyymmdd')+1/68400,'yyyy/mm/dd hh24:mi:ss') 

    from dual

 

select /* 2월 2일 00시 00분 00초 -> 한달뒤*/ 

              to_char(add_months(to_date('20020202','yyyymmdd'),1),'yyyy/mm/dd hh24:mi:ss')


 from dual

 

from en-core

laalaal~ 

 

 

날짜 빼기

 

밑에 날짜 빼기가 있던데 요건 약간 다르게..

(1) 현재 날자에서 하루를 빼고 싶다고 하면 

            select sysdate() - 1 from dual

(2) 1시간을 빼고 싶으면 

            select sysdate() - 1/24 from dual

(3) 1분을 빼고 싶으면 

            select sysdate() - 1/24/60

(q) 1초를 빼고 싶은면 어떻게 할까요? ^^

 

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

- 날짜형 함수

    SYSDATE : 현재 시스템의 날짜 및 시간을 구함

    LAST_DAY : 지정한 날짜의 해당 월의 마지막 날짜를 구함

    MONTHS_BETWEEN : 두 날짜 사이의 개월 수를 구함

    ADD_MONTHS : 지정한 날짜로부터 몇 개월 후의 날짜를 구함

    ROUND : 날짜에 대한 반올림

    TRUNC : 날짜에 대한 버림

 

    SYSDATE : SYSDATE → 10-MAY-99

    LAST_DAY(날짜값) : LAST_DAY('17-FEB-98') → 28-FEB-98

   MONTHS_BETWEEN(날짜값1, 날짜값2) : MONTHS_BETWEEN('26-APR-97','22-JUL-95') → 21.1290323

   ADD_MONTHS(날짜값, 숫자값) : ADD_MONTHS('22-JUL-95',21) → 22-APR-97

      ROUND(날짜값, 자리수) : 현재 날짜가 1999년 5월 10일이라고 가정하자.

                              ROUND(SYSDATE,'MONTH') → 01-MAY-99

      TRUNC(날짜값, 자리수) : 현재 날짜가 1999년 5월 10일이라고 가정하자.

                              TRUNC(SYSDATE,'YEAR') → 01-JAN-99

 

  - 날짜에 대한 산술연산

    날짜 + 숫자 : 날짜 특정한 날로부터 몇일 후의 날짜 계산

    날짜 - 숫자 : 날짜 특정한 날로부터 몇일 전의 날짜 계산

    날짜 - 날짜 : 숫자 두 날짜 사이의 차이를 숫자로 계산

 


- 변환형 함수


    TO_CHAR : 숫자나 날짜를 문자열로 변환

    TO_NUMBER : 문자를 숫자로 변환

    TO_DATE : 문자를 날짜로 변환

 

      - TO_CHAR에서 숫자를 문자로 변환시에 형식에 사용되는 요소

          9 : 일반적인 숫자를 나타냄

          0 : 앞의 빈자리를 0으로 채움

          $ : dollar를 표시함

          L : 지역 통화 단위(ex \)

          . : 소숫점을 표시함

          , : 천단위를 표시함

      - TO_CHAR에서 날짜를 문자로 변환시에 형식에 사용되는 요소

          SCC : 세기를 표시 S는 기원전(BC) 

          YEAR : 연도를 알파벳으로 spelling

          YYYY : 4자리 연도로 표시

          YY : 끝의 2자리 연도로 표시

          MONTH : 월을 알파벳으로 spelling

          MON : 월의 알파벳 약어

          MM : 월을 2자리 숫자로 표시

          DAY : 일에 해당하는 요일

          DY :  일에 해당하는 요일의 약어

          DDD,DD,D : 연도,월,일 중의 날짜를 숫자로 표시

          HH , HH24 : (1-12) , (0-23)중의 시간을 표시

          MI : 분을 표시

          SS : 초를 표시

          AM(A.M.),PM(P.M.) : 오전인지 오후인지를 표시

 

      TO_CHAR(문자값,‘형식’)

        숫자를 문자로 변환 : TO_CHAR(350000,'$999,999')→ $350,000

        숫자를 날짜로 변환 : TO_CHAR(SYSDATE,'YY/MM/DD')→ 95/05/25

      TO_DATE(문자값, ‘형식’) : TO_DATE('10 SEPTEMBER 1992','DD MONTH YYYY')→10-SEP-92

      TO_NUMBER(문자값) : TO_NUMBER('1234')→ 1234

Posted by 사라링

BLOG main image
.. by 사라링

카테고리

사라링님의 노트 (301)
JSP (31)
J-Query (41)
JAVA (24)
VM-WARE (0)
디자인패턴 (1)
스크랩 (0)
스트러츠 (3)
안드로이드 (11)
오라클 (45)
우분투-오라클 (1)
이클립스메뉴얼 (6)
스프링3.0 (23)
자바스크립트 (10)
HTML5.0 (17)
정보처리기사 (1)
기타(컴퓨터 관련) (1)
문제점 해결 (3)
프로젝트 (2)
AJAX (4)
하이버네이트 (3)
트러스트폼 (11)
Jeus (2)
재무관리(회계) (5)
정규식 (5)
아이바티스 (8)
취미 (2)
소프트웨어 보안 관련모음 (0)
정보보안기사 (6)
C언어 베이직 및 프로그램 (3)
보안 관련 용어 정리 (2)
넥사크로 (6)
Total :
Today : Yesterday :