トップ回答者
SQL SERVER 2017 既存テーブルに新しく追加した列が、SSMSで開くと勝手にビューの列に追加される

質問
-
具体例を載せています
テーブル 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この状態で、SSMSのテーブル・R_SYAHIK を右クリック・デザインをクリックして列の最後に 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これは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に報告したらいいのでしょうか?
回答
-
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
すべての返信
-
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
-
-
ビューで参照しているテーブルのスキーマを変更することを防ぐ方法として、ビューに 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