2

再現できるビューに非常に奇妙な問題があります。一部のビュー メタデータが最新ではなく、この問題が発生していると確信しています...

要するに:

  • ビュー(MyTestView)があります。
  • このビューの名前が変更されました (MyTestViewOld)。
  • 名前を変更したビューの元の名前と別の選択クエリ (MyTestView) を使用して、新しいビューが作成されます。
  • 名前を変更したビュー (MyTestViewOld) に対して sp_refreshview が実行されます。
  • MyTestView の実装は MyTestViewOld の実装になりました。

SP sp_refreshview を調べてみましたが、彼は sp_refreshsqlmodule_internal という別の SP を実行しました。このビューは、マスター データベースのシステム ストアド プロシージャには表示されません :(

私の問題は実際には「MyTestViewOld」を削除することで修正されますが、正確に何が起こっているのか知りたいです! TNX

ここに問題を再現するスクリプトがあります! (段階的に実行してください)

--create a test table
create table dbo.MyTestContacts(
    [Title] [varchar](20) NULL,
    [Name] [varchar](255) NULL,
    [FirstName] [varchar](255) NULL,
    [Telephone] [varchar](50) NULL,
    [Email] [varchar](255) NULL
    )

--insert data in the temp table
insert dbo.MyTestContacts values ('Mr', 'Holly', 'Buddy', '0123456798', 'buddy@holly.co')
insert dbo.MyTestContacts values ('Mr', 'Valens', 'Ritchie', '987654312', 'ritchie@valens.co')
insert dbo.MyTestContacts values ('Mr', 'Richardson', 'Jiles Perry', '987654312', 'jp@richardson.co')


--create a view
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
create view dbo.MyTestView as 
select Title, Name, FirstName from dbo.MyTestContacts
GO


--do a SCRIPT VIEW AS / ALTER TO in sql management studio to verify the view implementation


--rename the view
exec sp_rename 'dbo.MyTestView', 'MyTestViewOld'


--BIS1 (explained below; used in a 2nd test run)


--create a view with the same name as the first view, but different implementation!
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
create view dbo.MyTestView as 
select Title, Name, FirstName, Telephone from dbo.MyTestContacts
GO


--do a SCRIPT VIEW AS / ALTER TO in sql management studio to verify the view implementation of MyTestView (telephone is added)


--perform a refreshView action on the MyTestViewOld view
exec sp_refreshview 'dbo.MyTestViewOld'


--do a SCRIPT VIEW AS / ALTER TO in sql management studio to verify the view implementation of MyTestView --> THIS SHOWS THE MyTestViewOld IMPLEMENTATION!!!!


--(BIS1) Note that this sequence gets broken when I do an ALTER VIEW on MyTestViewOld right after the rename!
--SET ANSI_NULLS ON
--GO
--SET QUOTED_IDENTIFIER ON
--GO
--alter view dbo.MyTestViewOld as 
--select FirstName, Name, Email, Telephone from dbo.MyTestContacts
--GO


--drop everything
drop view dbo.MyTestViewOld
drop view dbo.MyTestView
drop table dbo.MyTestContacts
4

2 に答える 2

1

sp_renameはかなり不完全であり、ほとんどのオブジェクト タイプで使用することに対して多くの警告があります。

オブジェクト名の一部を変更すると、スクリプトとストアド プロシージャが破損する可能性があります。このステートメントを使用して、ストアド プロシージャ、トリガー、ユーザー定義関数、またはビューの名前を変更しないことをお勧めします。代わりに、オブジェクトをドロップして、新しい名前で再作成してください。

あなたが見つけたシナリオに関する特定の警告はありませんが、問題の発生につながる可能性のあるパスについていくつかの手がかりがあります。

sys.sql_modulesストアド プロシージャ、関数、ビュー、またはトリガーの名前を変更しても、カタログ ビューの定義列にある対応するオブジェクト名は変更されません。

そして、あなたが発見したように、ビューを更新する内部メソッドはsp_refreshsqlmodule_internal- であるため、「モジュール」レベルのメタデータ内部での何らかのバグダウンであることをお勧めします。

バグが他の場所で文書化され、(おそらく) 製品ドキュメントにさらに警告を追加する以外の理由がない場合は、SQL Server Connectで問題を提起することを検討することをお勧めします。

于 2013-07-30T14:19:13.143 に答える