복붙노트

[SQL] 언제 저장 프로 시저를 사용해야합니까?

SQL

언제 저장 프로 시저를 사용해야합니까?

언제 저장 프로 시저를 사용하는 대신 그냥 내 응용 프로그램에서 직접 로직을 작성해야 하는가? 내가 저장 프로 시저의 혜택을 얻을 싶습니다뿐만 아니라, 좋아 난 안 데이터베이스와 응용 프로그램을 통해 내 응용 프로그램 논리의 확산을 가질 것입니다.

이 참조에서 생각할 수있는 엄지 손가락의 규칙이 있습니까?

해결법

  1. ==============================

    1.와우 ... 내가 여기에 현재에 대해 직접 수영 "거의 항상"라고 말할거야. 일부 / I는 주장 확실히 다른 사람을 해요 많은 것이 - 이유 세탁물 목록이 있습니다. 하지만 함께하고 데이터 액세스 레이어로 저장 발동를 사용하지 않고 모두 애플 리케이션을 개발했습니다, 그리고 그것을 잘 쓰여진 저장 프로 시저가 너무 쉽게 응용 프로그램을 작성할 수 있도록 나의 경험이었다. 그런 다음 잘 문서화 성능 및 보안 이점이있다.

    와우 ... 내가 여기에 현재에 대해 직접 수영 "거의 항상"라고 말할거야. 일부 / I는 주장 확실히 다른 사람을 해요 많은 것이 - 이유 세탁물 목록이 있습니다. 하지만 함께하고 데이터 액세스 레이어로 저장 발동를 사용하지 않고 모두 애플 리케이션을 개발했습니다, 그리고 그것을 잘 쓰여진 저장 프로 시저가 너무 쉽게 응용 프로그램을 작성할 수 있도록 나의 경험이었다. 그런 다음 잘 문서화 성능 및 보안 이점이있다.

  2. ==============================

    2.이 사용자 환경에 전적으로 의존한다. 질문에 대한 대답은 정말 아닌 코딩 문제, 또는 분석 문제지만, 사업 결정이다.

    이 사용자 환경에 전적으로 의존한다. 질문에 대한 대답은 정말 아닌 코딩 문제, 또는 분석 문제지만, 사업 결정이다.

    데이터베이스가 지원하는 하나의 응용 프로그램 및 합리적으로 꽉 통합되어 있다면, 그것은 당신의 응용 프로그램 내부에 논리를 배치 할 수있는 유연성의 이유로, 좋습니다. 데이터베이스를 처리하는 이러한 상황에서 일반 데이터는 일반적인 기능을 사용하면 조금 이득 유연성을 푼다 리포지토리 단순히 - 많은 다른 공급 업체의 구현, 배포와 함께 - 그리고 군중 메이크업 '데이터베이스가 데이터를위한'하는 순수한 인수의 많은 demonstratively 있습니다 진실.

    당신은 일반적으로 다중 접속 경로를함으로써 식별 할 수있는 기업의 데이터베이스를 처리하는 경우 반면에, 당신이 수까지로 보안을 나사하는 것이 매우 좋습니다. 적어도 모든 적절한 제약 조건에서 활성화해야하고 데이터에 가능한 접근은보기와 절차를해야합니다. 징징 프로그래머는 이러한 경우에 무시해야 ...

    사용을 통해 종교 전쟁에 여부 일반적으로 단지 하나의 환경에서 근무하거나 주철 위치로 제한된 경험을 추정 할 수 있도록 다른 한 SPS에서의 다이빙 코더 - 참 맥락에서 완벽하게 방어하고 정확한 될 것이다에서 그들이 올하지만 큰 그림이 골대를 벗어났습니다. 언제나처럼, 당신은 비즈니스 / 고객 / 사용자의 요구에가 아니라 당신이 선호하는 방법을 코딩의 유형에 당신이 결정을해야한다.

  3. ==============================

    3.나는 의견이 말했다,하지만 난 여기서 다시 말할거야.

    나는 의견이 말했다,하지만 난 여기서 다시 말할거야.

    보안, 보안, 보안.

    SQL 코드는 응용 프로그램에 포함되면, 당신은 직접 액세스에 대한 기본 테이블을 노출해야합니다. 이것은 처음에는 괜찮 소리가 있습니다. 당신이 어떤 SQL 주입 공격 얻을 때까지 데이터베이스에 안간힘 모든 VARCHAR 필드가.

    어떤 사람들은 마법 따옴표 또는 제대로 임베디드 SQL을 탈출의 다른 방법을 사용하여이 주위에 얻을 말할 수 있습니다. 문제는,하지만 dev에 올바르게 탈출하지 않은 하나 개의 쿼리입니다. 또는 코드를 허용하지 깜빡 dev에 업로드 할 수 있습니다. 또는, 업로드 코드 공격자를 허용 균열 된 웹 서버. 또는, ... 당신은 점을 얻는다. 그것은 모든 기지를 커버하기 어렵다.

    내 말은, 모든 현대적인 데이터베이스 보안이 내장되어 있습니다. 당신은 단순히 당신의 s'procs를 통해 갈 직접 테이블 액세스 (선택, 삽입, 업데이트 및 삭제)과 힘 모두를 거부 할 수 있습니다. 그래서 일반적인 공격을 더 이상 작동하지 않습니다을 수행하여. 대신 공격자는 사용자 시스템의 친밀한 세부 사항을 배울 수있는 시간이 걸릴 것이다. 이것은 시간의 측면에서 그들의 "비용"증가로 및 웜 공격 드라이브를 중지합니다.

    나는 우리가 모든에 대해 자신을 보호 할 수 없습니다 알고 있지만 비용이 균열 있도록 건축가로 응용 프로그램을 시간이 걸릴 경우 훨씬 심각한로가는 다음 혜택은 데이터 손실의 가능성을 줄일 능가. 수단이 사용 가능한 모든 보안 도구를 활용 그.

    마지막으로, s'procs을 사용하지 않는 생각에 당신은 다른 RDBMS에 포트에있을 수 있기 때문에 : 첫째, 대부분의 애플리케이션은 데이터베이스 서버를 변경하지 마십시오. 둘째, 실제 가능성이 있다는 경우에, 당신은 어쨌든 ANSI의 SQL을 사용하여 코드에있다; 어느 당신은 당신의 발동에 할 수 있습니다. 셋째, 당신은 무슨 일이 있어도 당신의 SQL 모든 코드를 재평가하지해야하고 그 코드가 한 장소에있을 때 그것은 훨씬 더 쉽다. 넷째, 모든 현대적인 데이터베이스는 지금 s'procs을 지원합니다. 다섯째, s'proc를 사용하는 경우 것이이다 할 수 있습니다 사용자 정의 조정은 특정 데이터베이스의 SQL 확장을 활용할에서 실행중인 데이터베이스에 대한 SQL.

  4. ==============================

    4.내가 저장 프로 시저를 회피하는 경향이있다. 디버깅 도구는 더 원시적 인 경향이있다. 오류보고 열심히 (서버의 로그 파일 대) 할 수 있고, 나에게 적어도, 그냥 진짜 이익을 위해 다른 언어를 추가 할 것으로 보인다.

    내가 저장 프로 시저를 회피하는 경향이있다. 디버깅 도구는 더 원시적 인 경향이있다. 오류보고 열심히 (서버의 로그 파일 대) 할 수 있고, 나에게 적어도, 그냥 진짜 이익을 위해 다른 언어를 추가 할 것으로 보인다.

    서버 및 코드에서 할 수없는 데이터베이스 트리거에 대한 물론 많은 양의 데이터를 처리, 특히 때 유용 할 수 있습니다 경우가 있습니다.

    그 생각보다는 다른, 나는이 코드에서 모든 것을 할과에 빅 데이터의 덤프보다는 뭔가 내가 실행 코드로 데이터베이스를 취급하는 경향이있다.

    어쨌든, 저장 프로 시저를 필요로 누가 생각해?

    왜 내가 저장 프로 시저를 사용하지 마십시오 :

  5. ==============================

    5.기본적으로 당신은 데이터베이스의 나갈 필요가없는 데이터를 포함하는 작업을 수행해야 할 때. 예를 들어, 서로 데이터를 하나 개의 테이블을 업데이트 할, 그것은 다시는 DB에 하나의 샷에 모든 것을 할 수있는 경우에 다음 데이터를 취득하고 약간의 의미가 있습니다.

    기본적으로 당신은 데이터베이스의 나갈 필요가없는 데이터를 포함하는 작업을 수행해야 할 때. 예를 들어, 서로 데이터를 하나 개의 테이블을 업데이트 할, 그것은 다시는 DB에 하나의 샷에 모든 것을 할 수있는 경우에 다음 데이터를 취득하고 약간의 의미가 있습니다.

    이 저장 프로 시저를 사용하는 것이 허용 될 수있는 또 다른 상황이 100 % 일 때 당신이 다른 데이터베이스 공급 업체에 응용 프로그램을 배포하지 않습니다이다. 당신이 오라클 가게하고 당신이 할 수있는 동일한 데이터베이스에 얘기하고 응용 프로그램을 많이 가지고있는 경우 의미 있는지 그들 모두가 일관된 방식으로 DB를 이야기로 만드는 절차를 저장 한합니다.

  6. ==============================

    6.나를 위해 복잡 데이터베이스 쿼리는 저장 발동을 종료하는 경향이있다. 고려해야 할 또 다른 생각은 데이터베이스 응용 프로그램에서 완전히 분리 된 별개 될 수 있다는 것입니다. 당신이 오라클 DB를 실행하고 본질적으로 호출에 조직에서 다른 응용 프로그램 개발자를위한 API를 구축하고 말할 수 있습니다. 당신은 그들에서 복잡하게 물건을 숨기고 그 자리에서 저장된 프로 시저를 제공 할 수 있습니다.

    나를 위해 복잡 데이터베이스 쿼리는 저장 발동을 종료하는 경향이있다. 고려해야 할 또 다른 생각은 데이터베이스 응용 프로그램에서 완전히 분리 된 별개 될 수 있다는 것입니다. 당신이 오라클 DB를 실행하고 본질적으로 호출에 조직에서 다른 응용 프로그램 개발자를위한 API를 구축하고 말할 수 있습니다. 당신은 그들에서 복잡하게 물건을 숨기고 그 자리에서 저장된 프로 시저를 제공 할 수 있습니다.

    아주 간단한 예 :

    registerUser(username, password)
    

    몇 가지 다른 쿼리를 실행 끝낼 수 있습니다 (있는 경우 등, 선호 테이블에 항목을 작성 확인) 및 당신이 그들을 캡슐화 할 수 있습니다.

    물론, 다른 사람들은 다른 관점 (프로그래머 대 DBA)를해야합니다.

  7. ==============================

    7.나는 3 개 시나리오 1에 발동을 저장 사용 :

    나는 3 개 시나리오 1에 발동을 저장 사용 :

    속도 속도가 가장 중요 할 때, 저장 프로 시저는 훌륭한 방법을 제공

    복잡성 나는 여러 테이블을 갱신하고있어 코드 로직이 길을 변경 될 수 있습니다 때, 나는 저장된 프로 시저를 업데이트하고 재 컴파일을 피할 수 있습니다. 저장 프로시 저는 하나의 스트로크에 많은 양의 데이터를 업데이트하는 우수한 블랙 박스 방법입니다.

    업무 내가 삽입을하고 있어요 때, 삭제 또는 스팬에게 여러 테이블을 업데이트합니다. 나는 거래에서 전체를 감싸는. 오류가있을 경우, 트랜잭션을 롤백하고 회피 데이터 손상에 오류가 발생하는 것은 매우 쉽습니다.

    바닥이 매우 할-수 코드에 있습니다. 그러나, 저장 프로 시저 복잡한 트랜잭션 수준의 작업이 중요 할 때 작업의 블랙 박스 방법을 제공한다. 그렇지 않으면, 코드 레벨의 데이터베이스 작업을 고수.

    보안 이유 중 하나가 될하는 데 사용됩니다. 그러나 LINQ 거기에 다른 ORM들을 밖으로, 코드 레벨 DAL 작업은 훨씬 더 안전한 그들이 과거에 있었던 것보다 있습니다. 저장 발동는 안전하지만 너무 LINQ 등으로 ORMs입니다.

  8. ==============================

    8.또한 캡슐의 문제로 및 DRY의 철학에 매우 유용 할 수 있습니다. 예를 들어 내가 코드 내부에 여러 쿼리 필요가 테이블 내부 계산 기능을 저장 사용합니다. 이 방법은 내가 더 나은 성능뿐만 아니라 계산이 항상 동일한 방식으로 이루어집니다 보장을 사용합니다.

    또한 캡슐의 문제로 및 DRY의 철학에 매우 유용 할 수 있습니다. 예를 들어 내가 코드 내부에 여러 쿼리 필요가 테이블 내부 계산 기능을 저장 사용합니다. 이 방법은 내가 더 나은 성능뿐만 아니라 계산이 항상 동일한 방식으로 이루어집니다 보장을 사용합니다.

    나는 더 높은 기능 또는 아키텍처의 비즈니스 로직 계층에 있어야 로직을 사용하지만 기능이 명확하게 데이터베이스 디자인과를 파괴하지 않고 데이터베이스 설계를 변경 가능한 유연성에 초점을 맞추고 모델 층에 집중하지 않을 다른 층에 API.

  9. ==============================

    9.우리는 우리의보고 요구의 모든 저장 프로 시저를 사용합니다. 그들은 일반적으로 빠르게 데이터를 검색 할 수있는 방법으로 보고서는 계산 또는 이와 유사한 모든 종류의 작업을 수행 할 필요없이 대신 직접 뱉어 수있다.

    우리는 우리의보고 요구의 모든 저장 프로 시저를 사용합니다. 그들은 일반적으로 빠르게 데이터를 검색 할 수있는 방법으로 보고서는 계산 또는 이와 유사한 모든 종류의 작업을 수행 할 필요없이 대신 직접 뱉어 수있다.

    우리는 또한 복잡하거나 복잡한 쿼리에 대한 저장 프로 시저를 사용합니다 우리는 그들이 그렇지 않으면 내부에 우리의 코드베이스의라면이 읽기 어려울 것 할 필요가있다.

  10. ==============================

    10.나는 항상 저장 프로 시저를 사용하는 경향이있다. 개인적으로, 나는 그것을 유지하기 위해 모든 것을 쉽게 찾을 수 있습니다. 그런 다음 보안 및 성능 고려 사항이있다.

    나는 항상 저장 프로 시저를 사용하는 경향이있다. 개인적으로, 나는 그것을 유지하기 위해 모든 것을 쉽게 찾을 수 있습니다. 그런 다음 보안 및 성능 고려 사항이있다.

    그냥 잘 배치 잘 저장 프로 시저를 기록, 당신이 깨끗한 쓰기합니다.

  11. ==============================

    11.모든 코드가 저장된 프로 시저에있을 때, 필요할 때 데이터베이스를 리팩토링 훨씬 쉽습니다. 로직에 대한 변경 사항은 멀리 밀어 쉽게뿐만 아니라입니다. 또한 지금까지 쉽게 성능 튜닝 및 빨리 또는 나중에 성능 튜닝은 대부분의 데이터베이스 응용 프로그램에 필요한된다.

    모든 코드가 저장된 프로 시저에있을 때, 필요할 때 데이터베이스를 리팩토링 훨씬 쉽습니다. 로직에 대한 변경 사항은 멀리 밀어 쉽게뿐만 아니라입니다. 또한 지금까지 쉽게 성능 튜닝 및 빨리 또는 나중에 성능 튜닝은 대부분의 데이터베이스 응용 프로그램에 필요한된다.

  12. ==============================

    12.나는 당신이 저장 프로 시저를 피해야한다고 주장 것입니다.

    나는 당신이 저장 프로 시저를 피해야한다고 주장 것입니다.

    왜 우리는 그것을 피할 수 있는가?

    나는 많이 저장 프로 시저에 의존 한 회사의 알고있다. microservices의 수는 증가하고 원본 데이터베이스 중심의 개발자가 왼쪽으로, 회사는 아무도가 모든 것을 내려 걸릴 것이라고 두려워 만져 허용되지 않았 음을 블랙 박스 왼쪽되면서. 이제 그들은 클라우드로 다른 데이터베이스와 이동로 이동하려는, 그것이 있어야하고 어쨌든 자신의 응용 프로그램에 저장 프로 시저 논리를 이동하는 것보다 훨씬 더 어렵다.

  13. ==============================

    13.속도와 보안 고려 사항의 위에, 나는 유지 보수 및 변경의 용이성을 위해 가능한 한 저장 프로 시저에서 많이 스틱 경향이있다. 나중에 SQL 논리가 다르게 어떤 방식으로 작업에 오류 또는 요구 사항을 가지고 응용 프로그램의 로직을 넣어 찾아내는 경우에, 당신은 컴파일과 같은 WPF와 같은 클라이언트 측 응용 프로그램의 경우 특히 (많은 경우에 전체 응용 프로그램을 다시 배포해야 , 윈 - 양식 등). 저장 프로 시저의 논리를 유지하는 경우, 당신이해야 할 PROC를 업데이트하고 사용자는 애플리케이션을 터치 할 필요가 없습니다.

    속도와 보안 고려 사항의 위에, 나는 유지 보수 및 변경의 용이성을 위해 가능한 한 저장 프로 시저에서 많이 스틱 경향이있다. 나중에 SQL 논리가 다르게 어떤 방식으로 작업에 오류 또는 요구 사항을 가지고 응용 프로그램의 로직을 넣어 찾아내는 경우에, 당신은 컴파일과 같은 WPF와 같은 클라이언트 측 응용 프로그램의 경우 특히 (많은 경우에 전체 응용 프로그램을 다시 배포해야 , 윈 - 양식 등). 저장 프로 시저의 논리를 유지하는 경우, 당신이해야 할 PROC를 업데이트하고 사용자는 애플리케이션을 터치 할 필요가 없습니다.

  14. ==============================

    14.저장 프로 시저는 여전히 데이터베이스 측을 유지하면서, 데이터베이스 측에서 함께 수행해야 작업을 수집하는 방법입니다.

    저장 프로 시저는 여전히 데이터베이스 측을 유지하면서, 데이터베이스 측에서 함께 수행해야 작업을 수집하는 방법입니다.

    여기에는 다음이 포함됩니다 :

    기타

    저장 프로 시저의 주된 문제는 그들이 유지하기 어려운 점이다.

    당신은, 그러므로, 다른 모든 코드로 유지하기 위해 쉽게와 같은 저장 프로 시저를해야한다.

    내 블로그에서이에 대한 기사를 가지고 :

  15. ==============================

    15.나는이 몇 가지 아주 나쁜 경험을 했어.

    나는이 몇 가지 아주 나쁜 경험을 했어.

    나는 그들의 장소에서 저장 프로 시저에 반대 아니지만, 저장 프로 시저의 무상 사용은 매우 비쌀 수 있습니다.

    첫째, 저장 프로 시저는 데이터베이스 서버에서 실행됩니다. 그 대신 50 싼 기계를 통해 워크로드를 확산 50 개 웹 서버 및 데이터베이스 서버와 다중 서버 환경이있는 경우, 당신은 하나의 비싼를로드하는 것이 수단 (데이터베이스 서버는 일반적으로 헤비급 서버로 내장되어 있기 때문에). 그리고 당신은 단일 장애 지점을 만들어 걸고 있습니다.

    내가하려고하는 초인적 인 노력을 하나에 달려 있지만 둘째, 저장 프로 시저에 전적으로 응용 프로그램을 작성하는 것은 매우 쉬운 일이 아닙니다. 당신은 유지 관리 비용이 무언가와 끝까지 그래서 : 그것은 2 개 개의 다른 프로그래밍 언어로 구현, 그리고 저장 프로 시저가 결정적 DBMS에 아닌 소스 아카이브에 저장되기 때문에 소스 코드, 중 모든 한 곳에서 종종 있습니다. 누군가가 이제까지 데이터베이스 서버와의 풀 그들을 O를 방해 / 관리한다고 가정 모두에서 그들을 소스 아카이브.

    그래서 옆 상당히 지저분 응용 프로그램 아키텍처에서, 당신은 또한 여러 기술이 필요하므로, 그것을 유지할 수있는 자격을 갖춘 침팬지의 집합을 제한 할 수 있습니다.

    반면에, 저장 프로 시저, 매우 유용한 경우입니다 :

  16. ==============================

    16.당신이 이익을 가능성이 특정 시나리오는 "(N + 1)"확장 성 문제를 해결 상황을 포함한다. 다차원 / 계층 적 상황의 모든 종류는이 시나리오를 포함 할 가능성이있다.

    당신이 이익을 가능성이 특정 시나리오는 "(N + 1)"확장 성 문제를 해결 상황을 포함한다. 다차원 / 계층 적 상황의 모든 종류는이 시나리오를 포함 할 가능성이있다.

    또 다른 시나리오는 테이블을 처리 할 때 어떤 프로토콜을 수행 사용 사례를 포함 할 것이다 (힌트 : 거래 가능성이 참여하고있는 정의 단계),이 기준의 지역에서 이익을 얻을 수 : 서버에있는 쿼리는 혜택을 누릴 수 있습니다. OTOH, 직접 서버에 문의 배치를 제공 할 수 있습니다. 특히 당신은 XA 환경에있어 당신은 페더 레이 티드 데이터베이스에 액세스해야 할 때.

  17. ==============================

    17.당신이 아니라 그냥 "일반적으로해야 내가 사용 sprocs가"보다 비즈니스 로직을 이야기하는 경우 나는 당신이 전화의 많은 수를 필요로 로직을 실행하는 대형 세트 기반 작업 또는 다른 어떤 시간을 수행 할 때 당신이 sprocs가 비즈니스 로직을 넣어해야 말할 것 응용 프로그램에서 DB에.

    당신이 아니라 그냥 "일반적으로해야 내가 사용 sprocs가"보다 비즈니스 로직을 이야기하는 경우 나는 당신이 전화의 많은 수를 필요로 로직을 실행하는 대형 세트 기반 작업 또는 다른 어떤 시간을 수행 할 때 당신이 sprocs가 비즈니스 로직을 넣어해야 말할 것 응용 프로그램에서 DB에.

  18. ==============================

    18.그것은 또한 당신의 청중에 따라 달라집니다. DBMS를 통해 설치 및 휴대의 용이성이 중요합니까?

    그것은 또한 당신의 청중에 따라 달라집니다. DBMS를 통해 설치 및 휴대의 용이성이 중요합니까?

    프로그램이 있어야 할 경우 쉽게 설치하고 쉽게 다른 데이터베이스 시스템에서 실행에 당신은 저장 프로 시저를 멀리해야하며, 또한 코드에서 비 휴대용 SQL 위해 밖을 봐.

  19. ==============================

    19.나는 그들이 자주 잘 사용하는 것을 동의합니다.

    나는 그들이 자주 잘 사용하는 것을 동의합니다.

    당신이 외국으로 연결되는 데이터의 일부가 이미 존재하는 레코드와 필요가있을 수 있습니다 여러 테이블로 밖으로 구분해야 원시 정보를 많이 복용하는 경우 내 생각을 사용하는 경우는 매우 강력한이며, 매우 유용합니다 장기적으로 모든 것을 더 균일 간결하고 유지 보수하게하는 그것이 않는 경우가 아니거나 리턴 키 않을 경우 키 ID는, 당신은 단지 IF는 검사 및 삽입 존재 할 수 있습니다.

    당신이 코드에서 모든 로직을 유지하는 것은 어디 당신이 회사에 근무하는 경우 가장 좋은 응용 프로그램 서버에서 수행되거나 논리 또는 쿼리 사이에 재정 수를 많이하고 있다면 내가 그들을 사용에 대한 제안 유일한 경우입니다 유지 보수를위한 중요한 / 무슨 일이 일어나고 이해. 당신이 필요로하는 모든 것들을 누군가의 자식 저장소 전체를 쉽게 이해할 수있는 경우에, 그것은 매우 가치가 될 수 있습니다.

  20. from https://stackoverflow.com/questions/1171769/when-should-i-use-stored-procedures by cc-by-sa and MIT license