2011-10-03 4 views
1

.NET MVC 3 및 ​​PetaPoco를 사용하여 공유 데이터베이스로 멀티 테넌트 응용 프로그램을 작성합니다. 임차인 ID (다른 정보와 함께)는 로그인시 FormsAuth 쿠키에 저장되며 BaseController 속성을 통해 모든 컨트롤러에서 사용할 수 있습니다. 대부분의 테이블 (즉, 주요 '임차인'테이블을 제외하고)에는 TenantId 열이 포함됩니다.WHAT 절을 동적으로 PetaPoco에 "삽입"

수동으로 'WHERE TenantId = X'를 피쳐 테이블의 모든 CRUD에 추가하는 대신 실행 직전에 쿼리에 동적으로 추가 할 수있는 방법이 있습니까? 즉, 아마도 테이블의 목록을 유지하고 쿼리가 이러한 테이블 중 하나에 대한 것이면 동적으로 TenantId 필터를 추가할까요?

물론 이점은 필터를 수동으로 추가 할 필요가 없으므로 남은 기회가 줄어 듭니다. 나는 example using NHibernate을 찾았는데, 나는 그것이 용도 변경 될 수 있을지 의심 스럽다. 내가 차이를 만드는 경우에는 Ninject를 사용하고 있습니다.

+0

앱과 함께 저장하려고하는 데이터의 종류입니다. 이런 식으로 동적 SQL을 사용할 때 보안/SQL 주입 위험이있을 수 있습니다. –

+0

일반적으로 그렇지만 우리는 매개 변수화 된 SQL (PetaPoco는 기본적으로 그렇게 사용하고 있습니다)을 사용하고 있으므로 문제가되지 않습니다. 실제 질문과 관련이없는 게시물에 대해서는 언급하지 않았습니다. 그러나 그것을 지적 해 주셔서 감사합니다 :) – seekay

+0

좋은 거래. 나는 PetaPoco에 익숙하지 않아서 내가 처음 보았을 때 감동을 받았다. :) –

답변

0

데이터베이스 클래스에는 OnCommandExecuting 메서드가 있습니다.이 메서드는 자신의 하위 클래스에서 재정의 할 수 있으며 실행 직전에 원하는대로 수정할 수 있습니다. 이 기능을 사용하여 isnull/nvl을 Sql Server와 Oracle간에 변환합니다.

마커를 SQL에 남겨두고 여기에서 바꿀 수 있습니다.

+0

고마워요. 그러나 IDbCommand에 JOIN이 있고 필터가 특정 테이블에만 적용되도록하려는 경우 까다로워 질 수 있습니다. 마커는 SQL에서 마커를 추가하는 경우를 제외하고는 TenantId 필터를 직접 추가 할 수 있습니다 ('추가'를 잊어 버린 개발자의 '문제'가 여전히 존재할 수 있음). 더 나은 솔루션이 없다면 기본 저장소에서 GetByTenant ('Get'대신)를 선택할 수 있다고 생각합니다. 당신의 도움을 주셔서 감사합니다! – seekay

+0

참이지만, 특정 테이블이 언급되어있는 경우 마커가 있는지도 확인하고 그렇지 않은 경우에는 예외를 throw 할 수 있습니다. 나는 또한 exist 절을 붙잡고있는 헬퍼 함수를 ​​사용했고,/* SECURITY */etc 주석문을 사용하고, 그렇지 않으면 예외를 던지기 전에 이것을 체크한다. – Schotime

관련 문제