SQL Serverのスキーマバインドビューによって参照される列のサイズの変更


124

私はSQLサーバーの列のサイズを変更しようとしています:

ALTER TABLE [dbo].[Address]
ALTER COLUMN [Addr1] [nvarchar](80) NULL

Addr1元々の長さでした40

失敗し、このエラーが発生しました:

The object 'Address_e' is dependent on column 'Addr1'.
ALTER TABLE ALTER COLUMN Addr1 failed because one or more objects access 
this column.

私はそれを読んでみましたが、一部のビューがこの列を参照しており、SQL Serverが実際にエラーを発生させた列を削除しようとしているようです。

Address_e 以前のDB管理者が作成したビューです。

列のサイズを変更する他の方法はありますか?


2
Address_eは、前のDB管理者が作成したビューです。そして、Remusが述べたように、それはSCHEMABINDINGが定義されています。
Staelen、

回答:


58

ビューはおそらくWITH SCHEMABINDINGオプションを使用して作成されます。これは、そのような変更を防ぐために明示的に関連付けられていることを意味します。スキーマバインディングが機能して、これらのビューを壊すことができなかったようです。幸運な日ですね。データベース管理者に連絡して、データベースへの影響を表明した後で、変更を依頼してください。

MSDNから:

スキーマバインディング

基になるテーブルのスキーマにビューをバインドします。SCHEMABINDINGを指定すると、ビュー定義に影響を与えるような方法でベーステーブルを変更できません。変更するテーブルへの依存関係を削除するには、まずビュー定義自体を変更または削除する必要があります。


1
Remusに感謝します。ビューにはSCHEMABINDINGが定義されています。制約をバイパスする簡単な方法はありますか、それとも実際にビューを削除して機能させる必要がありますか?
Staelen

1
あなたはそれをバイパスすることはできません、それはその全体の目的です。誰かがschemabindigを追加してテーブルの変更を防ぐために余分な時間を費やしました。これは偶然ではなく、人が何をしていたかを知っているように見えます。あなたがしていることを確認あなたは、テーブルを変更したいですか?
Remus Rusanu 2009

1
はい、確かに=)と論理的に(そのように動作しないことがわかっていても)列の長さを増やしています。これは、列が削除されて再作成されない場合にのみ問題ありませんが、残念ながらそうではありません...しかし、あなたの助けに感謝します!= D
Staelen

2
同じ問題が発生しています。残念ながら、ビューにインデックスを付けるためにSCHEMABINDINGビューを使用しています。そのため、私の場合、SCHEMABINDINGを使用して、基になるテーブルへの変更を明示的にブロックするのではなく、使用するインデックス付きビューに対するSQL Serverの要件にのみ準拠します。また、ビューを削除して再作成せずにこれをバイパスしたいと思います。
jpierson 2010

256
ALTER TABLE [table_name] ALTER COLUMN [column_name] varchar(150)

11
いや、問題はレムスが言ったようなものだった。コード自体には何の問題もありません
Staelen '22

11
@NilRadええと、おそらくあなたはPL-SQLを考えていますか?ALTER COLUMNはSQL 2008 R2の正しい構文です
schmidlop

4
何か不足していますか?なぜそれほど多くの賛成票があるのですか?質問の答えにはなりません。
Andy Wiesendanger、2015年

13
賛成票の数は、この質問が現在「tsql alter nvarchar length」に対するGoogleのトップヒットであり、列の長さを変更する方法を通知したい人(私のような)がこの回答を参照し、上向きであることが原因である可能性があります-質問のタイトルが示唆するよりも質問が微妙であることを(コメントを読むまではしなかったように)気づかずに「ありがとう」と言うように投票します。
dumbledad 2015

6

SQL Server 2008で「レプリケートされたテーブルの列幅を増やす」ことを希望する場合は、「replicate_ddl=1」のプロパティを変更する必要はありません。以下の手順に従ってください-

  1. SSMSを開く
  2. パブリッシャーデータベースに接続する
  3. コマンドを実行する- ALTER TABLE [Table_Name] ALTER COLUMN [Column_Name] varchar(22)
  4. 列幅をからvarchar(x)に増やし、varchar(22)サブスクライバーで確認できるのと同じ変更を行います(トランザクションが複製されます)。したがって、レプリケーションを再初期化する必要はありません

これがそれを探しているすべての人に役立つことを願っています。


5

このリンクを参照してください

T-SQLコマンドを使用して、デフォルトの制約でMS SQL Serverテーブルの列のサイズを変更または変更する

このようなSQL Serverの問題の解決策は

テーブル列のDEFAULT制約の削除または無効化。

テーブルの列のデータ型やデータサイズを変更する。

sqlテーブル列でデフォルトの制約を再作成または有効化します。

バイバイ


スキーマバインディングビューを削除して再作成する必要があります。
ヌレッティン

2

私が使用しているプログラムのバージョンで機能するものは次のとおりです。

それを行う命令とコマンドを配置するだけです。classはテーブルの名前です。このメソッドを使用して、テーブルのそれ自体を変更します。検索プロセスのリターンだけではありません。


テーブルクラスを見る

select * from class

ラベル全体に合うように、列FacID(「faci」として表示)およびクラス番号(「classnu」として表示)の長さを変更します。

alter table class modify facid varchar (5);

alter table class modify classnumber varchar(11);

もう一度表を見て、違いを確認してください

select * from class;

(違いを確認するには、コマンドを再度実行してください)


これにより、実際のテーブルが変更されます。

PS私はこれらの指示をコマンドのメモとして作成しました。これはテストではありませんが、1つを助けることができます:)


0

列の照合を確認してください。このスクリプトは、照合順序をテーブルのデフォルトに変更する場合があります。現在の照合をスクリプトに追加します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.