나중에 실행하기 위해 SQL 문을 테이블에 저장하는 것이 나쁜 생각입니까?


21

나중에 실행하기 위해 SQL 문을 MySQL 테이블에 저장하는 것이 나쁜 생각입니까? SQL 문은 실행할 준비가됩니다 DELETE FROM users WHERE id=1. 예를 들어 스왑 할 매개 변수가 없습니다 .

나는 게으르다 고 생각하지만 SQL 문을 주기적으로 실행하는 꽤 많은 cron 작업이 필요한 프로젝트에서 작업하고 있기 때문에이 아이디어를 생각했습니다.


이러한 SQL 문을 한 번 실행하려는 경우 또는 동일한 명령문 세트를 반복적으로 실행하려는 경우 명확해야합니다.
GrandmasterB

10
이 모든 질문은 근본적인 접근 방식이 잘못된 상황 중 하나처럼 보입니다. 그러나 우리는 문제 공간에 대해 거의 알지 못하기 때문에 정확히 무엇을 말하기가 어렵습니다.
Erick Robertson

답변:


46

그것이 당신이 요구하는 것이면 안전합니다. 데이터 보안과 마찬가지로 보안에주의를 기울이는 한.

그러나 저장 프로시 저는 테이블에 저장된 SQL의 일부입니다. 그리고 그들은 매개 변수화를 지원합니다.

또한 cron 대신 MySql Event Scheduler 를 사용하여 보안을 단순화하고 실패 지점을 줄이고 네트워크 통신을 줄일 수 있습니다 .

다른 데이터베이스에는 그와 동등한 이유가 있습니다. 이 기능이 가장 먼저 필요한 것은 아닙니다.


1
스케줄러 사용시 +1 proc에 대한 스케줄러의 액세스를 제한하는 것이 테이블 액세스보다 낫습니다.
JeffO

그러나 UI에서 이러한 쿼리를 동적으로 작성해야하는 경우에는 어떻게됩니까? 예를 들어 관리자가 복잡한 쿼리를 기반으로 웹 컨텐츠에 대한 액세스 규칙을 동적으로 설정할 수 있도록 허용하는 경우. UI가 데이터베이스에서 새 proc을 작성하지 않게하려고합니다. 어떤 상황에서는 저장된 쿼리가 procs보다 낫다고 생각합니다.
DiscipleMichael

32

나중에 실행하기 위해 데이터베이스에 SQL 문을 저장하려면 테이블에 저장하는 것보다 더 나은 옵션이 있습니다.이 특정 목적을 위해 제공된 기본 제공 기능을 사용하십시오. 저장 프로 시저에 넣으십시오.


2
그렇다면 cron 작업은 실행할 저장 프로 시저 목록을 어디에 저장합니까?
JeffO

1
이것은 cron을 사용하지 않지만 유용한 stackoverflow.com/questions/6560639/…
MetaFight

내가 무슨 생각을했는지 모르겠다. proc 목록은 모두 단일 proc에서 실행될 수 있으므로 cron 작업은 하나만 수행하면됩니다.
JeffO

11

아니요, 좋은 생각이 아닙니다.

이는 모든 "실제"쿼리 / 업데이트가 데이터베이스에서 2 개의 적중이 필요함을 의미합니다. 하나는 "실제"쿼리 / 업데이트를 얻고 다른 하나는이를 실행합니다.

소규모 시스템에서는 큰 문제가되지 않지만 시스템에 대한 사용자 / 트랜잭션이 많을수록 시스템 규모는 줄어 듭니다.

이것이 코드에 SQL을 포함시키는 대안을 찾는 것에서 비롯된 것 같습니다.

Mason Wheeler가 제안한 것처럼 스토어드 프로 시저에서 SQL을 캡슐화하는 것이이 아이디어보다 훨씬 좋은 방법입니다.


+1, 이것이 @Mason Wheeler의 솔루션이 올바른 솔루션 인 주된 이유입니다. IMHO는 성능 문제가 아니지만 여기서 가장 중요하다고 생각합니다 .DB에서 SQL 문을 추출하여 문제를 복잡하게 할 필요가 없습니다.
Doc Brown

sql 문의 목록이 같은 데이터베이스 / 서버 등에 저장되어야하는 이유는 무엇입니까?
JeffO

1
OP는 데이터베이스에서 2 개의 조회를 제안하는 것입니다. 나는 그렇게하지 말아야한다고 말합니다. 그런 다음 왜 동일한 데이터베이스 / 서버 여야하는지 묻습니다. 누가 그랬는지 물어봐? 그런 다음 DB에서 2 개의 조회수를 얻는 방법을 묻습니다. 이것이 무엇을하고 있는지 대신에 실제 질문을하지 않는 이유는 무엇입니까?
ozz

1
@JeffO 비록 다른 데이터베이스 일지라도, 여전히 1 개의 쿼리가 무엇인지에 대한 2 개의 데이터베이스 쿼리입니다. 이는 불필요한 속도 저하
Izkata

1
@Ozz : 답변의 성능 측면에 너무 많은 가중치를 부여합니다. 대부분의 실제 시나리오에서는 성능이 무시 될 수 있습니다. 그러나 두 가지 조치 (첫 번째는 "실제"쿼리 / 업데이트를 얻기위한 하나,이를 수행하기위한 두 번째)의 필요성은 필요한 것보다 훨씬 복잡합니다.
Doc Brown

4

죄송합니다. 좋은 생각은 아닙니다.

해당 테이블이 변경되는 경우를 고려하십시오. id 열의 이름이 new_id 로 바뀌 었다고 가정하십시오 .

변경 사항뿐만 아니라 더 이상 실행되지 않을 오래된 빈티지 데이터베이스 용으로 작성된 코드 버전이 있습니다. 물론, 코드 테이블을 체크인하는 것을 알고 있지만 다른 사람에게는 즉시 명확하지 않습니다.

내가 설명한 것과 같은 변경을 위해 일반적으로 독립 실행 형 SQL 파일, 저장 프로 시저, 트리거, 클라이언트 코드 (VB, C #, C ++ 등)의 인라인 SQL을 보았지만 마지막으로 생각할 곳은 데이터베이스 테이블에 있습니다. 어쩌면 내가 지금 할 것입니다! :)


2

SQL을 테이블에 저장해야하는 유효한 이유가 있습니다. 직장에서 작업하는 소프트웨어에는 이제 문서를 생성하는 시스템이 포함되어 있으며 문서는 데이터베이스의 데이터를 사용하여 상당히 복잡한 계산을 포함해야합니다. 문서는 자주 업데이트되며 필요한 데이터 및 수행해야 할 계산 측면에서 크게 다릅니다. 기본적으로 SQL은 이러한 계산을 수행하기위한 스크립팅 언어로 사용되며 SQL은 이러한 문서에 대한 다른 정보도 저장하는 테이블에 저장됩니다. 이러한 문서를 관리하는 사람들은 프로그래머 나 DBA는 아니지만 데이터베이스 스키마에 익숙하고 SQL에 능숙합니다. 해당 SQL 코드를 스토어드 프로 시저 형태로 유지 보수하는 것은 상당한 오버 헤드입니다.

"... 정기적으로 SQL 문을 실행하는 크론 작업이 많이 필요한 프로젝트"에 대해 설명했듯이, 다른 대답은 아마도 DBMS에 대해 스토어드 프로 시저 또는 이와 동등한 것을 사용했음을 암시하는 것이 맞을 것입니다. 다시 사용하십시오.

테이블에 저장 프로 시저에 SQL을 저장할 수 있는지 여부를 결정하기위한 좋은 기준은 해당 SQL을 유지할 사람을 결정하는 것입니다. 사용자가 해당 SQL을 유지 관리하는 경우, 즉 SQL을 작성하고 원할 때마다 변경하는 경우 해당 SQL을 테이블에 저장하는 것이 좋습니다. 개발자가 해당 SQL을 유지 관리하는 경우에는 (자체적으로 자동화 된) 빌드 및 배포 절차 (예 : 데이터베이스 자체의 저장 프로 시저와 같은 개체로 저장)로 업데이트 할 수있는 형식으로 저장해야합니다.


1
응답 해주셔서 감사합니다. MySQL 이벤트를 사용하여 쿼리 실행을 예약했습니다. 많은 사람들이 "기본 접근 방식이 잘못되었습니다"라고 생각했습니다. :) 내가 필요한 모든 것은 특정 사용자 작업에서 15 분 후에 몇 개의 SQL 문을 실행하는 것이 었습니다.
Amged Rustom

2
@AmgadSuliman – 특히 SE 사이트의 모든 사람에게 자선을 제공하는 것이 중요합니다. 강한 의견을 갖는 것이 좋지만, 우리가 선호하는 패턴에 대해 지나치게 일치하기는 너무 쉽습니다. 그러나이 사이트에서 다른 사람들에게 자선을 제공하는 것의 일부는 충분한 맥락을 제공하는 것입니다. 너무 많은 것이 실제 질문을 모호하게 할 수 있지만 일반적으로 후속 편집으로 수정하기가 쉽습니다.
Kenny Evitt

1

쉬운 방법은 .ini 또는 다른 구성 플레이버 파일을 사용하여 쿼리를 유지하는 것입니다.이 방법으로 한 곳에서 쿼리를 수행 할 수 있으며 데이터베이스에 액세스 할 필요없이 아무것도 변경하지 않고 데이터베이스를 여러 번 누르지 않아도됩니다 또한 어느 시점에서 매개 변수를 사용하거나 쿼리에 조건을 추가하고 싶을 수도 있습니다 (코드의 특정 경우에 대해 더 복잡한 것들로 매개 변수를 보강하십시오).

물론 데이터베이스 수준 (테이블이나 더 나은 저장 프로 시저로)을 유지할 수는 있지만 ;-)처럼 게으르지 만 성능, .ini 파일 및 PHP 와 관련이 있습니다. 그것을 읽는 사랑하는 parse_ini 메소드는 갈 길입니다 (다른 프로그래밍 언어를 사용하는 경우 비슷한 접근법을 알아 내야합니다)! 일반적으로 응용 프로그램의 부트 로더 에서이 파일을 읽고 정적 객체 (캐시 레이어가 맨 위에있을 수 있음)에 보관하여 매우 많은 수의 별개의 쿼리에 대해 이야기 할 때 실제로 속도를 높입니다.


1

예를 들어, 근무 외 시간 동안 수행 할 여러 조작을 큐에 대기하는 경우 SQL 문이 한 번만 필요한 경우에는 테이블에 넣는 것이 좋습니다.

지정된 간격으로 동일한 SQL 문을 실행해야하는 경우 다른 사용자가 언급 한 스토어드 프로 시저 라우트가 더 나은 선택 일 수 있습니다.

즉, 당신이 요구하는 것은 매우 이례적이며 다른 문제가 있음을 나타낼 수 있습니다. 예를 들어, 데이터베이스에서 사용자 삭제를 기다리는 경우 실제 SQL 문을 기록하지 않고 애플리케이션 코드를 통해 조작을 수행하는 스케줄 된 스크립트를 호출하는 것이 좋습니다. 이런 식으로 SQL과 코드가 동기화되지 않습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.