Thay đổi kích thước của cột được tham chiếu bởi khung nhìn ràng buộc lược đồ trong SQL Server


124

Tôi đang cố gắng thay đổi kích thước của một cột trong máy chủ sql bằng cách sử dụng:

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

trong đó chiều dài Addr1ban đầu 40.

Nó thất bại, gây ra lỗi này:

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

Tôi đã cố gắng đọc nó và có vẻ như vì một số chế độ xem đang tham chiếu cột này và có vẻ như SQL Server thực sự đang cố gắng bỏ cột gây ra lỗi.

Address_e là một khung nhìn được tạo bởi Quản trị viên DB trước đó.

Có cách nào khác để tôi có thể thay đổi kích thước của cột không?


2
Địa chỉ_e là dạng xem được tạo bởi Quản trị viên DB trước đó. Và giống như những gì Remus đã đề cập, nó đã được xác định SCHEMABINDING.
Staelen

Câu trả lời:


58

Các khung nhìn có thể được tạo bằng cách sử dụng tùy chọn VỚI SCHEMABINDING và điều này có nghĩa là chúng được nối dây rõ ràng để ngăn chặn những thay đổi đó. Có vẻ như các mưu đồ đã làm việc và ngăn bạn phá vỡ những quan điểm đó, ngày may mắn, heh? Liên hệ với quản trị viên cơ sở dữ liệu của bạn và yêu cầu anh ta thực hiện thay đổi, sau khi xác nhận tác động lên cơ sở dữ liệu.

Từ MSDN :

GIÁO DỤC

Liên kết khung nhìn vào lược đồ của bảng hoặc bảng bên dưới. Khi SCHEMABINDING được chỉ định, bảng cơ sở hoặc bảng có thể được sửa đổi theo cách có thể ảnh hưởng đến định nghĩa khung nhìn. Bản thân định nghĩa khung nhìn trước tiên phải được sửa đổi hoặc loại bỏ để loại bỏ các phụ thuộc trên bảng cần sửa đổi.


1
cảm ơn Remus, khung nhìn không có SCHEMABINDING được xác định. Có cách nào dễ dàng bỏ qua các ràng buộc hay tôi thực sự cần phải loại bỏ các khung nhìn để làm cho nó hoạt động?
Staelen

1
Bạn không thể bỏ qua nó, đó là toàn bộ mục đích của nó. Ai đó đã đi thêm chiều dài để thêm schemabindig để ngăn thay đổi bảng. Đây không phải là một tai nạn, có vẻ như người đó biết những gì đang làm. Bạn có chắc chắn muốn thay đổi bảng?
Remus Rusanu

1
vâng, tôi chắc chắn =) và theo logic (mặc dù tôi biết nó không hoạt động theo cách đó) tôi đang tăng chiều dài của cột, điều này thực sự sẽ ổn chỉ khi cột không bị rơi và được tạo lại, nhưng tiếc là nó không như vậy ... nhưng cảm ơn sự giúp đỡ của bạn! = D
Staelen

2
Tôi đang gặp vấn đề tương tự và thật không may, chúng tôi đang sử dụng các chế độ xem SCHEMABINDING để lập chỉ mục các chế độ xem. Vì vậy, trong trường hợp của tôi, tôi không sử dụng SCHEMABINDING để chặn rõ ràng các thay đổi đối với các bảng bên dưới mà chỉ để tuân thủ các yêu cầu của SQL Server đối với các khung nhìn được lập chỉ mục. Tôi cũng muốn bỏ qua điều này mà không bỏ qua và tái tạo quan điểm của tôi.
jpierson

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

11
không, vấn đề giống như những gì Remus đã đề cập. không có gì sai với chính mã
Staelen

11
@NilRad Ummm, có lẽ bạn đang nghĩ về PL-SQL? ALTER COLUMN là cú pháp đúng trên SQL 2008 R2
schmidlop

4
Tui bỏ lỡ điều gì vậy? Tại sao rất nhiều upvote? Nó không trả lời câu hỏi.
Andy Wiesendanger

13
Số lượt bình chọn có thể là do câu hỏi này hiện đang là lượt truy cập hàng đầu của Google cho 'tsql thay đổi độ dài nvarchar' và do đó, những người (như tôi), những người chỉ muốn được nhắc nhở cách thay đổi độ dài của cột, hãy xem câu trả lời này và lên -Chú ý nói "cảm ơn" mà không phát hiện ra (như tôi đã không đọc cho đến khi đọc bình luận của bạn) rằng câu hỏi này tinh tế hơn tiêu đề của câu hỏi gợi ý.
dumbledad 17/08/2015

6

Nếu bất cứ ai muốn "Tăng độ rộng cột của bảng được sao chép" trong SQL Server 2008, thì không cần thay đổi thuộc tính của " replicate_ddl=1". Chỉ cần làm theo các bước dưới đây -

  1. Mở SSMS
  2. Kết nối với cơ sở dữ liệu nhà xuất bản
  3. chạy lệnh - ALTER TABLE [Table_Name] ALTER COLUMN [Column_Name] varchar(22)
  4. Nó sẽ tăng chiều rộng cột từ varchar(x)đến varchar(22)và thay đổi tương tự bạn có thể thấy trên thuê bao (giao dịch đã được sao chép). Vì vậy, không cần phải khởi tạo lại bản sao

Hy vọng điều này sẽ giúp tất cả những người đang tìm kiếm nó.


5

Xem liên kết này

Thay đổi kích thước hoặc sửa đổi Cột bảng MS SQL Server với ràng buộc mặc định bằng cách sử dụng các lệnh T-SQL

giải pháp cho vấn đề SQL Server như vậy sẽ xảy ra

Thả hoặc vô hiệu hóa ràng buộc DEFAULT trên cột bảng.

Sửa đổi kiểu dữ liệu cột bảng và / hoặc kích thước dữ liệu.

Tạo lại hoặc cho phép ràng buộc mặc định trở lại trên cột bảng sql.

Tạm biệt


và các khung nhìn ràng buộc lược đồ cần được loại bỏ và tạo lại.
Nurettin

2

đây là những gì hoạt động với phiên bản của chương trình mà tôi đang sử dụng: cũng có thể phù hợp với bạn.

Tôi sẽ chỉ đặt hướng dẫn và lệnh mà làm điều đó. lớp là tên của bảng bạn tự thay đổi nó trong bảng bằng phương pháp này. không chỉ là sự trở lại trong quá trình tìm kiếm.


xem lớp bảng

select * from class

thay đổi độ dài của các cột FacID (được xem là "faci") và số lớp (được xem là "classnu") để phù hợp với toàn bộ nhãn.

alter table class modify facid varchar (5);

alter table class modify classnumber varchar(11);

xem bảng một lần nữa để thấy sự khác biệt

select * from class;

(chạy lại lệnh để thấy sự khác biệt)


Điều này thay đổi bảng thực tế cho tốt, nhưng tốt hơn.

PS Tôi đã thực hiện các hướng dẫn này như là một ghi chú cho các lệnh. Đây không phải là một bài kiểm tra, nhưng có thể giúp một người :)


0

Kiểm tra đối chiếu cột. Kịch bản lệnh này có thể thay đổi đối chiếu thành bảng mặc định. Thêm đối chiếu hiện tại vào kịch bản.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.