2010-07-12 5 views
5

"CURRENT_DATE"라는 열이있는 "myTable"테이블을 만들었으며 데이터 유형은 "DATE"입니다. 프로그래밍 방식으로 테이블을 업데이트 할 때 CURRENT_DATE 필드에 타임 스탬프 또는 시스템 날짜를 배치하려고합니다. 내가하는 일의 일부가 아래에 나와 있지만 작동하지 않습니다. 나는 이것이 쉬울 것이라고 생각 하겠지만 ... 도와 주시겠습니까?SQL INSERT 시스템 테이블의 날짜

답변

8

매개 변수를 사용하여 준비된 명령문으로이 작업을 수행해야합니다. 매우 간단한 SQL 인젝션 위협을 차단하고 쉽게 처리 할 수 ​​있습니다.

Connection con = ...; 
PreparedStatement statement = con.prepareStatement("INSERT INTO myTable (NAME, CURRENT_DATE) VALUES (?, ?)"); 
statement.setString(1, userName); 
statement.setDate(2, currentDate); 
statement.execute(); 

준비된 명령문을 올바르게 사용하는 방법에 대한 정보가 충분합니다. 예를 들면 다음과 같습니다. http://www.jdbc-tutorial.com/jdbc-prepared-statements.htm

3

현재 날짜 만 원하면 변수로 제출하지 않고 SQL 서버에서 검색 할 수 있습니다. 사용하는 서버에 따라 조금씩 다르지만 MS SQL Server에는 getdate()이라는 기능이 있습니다.

stmt.executeQuery("INSERT INTO myTable (NAME) VALUES (' " + userName + " '" ') ");  
+0

나를이기십시오 - 좋은 대답 +1 –

0

이 시도 : 데이터 무결성을 위해

stmt.executeQuery("INSERT INTO myTable (NAME, CURRENT_DATE) VALUES (' " + userName + " ', GETDATE()) "); 
0

을, 당신은 완전히 필드를 생략 할 수 있도록

stmt.executeQuery("INSERT INTO myTable (NAME, CURRENT_DATE) VALUES (' " + userName + " ', getdate()");  

은 또한, 해당 필드에 대한 기본 값으로 getdate()을 설정할 수 있습니다 이것은 업데이트 및 삽입 트리거를 사용하여 DBMS에서 수행해야하는 작업입니다.

다른 모든 방법은 악의적 인 (또는 버그가 많은) 코드로 처리 할 수 ​​있습니다.

실제 값을 얻는 방법 (및 적절한 트리거를 만드는 방법)은 DBMS 자체에 따라 다릅니다. DB2는 서버 시간을 데이터베이스에 삽입하는 데 사용할 수있는 current date, current timecurrent timestamp을 제공합니다. 이는 수백 개의 서로 다른 클라이언트 시간보다 일관성이 있습니다.

2

SQL에 문자열을 넣지 마십시오. 준비된 명령문을 사용하고 매개 변수를 설정하십시오.

+1

SQL 주입 공격에 취약하지 않은 유일한 대답은 – krock

+0

입니다. 이것은 질문 일 뿐이므로 질문 일뿐입니다. 하지만 그 점에 대해서는 동의합니다.) –

+0

@David Hedlund : 주변 장치가 아닙니다. SQL에서 직접 문자열로 렌더링 된 날짜를 입력하는 것은 DBMS가 잘못 해석 할 수 있습니다. 코드에서 실제로 쿼리하는 DBMS를 알지 못하기 때문입니다 . – onof