LoginSignup
12
12

More than 3 years have passed since last update.

SQLServer: Index付Viewをリリースするときに注意すべきこと

Last updated at Posted at 2016-12-21

インデックス付Viewは便利ですが、導入するときには気をつけないといけないなーという失敗をしたので書いておきます。

インデックス付Viewは、作成のSQLだけ通ればめでたしめでたしというわけにもいかないです。。
インデックス付Viewの元テーブルに更新をかけてるクエリやストアド実行時のSETオプション次第では、クエリ実行がエラー終了してしまうという恐ろしい罠があります。

SET ANSI_NULLS ON
SET QUOTED_IDENTIFIER ON

上記2オプションが必須です。ここがOFFになってるとNG。ストアドのCREATE文を実行するときに使ったクライアント次第では自動でOFFになったりするので注意が必要です。
デフォルトはどっちもONなので、普通にSSMSからCREATEしている分には問題ないと思います。

インデックス付Viewの元テーブルを使っていて、かつ更新があり、かつオプションがインデックス付View的にNGなストアド一覧を見つけ出すには↓のSQLを実行すればOKだと思います。

SELECT OBJECTPROPERTY(OBJECT_ID(ROUTINE_Name), 'ExecIsQuotedIdentOn') AS 'ExecIsQuotedIdentOn'
    ,OBJECTPROPERTY(OBJECT_ID(ROUTINE_Name), 'ExecIsAnsiNullsOn') AS 'ExecIsAnsiNullsOn'
    ,*
FROM information_schema.routines
WHERE routine_definition LIKE '%テーブル名%'
    AND routine_type = 'procedure'
    -- ANSI_NULLS または QUOTED_IDENTIFIER オプションが0のものに限定(=index付Viewの元テーブルに対して更新かけるようなストアドだとエラー)
    AND (
        OBJECTPROPERTY(OBJECT_ID(ROUTINE_Name), 'ExecIsQuotedIdentOn') = 0
        OR OBJECTPROPERTY(OBJECT_ID(ROUTINE_Name), 'ExecIsAnsiNullsOn') = 0
        )
    -- 更新かけてるストアドに限定(SELECTは問題なし)
    AND (
        routine_definition LIKE '%insert %'
        OR routine_definition LIKE '%update %'
        OR routine_definition LIKE '%delete %'
        OR routine_definition LIKE '%drop %'
        OR routine_definition LIKE '%truncate %'
        )
ORDER BY CREATED DESC

以上、同じ罠にかかる人がでてこないように。。

※さらに詳しくは↓を参照ください。
https://msdn.microsoft.com/ja-jp/library/ms191432.aspx

12
12
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
12