2012-04-26 11 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

コメントありがとうございます。 @Ben: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

関連する問題