2009-05-17 1 views
10

내게 어이없는 생각처럼 보입니다. 사람들이 UPDATE 또는 DELETE에서 WHERE 절을 잊어 버리고 전체 테이블을 삭제하는 것에 대한 수많은 이야기를 들었습니다. 나는 부주의 한 사람들이 직접적으로 쿼리를 내 보내서는 안되며 모든 행에 영향을 줄 수있는 합법적 인 경우가 있지만 기본적으로 이러한 쿼리가 필요한 옵션을 사용하는 것이 타당하지 않다는 것을 알고 있습니다. spec이이를 요구하지 않으며, 어쨌든 생산 데이터에 대해 직접 임시 SQL을 실행하지 않아야하기 때문에SQL Server에서 기본적으로 WHERE 절을 필수 항목으로 지정하지 않은 이유는 무엇입니까?

UPDATE MyTable SET MyColumn = 0 WHERE 1 = 1 -- tacky, I know 
+4

당신은 뇌사가 단순히 1 = 1 로테이트를 추가하지 않고 대신 생각하기 시작할 것이라고 가정하고 있습니다. 나는 그것이 일어날 것이라고 생각하지 않습니다. 결국 그들은 뇌사 상태입니다. 한편, 모든 기업은 "보안"을 위해 항상 "조쉬"옵션을 설정해야하며 사고 세계는 당신을 사냥하여 죽일 것입니다. IMHO, 물론, YMMV. –

+1

그래서 where 절이없는 업데이트와 삭제를 고의적으로 실행하는 것이 일반적이며, "사고 세계"는 나를 죽이려는이 옵션에 너무 귀찮을 것입니다. – Josh

+5

나는 사람들이'WHERE 1 = 1'을 타이핑하는 법을 배워야한다고 주장하지 않는다. 그러한 습관을 개발하기 위해서는 업데이트가 모든 행에 실제로 적용되기를 원하는 상황이 자주 발생해야하며, 그렇게하지 않으면 상황이 훨씬 덜 일반적으로 보입니다. 'WHERE 1 = 1'과 같은 것을 요구하는 요지는 실수로 F5를 너무 빨리 치거나 WHERE 절을 제외한 모든 것을 선택했던 사람들을 보호하기위한 것입니다. . –

답변

5

클라이언트 세션에서 자동 커밋을 false로 설정할 수 있습니까? 기본값은 무엇입니까?변경 사항을보기 위해 "커밋"을해야합니다. 거의 "정말로 하시겠습니까?" 유행.

이전 고용주의 모든 Oracle TOAD 클라이언트의 기본값이라고 생각합니다.

+0

니스! 나는 그것에 대해 알지 못했지만 SET IMPLICIT_TRANSACTIONS {ON | OFF} 그리고 명시된대로 명시 적 커밋을 요구하는 명령을 발생시킵니다. 지금부터는이 옵션을 사용하여 확실히 실행 하겠지만 SQL은 모든 행에 영향을 미치게됩니다. – Josh

+0

"훌륭하다"면, 투표를하고 답변을 수락하는 것이 어떻습니까? SQL 표준 기관에 자신이 결정을 승인하지 않았다는 사실을 알리도록 경고해야합니다. – duffymo

+0

나는 그것을 투표했지만 누군가가 따라 와서 모든 동의 응답을 표결했다. 누군가가 왜 할 수 없거나해서는 안되는 이유에 대해 설명 할 것인지를 기다리고 있었기 때문에 대답으로 표시하지 않았습니다. 그러나 "우리는 프로그래머이기 때문에 실수하지 말아야한다"고 대답합니다. 가장 인기있는 대답은 대답입니다. 나는 너의 것을 표시 할 것이다. – Josh

10

,

UPDATE MyTable SET MyColumn = 0 WHERE * 

또는 언어를 변경하지 않고 :처럼 쓸 수있다.

+5

"어쨌든 프로덕션 데이터에 대해 ad hoc sql을 직접 실행해서는 안됩니다." 롤. 사람들은 또한 고속도로의 속도 제한을 초과해서는 안됩니다.하지만 그들은 그렇게합니다. 사람들은 부상을 방지하기 위해 안전 벨트를 착용해야합니다. OP는 SQL 안전 벨트에서 안전 벨트가 필요없는 이유를 궁금해합니다. – TheSoftwareJedi

+6

안전 벨트는 최소한 하나의 옵션이어야합니다 – rpetrich

+2

안전 벨트가 옵션이어야하지만, IMHO는있을 필요는 없습니다. 우리는 프로그래머이며 데이터베이스의 상승과 하락을 일으키는 강력한 힘과 권력을 부여 받았습니다. 우리는 매일의 일에서 큰 책임과 보살핌을 사용해야합니다. 관리자는 사용할 수있는 경우 안전 벨트를 사용 가능하게 설정할 수 있지만 그 중 하나가 있어야한다고 생각하지는 않습니다. –

4

이 실수를 저지른 것은 프로그래머에게 길게 새겨진 문장입니다. 우리는 모두 그것을 만들었습니다 - 그리고 생산 데이터를 망쳐 버렸습니다 - 그것을 고치는 과정에서 많은 것을 배우십시오. 이 오류는 한 번만 발생하므로 개발자가 발생하면 순위에 참여하는 것을 보는 것이 즐겁습니다.

모든 일이 망쳐 버리는 것을 막기 위해서!

:

+0

고등 학교에서 처음으로 .com에 대한 기술 지원에 종사 한 첫 번째 직업은 말 그대로 "update users set lockout = 0 where ... ..."과 같은 명령을 실행하는 낮은 기술자들이다. 앱은 영원히 "개발 중"이었지만, . 누군가가 where 절을 잊었을 때 그들은 비명을 질렀습니다. :) 그러나 나는 항상 그 구문을 허용하는 이유가 궁금했고, 여전히 유효한 이유를 실제로 볼 수는 없습니다. – Josh

4

조엘, 조쉬의 질문의 요점은 사양이 그것을 필요로하지 않는 이유, 또는 임대에서 특정 데이터베이스를 필요로 할 것이다 옵션 설정을 생각?

당신이 말한 것처럼 사양에는 필요하지 않으므로 변경하지 않으려는 데이터베이스의 행을 변경하기 위해 잘못된 쿼리 (프로그램 적 버그 또는 단순한 프로그래밍 버그)가 발생할 수 있습니다.

암시적인 "ALL ROWS"는 암시 적 "NO ROWS"보다 더 위험한 방식입니다.

+2

암묵적인 NO ROWS라면 아마 모든면에서 최고의 이익이 될 것이라는 점에 동의해야합니다. –

0

나는이 경험을 한 번만 알고 있습니다. 한 번 발생하면 결코 다시는 일어나지 않도록하십시오 !!!

5

은 그냥 안전 우리가 항상 트랜잭션에서 실행할 수있는 재생 :

BEGIN TRAN 

UPDATE MyTable SET MyColumn = 0 

그런 다음 행 개수가 잘 보이는 경우 : 내 관점에서

COMMIT TRAN 
+0

대단한 제안입니다. 나는 나의 기준이 좋다는 것을 확인하는 것보다 다른 이유가 없다면 항상 그렇게한다. – Josh

4

이것은 rethoric 질문이다, 내 말은 그게 제안 일종의 의미 ...

증서에, 나는 그것이 정말 좋은 것 "SAFE_UPDATE"또는 이와 비슷한 몇 가지 설정이있을 수 있다는 것을 발견 ...

,

나는 보통, 로빈의 팁 외에 전에 바로 업데이트됩니다 기록을 살펴 가지고,이

update mytable set column = xx 
-- select * from mytable 
where mycondition = mycondition 

같은 것을 선택에 쿼리를 실행하는 것입니다 (에 allways 트랜잭션을 열) 무엇을 업데이트 난 그냥 당신에 allways 백업을해야한다, 어쨌든 ...

을 선택에서를 선택하고 반환을 확인 ... 거래 내부 작업 (나는 SQL 2005 스냅 샷이 꽤 너무 멋진 들었다)

0

조시 실제로 테이블의 모든 행을 삭제하거나 업데이트하고 싶지는 않습니다.

1

MySQL은 임시 쿼리에 해당 옵션을 제공합니다. --safe-updates (또는 --i-am-a-dummy)라고합니다. 다른 사람들이 지적했듯이, 우리는 의 모든 실수를 한 번 겪었습니다. 임시 쿼리를 실행하는 우리 중 누구도 항상 오전 1시에 을 실수로 두 번 이상 만들었습니다.

나는 "바보 증명"시스템과 "확실합니까?"대화 상자가 일반적으로 싫지만 나는이 옵션을 좋아합니다. 조심해야하지만주의조차해야합니다. 천 시간당 하나의 오류가 발생할 수 있습니다. 프로덕션 시스템에서 주를 루트로 로그인 한 시간이 50 시간이라면, 은 1 년에 2 1 분의 2 대 스크류 업입니다. 그 이유와 다른 이유로, 우리는 --safe-updates가 매우 유용하다는 것을 알게됩니다.

대부분의 MS 확인 메시지보다 유용한 두 가지 이유가 있습니다. 먼저 오류가 될 가능성이 높은 내용 인 ""을 찾아냅니다. "그 파일을 삭제 하시겠습니까?" 대부분의 파일 삭제 정말 원하는, 그래서 성가심 확인입니다. 대부분의 " 사용자 삭제"에서 where 절이 누락되면 실제로 오류가 발생합니다. 둘째, 가능성이있는 문제가 정확히 무엇인지를 가리키는 입니다. 누락 된 where 절입니다. 그것은 입니다. 파일 삭제 확인 메시지가 "실제로는 새 업데이트 된 사본이 아니고 삭제하려는 복사본이 아닙니다. 실제로 새 복사본을 삭제 하시겠습니까, 아니면 삭제하려고 했습니까? 옛것 대신에? "

어쨌든, 일반적으로 나는 "멍청한 증거"가 싫지만 나는 안전 업데이트가 좋고 옵션을 사용하면 필요하지 않은 사람들에게 유용합니다. 저의 관심사 인 은 기능이있는 시스템에서 지속적으로 작업하는 경우 MySQL에서 MSSQL으로 전환하는 것과 같은 시스템없이 시스템으로 전환 할 때 누군가가 지저분하고 문제가 발생할 수 있습니다.

마지막주의 사항을 긁으십시오. 오픈 소스에 익숙해지면 올바른 생각을 가진 사람이 누구도 MS로 전환하지 않습니다. :)

관련 문제