2011-02-11 2 views
1

좋아, 그래서이 질문을 알고 있습니다. 내가 읽은 모든 것은 "잘 .. 동적 인 DSL을 사용하여 할 수는 있지만 그렇게하지는 마라."나의 질문은 그 이유 다. 나는 이것에 아직도 새로운 그래서 나는 나와 함께 그렇게 곰을 배우고있다. 그러나 여기 내가하고있는 것이있다. 저장 프로 시저를 사용하여 동적 뷰 (임시 테이블 아님)를 만들려는 경우 뷰에 시작 날짜와 종료 날짜를 설정하는 데 사용되는 두 개의 날짜가 있습니다. 다음과 같이 보입니다.저장 프로 시저보기를 만들려면

create or replace view MyView as 
SELECT 
    A.COLUMN_A 
    FUNCTION1(to_date('2/10/2011','MM/DD/YYYY') TOTAL1, 
    FUNCTION2(to_date('2/15/2011','MM/DD/YYYY') TOTAL2 
FROM TABLE_A A; 

이보기는 수정 된 보고서에 필요한 데이터를 생성하는 데 사용됩니다. 문제는이 동일한 SQL 문을 다른 언어로 사용하기 시작한다는 것입니다. (우리는 현재 델파이를 사용하고 있지만 다른 언어로 작업하고 있습니다 (그러나 다른 언어는 무엇인지 모릅니다). 스토어드 프로 시저에서 뷰를 생성하려는 이유는 a) 뷰가 동적이고 기반이 떨어져 있기 때문입니다 사용자가 선택한 날짜 범위 및 b) 기능 및 매개 변수에 대한 단일 행에 대해 여러 언어 (다소 기간 선택이 바뀌기 때문에 즉석에서 만들어야하는)로 다소 큰보기를 넣는 대신 통과해야합니다. 내가 읽은 것들 중 많은 부분은 Dynamic SQL을 사용하여 뷰를 생성하는 것이 좋지 않다고 말하지만 동적 뷰는 이미 사용자를 위해 특별히 제작 된 것을 알고 있기 때문에 누구나 그 문제를 볼 수 있습니까? 나는 내 머리카락을 꺼내기를 바래서 나 자신을 빠져 나올 수 없을 정도로 길을 무언가에 넣고 싶지 않기 때문에 묻고있다.

+0

어떤 RDBM이 이것에 해당합니까? –

답변

1

보기 생성은 실제로 코드 생성이며 일반적으로 상당히 영구적 인 경우에만 좋은 아이디어입니다. 스키마 변경이므로 고급 기술로 간주되어야하며 항상 복잡한 순서로 데이터베이스 기술을 사용하려고합니다.

즉, 특정 표 /보기 디자인의 경우보기로 수행 할 수 있다면 시도해보십시오. 성능을 위해 인덱싱 된 뷰가 실제로 필요한 경우이를 시도하십시오. 또는 계산 된 열 또는 지속 된 계산 된 열일 수 있습니다. 아마도 인라인 테이블 반환 함수 또는 다중 문 테이블 반환 함수 또는 잠재적으로 저장 프로 시저입니다. 그래서 필요할 때만 에스컬레이션하려고합니다.

"보기"는 SQL Server (및 DB2 이상)의 인라인 테이블 반환 함수 일 수도 있으며 이러한 매개 변수는 매개 변수가있는보기와 같습니다. 또한 대부분의보고 도구 (물론 대부분의 언어/db 라이브러리)의 매개 변수화 된 저장 프로 시저를 직접 사용할 수도 있습니다.

+0

알았어, 나랑 벗었 어. 정직하게도 여전히 이것에 대해서 정말 새롭고 지난 6 개월 동안 SQl을 배우고 일해왔다. 그래서 기본적으로 바로 지금 우리는 그 순간에 전망을 창조하고 있습니다. 날아 다니는 것들은 마지막보기이고 다른보기에 묶여 있지 않습니다. 전달 된 매개 변수는 항상 날짜 범위입니다. 내가 항상 여기 오기 전에 오랫동안 SQL 측에서 항상 호출되었습니다. 함수 대신 select 문을 수행하는 대신에 말하고있는 것입니까? 아마도 그것을 임시 테이블에 추가 하시겠습니까? 여기에 임시 테이블 대신보기를 작성하는 이유가 있습니까? – Tidmore

+0

@Tidmore 필자는 선택 날짜를 매개 변수로 사용하여 저장된 proc에 select 문을 넣는 것이 좋습니다. SP에서 SELECT가 될 수있는 뷰를 생성 할 수있는 곳은 어디에도 없습니다. 그런 다음보고 엔진을 첨부하십시오. 오라클에서는 아마 커서로 선언해야하지만, SQL Server에서는 바로 선택이 무엇이든 상관 없습니다. 다른 사람들이보기를 재현한다는 것은 동시 사용이 불가능하다는 것을 의미합니다. 일반적으로 뷰 또는 저장 프로 시저가 수행되는 경우 임시 테이블을 만들 이유가 없습니다. –

2

델파이 프런트 엔드와 SQL Server 백엔드를 수행합니다. 왜 뷰를 사용합니까? 저는 항상 작업을 매우 잘 수행하는 간단한 SELECT로 SP를 만듭니다. 일반적으로 Crystal Report를 자주 사용하는 경우) SP를 실행할 때마다 지워지고 다시 채워지는 영구 테이블을 만듭니다. 짧고, 달콤하고, 단순합니다.

+2

올바른지,이 유형의 요구 사항에 대한보기가 잘못된 선택입니다. 저장된 프로 시저를 Crystal 보고서의 기초로 사용할 수 있습니다. Crystal 보고서는이 유형의 요구 사항에 더 적합합니다. 다른 사용자가 동시에 보고서를 실행하려고 할 때 방해를 받거나보기를 놓거나 테이블을 비우십시오. – HLGEM

1

뷰 (또는 데이터베이스 객체)를 동적으로 만드는 것은 런타임에 코드를 조작하는 것과 같습니다. 강력하고 좋고 나쁜 방법.

  • 성능 : DDL 문은 성능
  • 치명적인 버그 나쁜 캐시의 일부를 무효화 : 당신이로 실행할 수

    riscs 문제 다른 물건은보기에 따라 달라집니다 경우 (저장 절차, 다른 전망 ...) 당신의 전망이 1 가지의 이유 또는 다른 것을 위해 부서지는 경우에 끊을 것이다.

  • 확장 성 : DDL은 해당 개체에 배타적 잠금이 필요합니다. 그것을 얻는 데 오랜 시간이 걸릴 수도 있고 그것을 잡고있는 동안 다른 모든 사람들을 막을 수도 있습니다.
  • 확장 성 : 두 사용자가 서로 다른 방식으로보기를 동시에 변경해야하는 경우 어떻게됩니까?
  • 유지 관리 기능 : 개체가 변경 될 때 어떤 일이 벌어지는 지 이해하기가 어렵습니다.
  • 보안 : 악의적 인 작업을 할 때 악용 될 수있는 이러한 개체를 변경할 권한이 있어야합니다.

99.9 %에서는 개체를 동적으로 만들 필요가 없으며 0.1 %가 아닌 경우에는 개체를 사용해서는 안됩니다.

현재 사용중인 작업에 대한 설명을 제공합니다. 변수 변수와 함께 sql 문을 바인드 변수로 사용하고 사용하지 않는 이유는 무엇입니까? 나는 여기서 볼 필요가 없다.

+0

표시되는보기는보기와 같이 매우 단순한보기입니다. 나는 전체적인 견해를 세웠을 것이고 그것이 왜 그런 식으로 행해지는지에 관해서 더 이해할 수있을 것이다. 나는보기가 delphi에서 즉석에서 생성되고 Crystal가 보고서의 뷰에서 데이터를 가져 오기 때문에 아마도 그럴지는 몰랐다. 다시 말하지만 그것은 임시 테이블을 사용하는 것이 좋을 것 같습니다. 왜냐하면이 테이블을 두 번 수행해야하고, 한 번 SQL에서보기를 바꾼 다음 Crystal에서보기에서 데이터를 호출해야하기 때문입니다. 이걸 착각 한거야? – Tidmore