none
SQL SERVER 2017 既存テーブルに新しく追加した列が、SSMSで開くと勝手にビューの列に追加される RRS feed

  • 質問

  • 具体例を載せています

    テーブル R_SYAHIK に、HBIKOという列を追加しようとしています。

    このテーブルは、下記のビューで使用されています。

    このビューはSSMSでビューを右クリック・デザインをクリックしたときに表示されているSQL文です。

    SELECT               SH.SEQNO, SH.SEQ, SH.LN, SH.KDATE, SH.SHDATE, SH.BU, SH.KRA, SH.KH, SH.KHUSAL, SH.KHKIGYO, SH.OPE, SH.DKBN, SH.TKBN, SH.SAL, SH.BIKO, SH.CD, SH.ISUU, SH.CS, SH.SUU, SH.TNI, SH.NTAN, SH.KIN,
                               SH.UPDT, SH.GETDATE, H.NM1, H.NM2, B.BUNM, B.KBU, K.CENTER
    FROM                 dbo.R_SYAHIK AS SH LEFT OUTER JOIN
                               dbo.M_BU AS B ON SH.BU = B.BU LEFT OUTER JOIN
                               dbo.M_KURA AS K ON SH.KRA = K.KRA LEFT OUTER JOIN
                               dbo.M_HINMEI AS H ON SH.CD = H.CD

    NM1・NM2は、テーブルHの項目です。

    この状態で、SSMSのテーブル・R_SYAHIK を右クリック・デザインをクリックして列の最後に HBIKO という項目を追加して保存します。

    HBIKO列の追加

    先程と同じビューをSSMSでデザインを開いて呼び出してみると、NM1から先の項目割当が勝手に変わってしまいます。

    今追加したばかりのHBIKOが既にビュー項目として入っています。

    SELECT               SH.SEQNO, SH.SEQ, SH.LN, SH.KDATE, SH.SHDATE, SH.BU, SH.KRA, SH.KH, SH.KHUSAL, SH.KHKIGYO, SH.OPE, SH.DKBN, SH.TKBN, SH.SAL, SH.BIKO, SH.CD, SH.ISUU, SH.CS, SH.SUU, SH.TNI, SH.NTAN, SH.KIN,
                               SH.UPDT, SH.GETDATE, SH.HBIKO AS NM1, H.NM1 AS NM2, H.NM2 AS BUNM, B.BUNM AS KBU, B.KBU AS CENTER, K.CENTER
    FROM                 dbo.R_SYAHIK AS SH LEFT OUTER JOIN
                               dbo.M_BU AS B ON SH.BU = B.BU LEFT OUTER JOIN
                               dbo.M_KURA AS K ON SH.KRA = K.KRA LEFT OUTER JOIN
                               dbo.M_HINMEI AS H ON SH.CD = H.CD

    HBIKOが既に使われている

    これはSSMSの不具合なのでしょうか?SQL SERVER側の不具合なのでしょうか?

    バージョン情報

    SQL SERVER 14.0.3356.20

    SSMS V18.7 SSMSのバージョン情報から情報のコピーをしたものは下記になります。

    SQL Server Management Studio                        15.0.18357.0
    SQL Server 管理オブジェクト (SMO)                        16.100.44091.28
    Microsoft Analysis Services クライアント ツール                        15.0.19260.0
    Microsoft Data Access Components (MDAC)                        10.0.19041.1
    Microsoft MSXML                        3.0 6.0
    Microsoft .NET Framework                        4.0.30319.42000
    オペレーティング システム                        10.0.19042

    ちなみに、項目を追加後にSSMSでビューを右クリック・ビューをスクリプト可・構造変更・新しいクエリエディタウィンドウでクエリを見てみると

    ALTER VIEW [dbo].[vw_RptSyaHik]
    AS

    Select SH.*,H.NM1,H.NM2,B.BUNM,B.KBU,K.CENTER
    From R_SYAHIK SH
    Left join M_BU B on SH.BU=B.BU
    Left join M_KURA K on SH.KRA=K.KRA
    Left join M_HINMEI H on SH.CD=H.CD

    というクエリが表示されるので、SSMSのバグかもしれません。

    SSMSのバグであれば、どうやってMSに報告したらいいのでしょうか?

    2020年12月3日 3:53

回答

  • Viewの定義で "SH.*" となっているため、SSMSからViewを展開時に、すべての列が選択された状態になったのではないかと推測しています。

    ---
    ALTER VIEW [dbo].[vw_RptSyaHik]
    AS

    Select SH.*,H.NM1,H.NM2,B.BUNM,B.KBU,K.CENTER
    From R_SYAHIK SH
    Left join M_BU B on SH.BU=B.BU
    Left join M_KURA K on SH.KRA=K.KRA
    Left join M_HINMEI H on SH.CD=H.CD
    ---

    なお、Viewで参照されるテーブルのスキーマを変更した場合、sp_refreshview を使用してメタデータの更新を実施する必要があります。

    sp_refreshview (Transact-sql)
    https://docs.microsoft.com/ja-jp/sql/relational-databases/system-stored-procedures/sp-refreshview-transact-sql?view=sql-server-ver15

    今回、製品側の問題であるかは不明ですが、マイクロソフトのサポートへの問い合わせ もしくは、単純にフィードバックを実施したいのみであれば、以下のサイトよりフィードバックを実施することができるかと思います。

    SQL Server
    https://feedback.azure.com/forums/908035-sql-server

    • 回答としてマーク Hirohiro7 2020年12月3日 9:53
    2020年12月3日 9:25

すべての返信

  • Viewの定義で "SH.*" となっているため、SSMSからViewを展開時に、すべての列が選択された状態になったのではないかと推測しています。

    ---
    ALTER VIEW [dbo].[vw_RptSyaHik]
    AS

    Select SH.*,H.NM1,H.NM2,B.BUNM,B.KBU,K.CENTER
    From R_SYAHIK SH
    Left join M_BU B on SH.BU=B.BU
    Left join M_KURA K on SH.KRA=K.KRA
    Left join M_HINMEI H on SH.CD=H.CD
    ---

    なお、Viewで参照されるテーブルのスキーマを変更した場合、sp_refreshview を使用してメタデータの更新を実施する必要があります。

    sp_refreshview (Transact-sql)
    https://docs.microsoft.com/ja-jp/sql/relational-databases/system-stored-procedures/sp-refreshview-transact-sql?view=sql-server-ver15

    今回、製品側の問題であるかは不明ですが、マイクロソフトのサポートへの問い合わせ もしくは、単純にフィードバックを実施したいのみであれば、以下のサイトよりフィードバックを実施することができるかと思います。

    SQL Server
    https://feedback.azure.com/forums/908035-sql-server

    • 回答としてマーク Hirohiro7 2020年12月3日 9:53
    2020年12月3日 9:25
  • 返信ありがとうございます。

    sp_refreshview の更新処理、まったく知りませんでした...

    sp_refreshview を実行時にビューの名前をを指定しなければならいという事は、テーブルスキーマを更新した場合、そのテーブルが含まれているビューがあるかどうか確認しなければならいという事ですね。

    sp_refreshview を実行後にSSMSでデザインを開いて呼び出してみたところ、問題はありませんでした。お騒がせしました。

    フィードバック先も教えて頂きありがとうございます。何か問題があった場合は活用させて頂きます。

    2020年12月3日 9:53
  • ビューで参照しているテーブルのスキーマを変更することを防ぐ方法として、ビューに SCHEMABINDING を指定して作成するという方法があります。
    しかしながら、テーブルのスキーマを変更しなければならない場合、まず初めにビューを変更する(SCHEMABINDINGを省く)作業が発生するため、少し面倒かもしれません。

    CREATE VIEW (Transact-SQL)
    https://docs.microsoft.com/ja-jp/sql/t-sql/statements/create-view-transact-sql?view=sql-server-ver15
    SCHEMABINDING
    2020年12月3日 14:14