Mengubah ukuran kolom yang dirujuk oleh tampilan terikat skema di SQL Server

124

Saya mencoba mengubah ukuran kolom di sql server menggunakan:

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

dimana panjang Addr1awalnya 40.

Gagal, meningkatkan kesalahan ini:

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

Saya sudah mencoba untuk membacanya dan tampaknya karena beberapa pandangan mereferensikan kolom ini dan tampaknya SQL Server benar-benar mencoba untuk menjatuhkan kolom yang menimbulkan kesalahan.

Address_e adalah pandangan yang dibuat oleh Administrator DB sebelumnya.

Apakah ada cara lain untuk mengubah ukuran kolom?

Staelen
sumber
2
Address_e adalah tampilan yang dibuat oleh Administrator DB sebelumnya. Dan seperti apa yang disebutkan Remus, itu telah didefinisikan SCHEMABINDING.
Staelen

Jawaban:

58

Pandangan mungkin dibuat menggunakan opsi DENGAN PENYARINGAN dan ini berarti mereka secara eksplisit terhubung untuk mencegah perubahan tersebut. Sepertinya skemabinding berhasil dan mencegahmu dari melanggar pandangan itu, hari yang beruntung, heh? Hubungi administrator database Anda dan minta dia untuk melakukan perubahan, setelah itu menegaskan dampak pada database.

Dari MSDN :

SKEMAING

Mengikat tampilan ke skema tabel atau tabel yang mendasarinya. Ketika SCHEMABINDING ditentukan, tabel atau tabel dasar tidak dapat dimodifikasi dengan cara yang akan mempengaruhi definisi tampilan. Definisi tampilan itu sendiri harus terlebih dahulu dimodifikasi atau dihapus untuk menghapus dependensi pada tabel yang akan dimodifikasi.

Remus Rusanu
sumber
1
terima kasih Remus, tampilan memang mendefinisikan SCHEMABINDING. apakah ada cara mudah untuk melewati batasan atau apakah saya benar-benar perlu menghapus pandangan untuk membuatnya berfungsi?
Staelen
1
Anda tidak dapat mem-bypassnya, itulah seluruh tujuannya. Seseorang berusaha ekstra panjang untuk menambahkan schemabindig untuk mencegah perubahan tabel. Ini bukan kecelakaan, sepertinya orang itu tahu apa yang sedang dilakukannya. Anda yakin ingin mengubah tabel?
Remus Rusanu
1
ya, saya yakin =) dan secara logis (meskipun saya tahu itu tidak berfungsi seperti itu) saya menambah panjang kolom, yang seharusnya benar-benar baik-baik saja hanya jika kolom tidak jatuh dan dibuat ulang, tetapi sayangnya tidak demikian ... tapi terima kasih atas bantuan Anda! = D
Staelen
2
Saya melihat masalah yang sama dan sayangnya kami menggunakan tampilan SCHEMABINDING untuk mengindeks pandangan. Jadi dalam kasus saya, saya tidak menggunakan SCHEMABINDING untuk secara eksplisit memblokir perubahan pada tabel yang mendasarinya tetapi hanya untuk memenuhi persyaratan SQL Server untuk menggunakan tampilan indeks. Saya juga ingin memotong ini tanpa menjatuhkan dan menciptakan kembali pandangan saya.
jpierson
256
ALTER TABLE [table_name] ALTER COLUMN [column_name] varchar(150)
Syed Baqar Hassan
sumber
11
nah, masalahnya seperti apa yang disebutkan Remus. tidak ada yang salah dengan kode itu sendiri
Staelen
11
@NilRad Ummm, mungkin Anda berpikir tentang PL-SQL? ALTER COLUMN adalah sintaks yang benar pada SQL 2008 R2
schmidlop
4
Apakah saya melewatkan sesuatu? Mengapa begitu banyak upvotes? Itu tidak menjawab pertanyaan.
Andy Wiesendanger
13
Jumlah suara terbanyak mungkin karena pertanyaan ini saat ini menjadi hit Google teratas untuk 'tsql alter nvarchar length' dan dengan demikian orang-orang (seperti saya) yang hanya ingin diingatkan bagaimana mengubah panjang kolom melihat jawaban ini dan naik -vote untuk mengatakan "terima kasih" tanpa melihat (karena saya tidak sampai membaca komentar Anda) bahwa pertanyaannya lebih halus daripada yang disarankan judul pertanyaan.
dumbledad
6

Jika ada yang ingin "Meningkatkan lebar kolom dari tabel yang direplikasi" di SQL Server 2008, maka tidak perlu mengubah properti " replicate_ddl=1". Cukup ikuti langkah-langkah di bawah ini -

  1. Buka SSMS
  2. Hubungkan ke basis data Penerbit
  3. jalankan perintah - ALTER TABLE [Table_Name] ALTER COLUMN [Column_Name] varchar(22)
  4. Ini akan menambah lebar kolom dari varchar(x)ke varchar(22)dan perubahan yang sama dapat Anda lihat pada pelanggan (transaksi direplikasi). Jadi tidak perlu menginisialisasi ulang replikasi

Semoga ini bisa membantu semua yang mencarinya.

Devshish
sumber
5

Lihat tautan ini

Ubah Ukuran atau Ubah Kolom Tabel MS SQL Server dengan Batasan Default menggunakan Perintah T-SQL

solusi untuk masalah SQL Server akan menjadi

Menjatuhkan atau menonaktifkan DEFAULT Constraint pada kolom tabel.

Memodifikasi tipe data kolom tabel dan / atau ukuran data.

Menciptakan kembali atau mengaktifkan kembali kendala default pada kolom tabel sql.

Sampai jumpa

RRUZ
sumber
dan pandangan mengikat skema harus dijatuhkan dan dibuat kembali.
nurettin
2

di sini adalah apa yang berfungsi dengan versi program yang saya gunakan: dapat bekerja untuk Anda juga.

Saya hanya akan menempatkan instruksi dan perintah yang melakukannya. kelas adalah nama tabel. Anda mengubahnya dalam tabel sendiri dengan metode ini. bukan hanya pengembalian pada proses pencarian.


lihat kelas tabel

select * from class

ubah panjang kolom FacID (terlihat sebagai "faci") dan classnumber (dilihat sebagai "classnu") agar sesuai dengan seluruh label.

alter table class modify facid varchar (5);

alter table class modify classnumber varchar(11);

lihat tabel lagi untuk melihat perbedaannya

select * from class;

(jalankan perintah lagi untuk melihat perbedaannya)


Ini mengubah tabel aktual untuk selamanya, tetapi menjadi lebih baik.

PS Saya membuat instruksi ini sebagai catatan untuk perintah. Ini bukan ujian, tetapi bisa membantu satu :)

Passingn Searcher
sumber
0

Periksa susunan kolom. Script ini mungkin mengubah susunan ke default tabel. Tambahkan susunan saat ini ke skrip.

pengguna3103989
sumber