programing

SQL Server에는 패키지가 없기 때문에 프로그래머는 이를 피하기 위해 무엇을 합니까?

iphone6s 2023. 6. 16. 21:33
반응형

SQL Server에는 패키지가 없기 때문에 프로그래머는 이를 피하기 위해 무엇을 합니까?

저장 프로시저가 매우 많이 증가하는 SQL Server 데이터베이스를 가지고 있습니다.Oracle "패키지" 기능 때문에 많은 수의 저장 프로시저는 Oracle 데이터베이스에서 문제가 되지 않습니다.

프로그래머들은 오라클과 같은 "패키지" 기능이 없는 것을 피하기 위해 무엇을 합니까?

SQL Server는 익숙한 캡슐화 및 패키지 상태의 "멋진 기능"을 통해 제공할 수 있는 기능이 없지만 저장 프로시저를 스키마로 구성할 수 있습니다.

엔터프라이즈 관리자에서 이러한 프로시저는 여전히 함께 나열되어 있으므로 수백 개의 프로시저가 있는 경우 거대한 트리 목록이 됩니다.저도 오라클 패키지의 구성과 멋진 기능이 그립습니다.하지만, 모든 플랫폼에는 장점이 있습니다.

참고: 저장 프로시저를 .NET 언어로 작성하면 캡슐화 및 상태가 제공됩니다.그러나 전자파 트리 보기에서는 특별한 방법으로 분리하지 않습니다.

좋은 명명 규칙을 만들어 사용하고 적용합니다.

스키마는 저장 프로시저 및 기타 개체를 구성하는 데 사용될 수 있습니다.개인적으로 저는 기능 영역별로 개체를 구성하고 해당 기능 영역이 보안 경계에 해당하는 경우 스키마를 사용하는 것을 선호합니다.이에 대한 예는 "인력" 및 "판매"와 같은 스키마가 있는 AdventureWorks 샘플 데이터베이스에서 찾을 수 있습니다.특정 사용자가 "인력"의 개체에 액세스해야 하지만 "판매" 정보에 액세스할 필요는 없을 수 있다는 이론입니다.

또 다른 방법은 위에서 James가 말한 것처럼 명명 규칙을 사용하고 이를 적용하는 것입니다.SQL Server Management Studio에는 표시되는 개체 목록을 필터링하는 데 사용할 수 있는 필터 버튼이 있습니다.예를 들어, "저장된 프로시저" 폴더를 클릭할 수 있으며 이름의 필터에는 "추가"가 포함됩니다.

현재 프로젝트에서 SSIS 패키지와 저장 프로시저에서 수많은 SQL 쿼리를 추출했습니다.이러한 저장 프로시저와 일반적으로 사용해야 하는 프로시저를 구분하기 위해 이름 앞에 "ssis"를 붙였습니다.C#이나 C++에서 네임스페이스와 비슷한 것을 만들고 "SSIS"를 만들 수 있었다면 분명히 더 즐거웠을 것입니다."ssis_" 대신 "UserLookupData"를 선택합니다.사용자 조회 데이터"를 선택합니다.이러한 네임스페이스를 중첩할 수 있다면 더욱 좋을 것입니다.

만약 이것이 Oracle 패키지의 기능 중 하나라면, 누군가가 저에게 알려줄 것입니다.

저는 SQL Server와 Oracle 모두와 함께 작업했기 때문에 두 가지 장점과 단점을 모두 보았습니다.위의 의견들이 좀 격앙되었기 때문에 가능한 한 중립적으로 유지하도록 하겠습니다.

Oracle 패키지란 무엇입니까?데이터베이스 클래스처럼 생각합니다.

패키지에는 헤더 파일과 본문 파일의 두 가지 요소가 있습니다.헤더 파일은 공용 인터페이스이며 직접 호출할 수 있는 모든 저장 프로시저 또는 함수의 서명(이름, 매개 변수 및 반환 유형(해당되는 경우)을 포함합니다(오라클에서 함수는 값을 반환하지만 저장 프로시저는 반환하지 않습니다).패키지 본문은 패키지 헤더 파일의 모든 프로시저 서명을 구현해야 합니다.

패키지의 본문 요소에는 실제로 작업을 수행하는 저장된 모든 프로시저 및 논리가 포함됩니다.패키지 헤더에 선언된 저장 프로시저가 본문에 존재하는 삽입 또는 업데이트 프로시저를 호출할 수 있습니다.개발자는 "저장" 프로세스만 볼 수 있습니다.패키지 본문은 패키지 헤더에 선언되지 않은 프로시저나 함수를 구현할 수도 있지만 패키지 자체 외부에서는 액세스할 수 없습니다.

패키지가 여러 가지 이유로 매우 유용하다는 것을 알게 되었습니다.

  1. 당신은 다른 개발자들에게 제공될 수 있는 공개 인터페이스의 개념을 가지고 있습니다.
  2. 패키지는 컴파일된 클래스를 미러링할 수 있습니다.나의 명령.Save() C# 메서드가 Oracle Orders를 호출합니다.SaveLineItem 메서드를 사용하여 각 라인 항목을 저장하고 Oracle SaveOrder 메서드를 사용하여 주문 요약 세부 정보를 저장합니다.
  3. 패키지 내부에서 논리적인 방식으로 여러 프로시저가 함께 그룹화되어 있습니다.

개인적으로, 저는 MS가 더 깨끗한 데이터베이스를 만들기 때문에 일종의 패키지 기능을 구현하는 것을 사랑합니다.

언급되지 않은 패키지의 한 가지 추가 기능은 본체를 '포장'하는 기능입니다.헤더는 항상 공용이며 패키지 실행 권한이 있는 모든 사용자가 볼 수 있습니다.하지만 그것은 또한 그들이 신체의 코드를 볼 수 있게 해줍니다.본문을 래핑하여 암호화하고 다른 사용자가 코드가 실제로 수행하는 작업을 볼 수 없도록 할 수 있습니다.보안이 큰 문제가 되는 좋은 기능입니다.

오라클 패키지에 반대하는 가장 좋은 주장은 애스크톰 사이트에 대한 경험과 연구를 바탕으로 패키지를 오프라인으로 전환하지 않고 업데이트할 수 없다는 것입니다.이것은 용납할 수 없습니다.SQL 서버를 사용하면 프로덕션 작업을 중단하지 않고 저장 프로시저를 즉시 업데이트할 수 있습니다.

나는 이 진술의 좌절을 이해하지만, 나는 id를 "받아들일 수 없다"고 부르지 않을 것입니다.실제 운영 환경에서는 변경 사항을 운영 환경에서 테스트해서는 안 됩니다.업데이트는 예약된 순서대로 테스트 환경에서 운영 환경으로 이동해야 합니다.연중무휴 시스템에서는 서버가 업데이트되는 동안 중복 운영 환경에서 다운타임을 처리해야 합니다.패키지를 오프라인 상태로 만들어야 할 뿐만 아니라, 컴파일하지 않으면 다시 온라인 상태로 전환할 때 새 패키지가 실패합니다.오라클 데이터베이스에는 DBA 요소가 필요합니다.하지만, 저는 Oracle 패키지가 그립습니다.

사람이 얼마나 감정적으로 그런 지루한 주제를 극복할 수 있는지 보는 것은 다소 웃깁니다.Oracle에 SQL Server 기능이 있다는 사실은 이 기능의 논란의 여지가 있는 특성에 대해 모든 종류의 반응을 일으키지 않는 것 같습니다.

우선 Oracle에는 SQL Server에서 누락된 이 기능이 있으며 권장되는 접근 방식은 무엇입니까?라는 질문이 있었습니다.

그것에 대해 감정적일 필요는 없습니다.

Oracle의 패키징 기능이 마음에 들지 않는 사용자는 SQL Server와 동일한 방식으로 Oracle을 실행할 수 있습니다.

자세한 내용을 살펴보면, 스타일에 후속 질문이 있을 수 있습니다. 패키지 내에서 기능 또는 절차를 수정할 때 전체 패키지가 무효화되고 이 "엉덩이", 빨기 측면을 방지하기 위한 권장 방법은 무엇입니까?

개인적으로, 저는 정적으로 연결된 라이브러리를 다시 연결하지 않고 실행 파일에서 수정할 수 없다고 불평하는 사람을 본 적이 없습니다.

  1. 사람들이 말했듯이 Schema는 데이터베이스 테이블과 프로시저를 구성하는 보다 논리적이고 ANSI를 준수하는 방법입니다.

  2. 소프트웨어 엔지니어링 모범 사례는 서버에서 직접 변경해서는 안 된다는 것입니다.모든 데이터베이스 스크립트가 스크립트로 작성되고 구성 제어 하에 있으므로, 이러한 스크립트를 원하는 폴더 구조로 정렬할 수 있습니다.

(AskTom에서 가져온 오래된 정보가 제거되었습니다.)

SQL Server에 패키지가 없는 행운의 주인공에게 감사드립니다.오라클 패키지는 형편없습니다.

흠, 우리는 이 모든 절차를 취해서 한 곳에 둘 수 있는 방법이 필요합니다.알고있다니깐개발자들이 각 패키지에 대해 두 개의 파일을 생성하고 유지 관리하도록 합시다.그들은 우리를 영원히 사랑할 것입니다!

MS가 오라클처럼 패키지를 구현하지 않는 한 제 생각에는 승산이 있습니다.

주석자에 대한 편집:

Oracle 패키지는 단순히 저장 프로시저를 패키지로 구성하여 100개의 저장 프로시저를 사용하지 않고 5개의 패키지로 구성하는 방법입니다.자바나 C# 코드의 패키지처럼 쌓을 수 없습니다.모든 패키지가 동일한 수준에 있습니다.

패키지에는 헤더 파일과 본문 파일의 두 파일이 필요합니다.이렇게 하면 기존 패키지에 새 프로시저를 추가할 때 문제가 발생합니다. 헤더가 본문에 있는 것과 완전히 동일한 정보를 포함하고 있더라도 헤더를 추가하지 않고 본문을 추가할 수 없기 때문입니다.

예를 들어, 다음은 내 패키지 중 하나의 헤더 파일의 일부입니다.

    PROCEDURE bulk_approve_events
(
    i_last_updated_by IN VARCHAR2,
    o_event OUT NUMBER
);

그리고 신체의 해당 절차는 다음과 같습니다.

    PROCEDURE bulk_approve_events
(
    i_last_updated_by IN VARCHAR2,
    o_event OUT NUMBER
) IS
...
BEGIN
...
END;

차이가 없습니다.헤더 파일은 쓸모가 없으며 패키지로 개발할 때 개발자가 넘어야 할 또 다른 장애물일 뿐입니다.제 프로젝트에서는 각 절차에 대해 설명된 모든 문서가 헤더에 추가된 시기와 사용자에 대한 세부 정보와 함께 포함되지만 본문에 쉽게 포함될 수 있습니다.

언급URL : https://stackoverflow.com/questions/770300/since-sql-server-doesnt-have-packages-what-do-programmers-do-to-get-around-it

반응형