このような問題は、SQLサーバーを作成する人々が実際に製品を使用したことがないことを示しています。これは非常に目立たないため、他のDBが行うように、この作業を行うために克服しなければならなかった約30の他の厄介な問題のリストがあります。最初にこれを行うには粗末なウィザードが必要であるという事実を含む[このウィザードが同じDBの同じテーブルに接続して列挙するのを待つ時間があった場合...素敵な休暇を過ごす時間があるだろう])。
私はとても怠け者で、タイプしたくない EXEC sp_msforeachtable ...
これを行うたびに2回。私の回避策は、実稼働サーバーに制約を残し、それらを開発サーバーから削除することです。これはエラーを防ぎますが、この方法にはいくつかの非常に大きな副作用があります。まず、完全なバックアップをdevサーバーに復元することはできなくなります(すべてを完全に削除しても問題ない限り)。第二に、これは、データのコンシューマーがこれらの制約を強制する(またはそれらを気にしない)と確信している場合に最もよく機能します。私の場合、消費者(ウェブサイト)は1人だけなので、これらの制約をサイトコードにも組み込みました(つまり、ユーザーレコードを削除する前に、そのユーザーのすべての電話レコードを最初に削除します)。はい、これは、本質的に制約の必要性を本質的に無効にし、行う必要がある作業を2倍にしますが、DBMSベースの制約の有無にかかわらずコードが機能することを検証する機会も与えます緊急時対応計画としてのみ)。これを私の設計の欠陥と呼ぶこともできますが、私はむしろ欠陥のあるDBMSの回避策と呼びます。とにかく、独自の設計に対応できないため、MSSQL内からよりも他の場所でこれを行う方が迅速かつ簡単です。
sp_msforeachtable
(およびsp_MSForEachDb
)は文書化されておらず、サポートされていません。あなたはそれを使用するべきではありません/避けるべきです。テーブルをスキップするかもしれません!! @AaronBertrandからのこの投稿を参照してください-> sqlblog.com/blogs/aaron_bertrand/archive/2010/12/29/…およびこの接続項目-(MSは修正しないことを示すMS)-> connect.microsoft.com/SQLServer /フィードバック/詳細/ 264677 / ...