공부한것들을 정리하는 블로그 입니다.
DB SQL문에 where 1=1을 쓰는 이유 본문
- DB SQL문에 where 1=1을 쓰는 이유?
주석처리하기 편하라고
where조건절의 다음 조건부터는 and @@@ 이렇게 쓰게 될텐데
where절 첫줄부터 코딩을 하면 주석처리 했을시 where를 다시 타이핑해야됨
- 그 외
특정 테이블의 구조만 복사할 때
where 1=1은 참을 의미합니다
where 1=2는 거짓을 의미합니다
따라서 특정 테이블의 구조만 복사할 때
create table emp2
as
select * from emp
where 1=2;
형식으로 주면 됩니다.
(where 1=1로하면 구조와 내용 전부 복사됨)
WHERE 1=1의 잠재된 위험성(참고 : http://jdm.kr/blog/7)
분명 조회(select) 쿼리에서는 WHERE 1=1은 훌륭한 전략이 될 수도 있다. 매번 WHERE 절을 컨트롤하느니 그냥 파라미터를 전부 받아버리면 최소한 WHERE 절이 처음에 올지 AND가 올지 결정할 필요는 없어지니까 말이다. 그러나 반대로 갱신(Update) 쿼리 또는 삭제(Delete) 쿼리에서는 어떻게 될까. 아무런 예외 처리 없이 WHERE 1=1을 사용하면 다음처럼 된다.
StringBuffer sql = new StringBuffer(); sql.append("\n SELECT * "); sql.append("\n FROM test_tbl "); sql.append("\n WHERE 1=1 "); if( first != null ){ sql.append("\n AND first = '1' "); } if( second != null ){ sql.append("\n AND second = '1' "); }
부끄러운 소스를 다시 한번 들고 나왔다. 이 소스를 보면 분명 first, second에 대해 null 처리가 된것처럼 보인다. 하지만 실제로 first, second가 null 값을 가지고 있다면 다음과 같은 쿼리가 완성된다.
SELECT * FROM test_tbl WHERE 1=1
위 쿼리가 돌아간다면 test_tbl에 해당하는 row가 전부 출력될 것이다. 이건 select 쿼리이기 때문에 그렇게 큰 문제가 없다고 할 수 있겠으나 정말 중요한 것은 update, delete 등의 쿼리이다. 아래의 코드를 보면 알 수 있다.
StringBuffer sql = new StringBuffer(); sql.append("\n DELETE FROM test_tbl "); sql.append("\n WHERE 1=1 "); if( first != null ){ sql.append("\n AND first = '1' "); } if( second != null ){ sql.append("\n AND second = '1' "); }
분명히 정상적으로 파라미터가 입력된다면야 정확한 삭제가 될만한 쿼리가 나올것이다. 하지만 아까처럼 first, second 값이 null로 들어온다면?
DELETE FROM test_tbl WHERE 1=1
위와 같은 쿼리가 되면서 DB 테이블 하나가 통째로 날아갈 수도 있다. 이것이 바로 잠재된 위험성이다. 그러니 예외 처리 확실히 하자. 두번 하자.
'잡담 > 잡담' 카테고리의 다른 글
ie 설정값 레지스트리로 백업하기 (0) | 2019.08.21 |
---|---|
갤럭시 안드로이드9(파이) os 업데이트 후, 충전 케이블 연결할 때 화면에 배터리 퍼센트가 동그란 원 모양으로 표시됨. 없애는법 (0) | 2019.08.13 |
변경사항에 대한 고찰(유지보수, 레거시코드) (0) | 2019.06.28 |
안경 교체시 고려 (0) | 2018.10.08 |
내가 자주쓰는 Oracle SQL Developer 단축키 (0) | 2018.10.06 |
티스토리 카테고리목록 depth를 늘릴 수는 없을까 (0) | 2018.10.06 |
인터페이스를 쓰는 이유 - 개인생각 (0) | 2017.08.12 |
KOSA : it 경력관리 (0) | 2017.08.03 |