web-dev-qa-db-ja.com

DacPac展開で、別のストアドプロシージャによって呼び出されたストアドプロシージャが更新された場合、呼び出し元のストアドプロシージャも再展開されますか?

私のDacPacで、デプロイ後、2つのストアドプロシージャにsys.objects、ほぼ同じミリ秒。ただし、更新したのは1つのプロシージャだけなので、そのうちの1つだけがこれを持っていると予想します。更新された他のprocは更新されたprocを呼び出しますが、直接変更しませんでした。

誰かがこの動作を見ましたか? DacPacでは、実際のコード変更がない場合でも、呼び出し元のストアドプロシージャが "変更"されると予想されますか、それともそれ以外の可能性がありますか?

私の懸念はいくつかの理由であり、主にQAの人々がこれに疑問を投げかけることに関連しており、最終的には、理由を説明できないときにprocが変更されたことを確認することはお勧めできません。

助けてくれてありがとう。

1
datadawg2000

はい、予想通りです。

StoredProcAStoredProcBを呼び出し、StoredProcBが変更された場合、DacPacデプロイメントは次のようになります。

  • StoredProcBへの変更をデプロイします
  • StoredProcAのメタデータを更新する

生成されたデプロイメントスクリプトは次のようになります。

GO
PRINT N'Altering [dbo].[StoredProcB]...';


GO
ALTER PROCEDURE [dbo].[StoredProcB]
/*
your new stored proc body here
*/
GO
PRINT N'Refreshing [dbo].[StoredProcA]...';


GO
EXECUTE sp_refreshsqlmodule N'[dbo].[StoredProcA]';

StoredProcAの変更日を更新するのは、sp_refreshsqlmoduleの呼び出しです。プロシージャは再デプロイされていませんが、基になるメタデータには含まれている可能性があります。

あなたの場合、実際には何も変わっていません。たとえば、パラメーターとして使用されたユーザー定義型をStoredProcAに更新した場合、sp_refreshsqlmodule全体が必要になります。この状況では必要ありませんが、SSDTには、依存するモジュールをいつ更新するかについての複雑なルールはありません。変更があった場合、モジュールをすべて更新するだけです。

1
Josh Darnell