2012-04-26 3 views
2

보기가 의존하는 테이블에 열을 추가 할 때 명명 된 필드와 함께보기에 매우 예기치 않은 영향이 있습니다.테이블에 열을 추가하면 뷰의 sql이 변경됩니다.

SQL은 :

다른 사람의 코드가 테이블 AccessUser에 동적 추가 열을 수행
SELECT  dbo.AccessCustomFieldDepartment.AccessCustomFieldDepartmentID, dbo.AccessCustomFieldDepartment.AccessCustomField_StoreID, 
         dbo.AccessCustomFieldDepartment.AccessCustomField_ShopOwner, dbo.AccessCustomFieldDepartment.AccessCustomField_CVRnumber, 
         dbo.AccessCustomFieldDepartment.AccessCustomField_OpenMonToWed, dbo.AccessCustomFieldDepartment.AccessCustomField_OpenMonToThu, 
         dbo.AccessCustomFieldDepartment.AccessCustomField_OpenMonToFri, dbo.AccessCustomFieldDepartment.AccessCustomField_OpenMonToTue, 
--.. 
--a bunch of other fields 
--.. 

        dbo.AccessUser.AccessUserAddress, dbo.AccessUser.AccessUserAddress2, dbo.AccessUser.AccessUserZip, dbo.AccessUser.AccessUserCity, 
        dbo.AccessUser.AccessUserCountry, dbo.AccessUser.AccessUserWeb 
FROM   dbo.AccessUser INNER JOIN 
         dbo.AccessCustomFieldDepartment ON dbo.AccessUser.AccessUserID = dbo.AccessCustomFieldDepartment.AccessCustomFieldDepartmentID 

, 서버 또는 뭔가 뷰의 SQL을 변경!

EG :

dbo.AccessUser.AccessUserCountry, dbo.AccessUser.AccessUserWeb 

이 크게 F *이 이 *이 * 데이터의 내 결과 발표를이야 .... 그것보기처럼 유지하려고

dbo.AccessUser.AccessUserCountry AS AccessUserCity, 
dbo.AccessUser.AccessUserWeb AS AccessUserCountry 

로 변경됩니다 각 열의 위치

열을 삭제하면 SQL이 원래대로 돌아갑니다.

그래서 질문은 : 무슨 일

  • ? 서버입니까? CMS의 일부 기능 소프트웨어 (필드 추가 기능이있는 곳)
  • SQL 문을 100 % 정적으로 간주하도록보기를 설정할 수 있습니까?

감사합니다,

스틴

+0

어떤 DBMS입니까? 액세스? 링크 된 테이블의 유무에 관계없이? 일반적으로 해결책은 자동으로 발생해야하는 뷰를 재구성하는 것이지만 그렇지 않을 수도 있습니다. SQL Server에서 sp_recompile. 또한 테이블 끝에서 열을 추가하는 것을 피하십시오. 중간에 열을 추가하는 것은 문제를 묻는 것이며보기에서 *를 사용하지 마십시오. – Ben

+0

[DDL 트리거] (http://msdn.microsoft.com/en-us/library/ms175941.aspx), 아마도? –

+0

의견에 감사드립니다. @ 벤 : MS-SQL- 서버 2008R2. 방금 CMS의 기존 테이블에서 데이터를 가져 오기 위해 기본보기에서 만들었습니다. 추가하는 열을 제어 할 수 없습니다. 모든 컬럼 이름을 명시 적으로 언급 했으므로, 왜 내가 그 변화를 보았는지 너무 놀랐습니다. 여전히 피하는 방법을 찾고 싶지만보기를 사용하지 않고 실행하는 옵션이 있습니다 ... – Steen

답변

1

보기를 다시 컴파일하려면 또는 절차는 다음을 실행합니다

/* View: */ 
exec sp_refreshview 'dbo.MyViewName' 

/* Procedure, FN, IF, TF */ 
exec sp_recompile 'dbo.ProcedureName' 
exec sp_recompile 'dbo.ScalarFunctionName' 
exec sp_recompile 'dbo.InlineFunctionName' 
exec sp_recompile 'dbo.TableFunctionName' 

당신을 sysobjects에서 개체의 목록을 얻을 수 있습니다. 이것들을 테이블 변수로 선택하는 것이 상대적으로 쉽고 각각을 차례로 재 컴파일하는 루프를 생성해야합니다.

set nocount on 
declare @o table(
    id int primary key, 
    object_full_name nvarchar(1000), 
    xtype nvarchar(20) 
) 
insert @o 
select 
    id, object_schema_name(id) + '.' + object_name(id) as object_full_name, xtype 
from sysobjects so 
where 
    xtype in ('V', 'P', 'FN', 'TF', 'IF') 


while exists (select 1 from @o) 
begin 
    declare @id int 
    declare @object_full_name nvarchar(1000) 
    declare @xtype nvarchar(20) 
    set @id = null 
    select top 1 @id = id, @object_full_name = object_full_name, @xtype = xtype from @o order by xtype, object_full_name, id 
    delete @o where id = @id 
    if @xtype = 'V' 
    begin 
     raiserror('Marking for recompile - %s: %s', 0, 1, @xtype, @object_full_name) 
     exec dbo.sp_refreshview @object_full_name 
    end 
    else 
    begin 
     raiserror('Marking for recompile - %s: %s', 0, 1, @xtype, @object_full_name) 
     exec dbo.sp_recompile @object_full_name 
    end 
end 

필요에 따라 DDL 트리거를 고려할 수도 있습니다.

+0

고마워 .......고객이 구현 비용을 지불하지 않고보기를 사용하지 않아도 문제를 쉽게 해결할 수 있기 때문에 테스트하지는 않겠지 만 ... 여전히 감사합니다! – Steen

관련 문제