都内で働くSEの技術的なひとりごと / Technical soliloquy of System Engineer working in Tokyo

都内でサラリーマンやってます。SQL Server を中心とした (2023年からは Azure も。) マイクロソフト系(たまに、OSS系などマイクロソフト以外の技術も...)の技術的なことについて書いています。日々の仕事の中で、気になったことを技術要素関係なく気まぐれに選んでいるので記事内容は開発言語、インフラ等ばらばらです。なお、当ブログで発信、発言は私個人のものであり、所属する組織、企業、団体等とは何のかかわりもございません。ブログの内容もきちんと検証して使用してください。英語の勉強のため、英語の

制約を無効にしたり、有効にしたりしてみる

今回やることを説明してみる

 各テーブルに設定されている制約を無効にしたり、有効にしたりしたいと思います。制約があると、都合が悪い時もありますよね?

使用する環境を説明してみる

 私の Lenovo マシン上の SQL Server 2014 です。

実験してみる

 AdventureWorks2014 の Purchasing.PurchaseOrderHeader テーブルで実験したいと思います。制約がかかるような更新を行うと下図のようになります。
f:id:koogucc11:20141212063527p:plain
 上記のチェックがかからないようにするには、下記の DDL 文を実行します。

ALTER TABLE Purchasing.PurchaseOrderHeader
NOCHECK CONSTRAINT FK_PurchaseOrderHeader_Employee_EmployeeID;

f:id:koogucc11:20141212063202p:plain
 上記の DDL 文実行後に、テーブルを更新します。更新できましたね。
f:id:koogucc11:20141212063829p:plain
 制約を元に戻すには、下記の DDL 文を実行します。

ALTER TABLE Purchasing.PurchaseOrderHeader
CHECK CONSTRAINT FK_PurchaseOrderHeader_Employee_EmployeeID;

f:id:koogucc11:20141212064005p:plain
 テーブルに設定している制約をすべて外したい場合は、下記のように DDL 文を実行します。

ALTER TABLE Purchasing.PurchaseOrderHeader
CHECK CONSTRAINT ALL;

f:id:koogucc11:20141212064821p:plain

応用してみる

 データベースの全てのテーブルに関する制約を一気に無効化・有効化するには、undocumented なストアドを使用することで実現できますね。過去の記事を参照してみてください。

undocumented なものを見つけたので、調べてみる - その1 ( sp_MSforeachtable ) - - 都内で働くSEの技術的なひとりごと

undocumented なものを見つけたので、調べてみる - その2 ( sp_MSforeachtable と sp_MSforeach_worker ) - - 都内で働くSEの技術的なひとりごと

おわりに何か書いてみる

 今日も記事書く暇がなく、早朝に書いていたりします。