일부 관찰
저장 프로시 저는 코드 재사용 및 캡슐화 (소프트웨어 개발의 두 가지 기둥)를 제공합니다.
사용되어야하는 상황에서 올바르게 사용하는 경우에만 해당됩니다. 함수 (구조적 프로그래밍) 또는 메소드 (객체 지향 프로그래밍)에 대해서도 같은 주장을 할 수 있지만, 1K 함수와 거대한 개체를 볼 수 있습니다.
유물은 그러한 이점을 제공하지 않습니다. 이러한 아티팩트의 올바른 사용법은 이러한 이점을 제공하는 것입니다.
보안 (개별 저장 프로 시저에 대한 권한을 부여하거나 취소 할 수 있음)
예. 이것이 좋은 점이며 저장 프로 시저를 좋아하는 주요 이유 중 하나입니다. 뷰와 사용자 계정만으로 얻을 수있는 것보다 세밀한 액세스 제어를 제공합니다.
SQL 인젝션 공격으로부터 보호
매개 변수화 된 SQL 문 및 입력 스크러빙으로 동일한 수준의 보호를 얻을 수 있으므로 SP에만 국한되지 않습니다. 그러나 "심층 보안" 문제로 SP 외에 SP도 사용하려고합니다 .
또한 속도를 높이는 데 도움이됩니다 (DBA는 SQL Server 2008부터 충분한 시간이 실행되면 일반 SQL 쿼리도 컴파일된다고 말했지만).
이는 데이터베이스 공급 업체에 따라 다르지만 일반적으로 DBA가 적합합니다. SQL 문 (정적 또는 매개 변수화 된)은 컴파일됩니다. SP는 간단한 SQL 문으로는 수행 할 수 없지만 SQL과 밀접하게 통합되어 있으며 응용 프로그램 서버로의 왕복을 보증하지 않는 데이터를 집계 및 계산하려는 경우 도움이됩니다.
좋은 예는 다른 SQL 자체를 실행할 임시 커서 (또는 커서)에 데이터를 쿼리하는 것입니다. 앱 서버에서 프로그래밍 방식으로 수행하거나 db에서 여러 왕복을 수행하여 저장할 수 있습니다.
그러나 이것이 표준이되어서는 안됩니다. 이러한 경우가 많으면 데이터베이스 디자인이 잘못되었다는 신호일 수 있습니다 (또는 부서간에 호환되지 않는 데이터베이스 스키마에서 데이터를 가져 오는 중입니다).
Agile 소프트웨어 개발 방법론을 사용하여 복잡한 앱을 개발 중입니다.
민첩성은 기술이 아닌 소프트웨어 엔지니어링 프로세스 및 요구 사항 관리와 관련이 있습니다.
누구나 저장된 procs를 사용하지 않는 좋은 이유를 생각할 수 있습니까?
잘못된 질문
이 질문은 잘못되었으며 "GOTO를 사용하지 않는 좋은 이유가 있습니까?" 나는이 주제에 대해 Dijkstra보다 Niklaus Wirth와 더 많은 편입니다. Dijkstra의 정서가 어디에서 왔는지 이해할 수 있지만 모든 경우에 100 % 적용 할 수는 없습니다. 상점 procs 및 모든 기술과 동일합니다.
도구는 의도 된 목적으로 잘 사용되거나 특정 작업에 가장 적합한 도구 일 때 좋습니다. 그렇지 않으면 공구가 잘못되었다는 것을 나타내지는 않지만, 장로가 자신이하고있는 일을 알지 못합니다.
적절한 질문은 "어떤 유형의 저장 프로 시저 사용 패턴을 피해야 하는가"입니다. 또는 "어떤 조건에서 저장 프로 시저를 사용해야합니까 (또는 사용하지 않아야합니까)" . 기술을 사용 하지 않는 이유를 찾는 것은 엔지니어가 엔지니어가 속한 곳에 엔지니어링 책임을 제곱하는 대신 툴에 책임을주는 것입니다.
다른 말로, 그것은 cop-out 또는 무지의 진술입니다.
내 생각에 DBA는 저장된 procs를 유지하고 싶지 않았지만 그러한 디자인 결정을 정당화하기에는 너무 많은 부정적인 생각이있는 것 같습니다.
그들이하고있는 일은 그들이 잘못 사용했던 도구에 대한 잘못된 엔지니어링 결정의 결과를 투사하는 것입니다.
귀하의 경우 어떻게해야합니까?
로마에있을 때 나의 경험은 로마인들처럼 합니다.
싸우지 마십시오. 회사 직원이 상점 proc에 나쁜 습관을 표시하려는 경우 직원에게 알려주십시오. 그러나 이것은 엔지니어링 관행에서 위험 신호가 될 수 있습니다.
나쁜 습관으로 사물을 표시하는 것은 일반적으로 무능한 프로그래머가 많은 조직에서 이루어집니다. 조직은 특정 사안을 블랙리스트로 작성함으로써 자체 무능으로 인해 내부적으로 발생하는 피해를 제한하려고합니다. 나는 당신을 똥하지 않습니다.
일반화는 모든 실수의 어머니입니다. 저장된 proc (또는 모든 유형의 기술)가 나쁜 습관이라고 말하는 것은 일반화입니다. 일반화는 무능한 사람들을위한 경찰이다. 엔지니어는 명백한 일반화 작업을 수행하지 않습니다. 그들은 사례별로 분석을 수행하고, 분석 트레이드 오프를 수행하고, 문제를 해결해야하는 상황에서 당면한 사실에 따라 엔지니어링 결정 및 솔루션을 실행합니다.
훌륭한 엔지니어는 이러한 일반적인 방식으로 사물을 나쁜 습관으로 분류하지 않습니다. 그들은 문제를보고 적절한 도구를 선택하고 절충합니다. 다시 말해, 그들은 공학을합니다.
사용하지 않는 방법에 대한 나의 의견
데이터 수집 (및 일부 변환) 이상의 복잡한 논리를 넣지 마십시오. 일부 데이터 마사지 로직을 넣거나 여러 쿼리 결과를 집계하는 것이 좋습니다. 그러나 그것은 그것에 관한 것입니다. 그 이외의 모든 것은 다른 곳에 상주해야하는 비즈니스 로직으로 인정 될 것입니다.
SQL 삽입에 대한 유일한 방어 메커니즘으로 사용하지 마십시오. 당신은 나쁜 무언가가 그들에게 그것을 만드는 경우에 그들을 떠나지 만, 클라이언트 쪽 유효성 검사 / 스크러빙, 서버 쪽 유효성 검사 / 제거, 아마도 당신의 말이 맞는 유형으로 변환 도메인 모델을 만들고 마지막으로 매개 변수화 된 명령문으로 전달됨 (매개 변수화 된 SQL 문 또는 매개 변수화 된 스토어드 프로 시저 일 수 있음)
상점 procs가 포함 된 유일한 데이터베이스를 데이터베이스로 만들지 마십시오. 상점 프로세스는 C # 또는 Java 소스 코드를 처리하는 것처럼 처리해야합니다. 즉, 상점 procs의 텍스트 정의를 소스 제어하십시오. 사람들은 상점 procs가 소스 제어가 될 수 없다고 주장합니다. Bullcrap은 단지 그들이 말하는 피의 지옥을 알지 못합니다.
사용 방법 / 장소에 대한 나의 의견
응용 프로그램에는 여러 쿼리 또는 뷰에서 전치하거나 집계해야하는 데이터가 필요합니다. 애플리케이션에서 db로이를 오프로드 할 수 있습니다. a) 데이터베이스 엔진이 앱 서버가 이러한 작업을 수행하는 것보다 효율적이기 때문에 성능 분석을 수행해야 하지만 b) 앱 서버는 수평 확장이 더 쉽습니다 (때로는).
미세한 접근 제어. 당신은 당신의 db에서 직교 조인을 실행하는 바보를 원하지 않지만, 사람들이 그와 같은 임의의 SQL 문을 실행하는 것을 막을 수는 없습니다. 일반적인 솔루션은 개발 및 UAT 환경에서 임의의 SQL 문을 허용하고 systest 및 프로덕션 환경에서는이를 금지하는 것입니다. systest 또는 프로덕션으로 작성해야하는 모든 진술은 개발자와 dbas가 코드를 검토 한 저장 절차에 들어갑니다.
상점 프로세스에 없는 SQL 문을 실행해야하는 모든 유효한 요구 사항 은 다른 사용자 이름 / 계정 및 연결 풀을 통해 진행됩니다 (사용을 높이고 권장하지 않음).
- 오라클과 같은 시스템에서는 LDAP에 액세스 할 수 있습니다, 또는 외부 데이터베이스에 대한 심볼릭 링크를 생성 (VPN을 통해 비즈니스 파트너의 DB에 저장 시저를 호출이라고한다.) 스파게티 코드를 할 수있는 쉬운 방법을하지만 모든 프로그래밍 패러다임에 대한 사실, 때로는 이것이 유일한 솔루션 인 특정 비즈니스 / 환경 요구 사항이 있습니다. Store procs는 데이터에 가깝고 앱 서버를 탐색 할 필요없이 한 장소에서만 그 nastiness를 캡슐화하는 데 도움이됩니다.
스토어 프 로시 또는 앱 서버에서 DB를 실행하는지 여부는 엔지니어가 수행해야하는 트레이드 오프 분석에 따라 다릅니다. 두 가지 옵션 모두 일부 유형의 분석을 통해 분석되고 정당화되어야합니다. 다른 대안을 단순히 "나쁜 연습"이라고 비난함으로써 다른 방식으로 진행하는 것은 단지 절충적인 엔지니어링 쟁점입니다.
- 단순히 앱 서버를 확장 할 수 없지만 (즉, 새 하드웨어 또는 클라우드 인스턴스에 대한 예산이없는 경우) DB 백엔드에 충분한 용량이있는 경우 (많은 사람들이 인정해야하는 것이 더 일반적 임) procs를 저장하기 위해 비즈니스 로직을 이동합니다. 예쁘지 않고 빈혈증 도메인 모델로 이어질 수 있지만 ... 다시 트레이드 오프 분석은 대부분의 소프트웨어 해킹이 겪는 일입니다.
그것이 영구적 인 해결책이 되든 아니든, 그것은 특정한 순간에 관찰 된 구속에 특정한 것입니다.
도움이 되길 바랍니다.