2010-06-21 19 views
5

Tôi chắc chắn đây có thể là truy vấn khá phổ biến nhưng không thể tìm thấy câu trả lời hay như hiện tại.SQL, Làm thế nào để thay đổi cột trong bảng SQL mà không vi phạm các phụ thuộc khác?

Đây là câu hỏi của tôi:

Tôi đã có một bảng tên Liên hệ với cột VARCHAR Tiêu đề. Bây giờ ở giữa phát triển, tôi muốn thay thế trường Tiêu đề với TitleID là khóa ngoài tới ContactTitles bảng. Tại thời điểm này, bảng Liên hệ có hơn 60 phụ thuộc (các bảng khác, chức năng chế độ xem).

Tôi làm cách nào an toàn nhất và dễ dàng nhất?

Chúng tôi sử dụng: MSSQL 2005, dữ liệu đã được di chuyển, chỉ muốn thay đổi giản đồ.

Edit:

Nhờ Tất cả cho phát lại nhanh chóng.

Giống như nó đã được đề cập Liên hệ bảng có hơn 60 người phụ thuộc, nhưng khi truy vấn sau đây được chạy, chỉ có 5 trong số họ sử dụng Tiêu đề cột. Tập lệnh di chuyển đã được chạy, do đó không yêu cầu thay đổi dữ liệu.

/*gets all objects which use specified column */

SELECT Name FROM syscomments sc JOIN sysobjects so ON sc.id = so.id WHERE TEXT LIKE '%Title%' AND TEXT LIKE '%TitleID%'

Sau đó, tôi đã trải qua những 5 điểm và cập nhật chúng bằng tay.

+0

Bạn cần phải cẩn thận một chút trong SQL2005 với điều đó. Nếu bất kỳ định nghĩa nào là> 4000 ký tự, chúng có thể được chia thành 2 hàng truy vấn trong bài viết của tôi là an toàn hơn (hoặc sử dụng sys.sql_modules sẽ được ưa thích hơn). Tôi giả sử bạn không bao giờ sử dụng '*' mà có thể mess điều lên cũng? –

+0

@ Martin Smith bạn đúng, nhưng tôi đã nhiều hơn sau những nơi mà các cột được sử dụng. – cinek

+0

ý tôi là có một cơ hội nhỏ mà định nghĩa được chia theo cách mà một hàng kết thúc '... Tit' và hàng tương ứng tiếp theo bắt đầu' le ... 'để truy vấn LIKE sẽ bỏ lỡ nó. –

Trả lời

1

Đối với Microsoft SQL Server Redgate có một (không miễn phí) Sản phẩm có thể giúp với điều này refactoring http://www.red-gate.com/products/sql_refactor/index.htm

Trong quá khứ tôi đã quản lý để thực hiện điều này khá dễ dàng (nếu primitively) bằng cách đơn giản nhận được một danh sách những thứ để xem xét

SELECT * FROM sys.objects 
WHERE OBJECT_DEFINITION(OBJECT_ID) LIKE '%Contacts%' 

(và có thể tham gia phụ thuộc thông tin vào tài khoản và lọc theo loại đối tượng)

Scripting tất cả những người quan tâm trong Management Studio sau đó chỉ cần đi xuống trong danh sách và tái xem tất cả và thay đổi CREATE thành ALTER. Nó phải là một thay đổi khá đơn giản và lặp đi lặp lại ngay cả đối với 60 phụ thuộc có thể. Ngoài ra nếu bạn đang đề cập đến một cột không tồn tại, bạn sẽ nhận được một thông báo lỗi khi bạn chạy kịch bản để ALTER.

Nếu bạn sử dụng * trong truy vấn hoặc adhoc SQL trong ứng dụng của mình, rõ ràng mọi thứ có thể khó hơn một chút.

+0

câu trả lời này là chính xác nhất đối với tôi. – cinek

3

Sử dụng phương pháp refactoring. Bắt đầu bằng cách tạo một trường mới có tên là TitleID, sau đó sao chép tất cả các tiêu đề vào bảng ContactTitles. Sau đó, từng cái một, cập nhật từng phần phụ thuộc để sử dụng trường TitleID. Chỉ cần đảm bảo bạn vẫn có một hệ thống làm việc sau mỗi bước.

Nếu dữ liệu sẽ thay đổi, bạn sẽ phải cẩn thận và đảm bảo rằng mọi thay đổi đối với cột Title cũng thay đổi bảng ContactTitles. Bạn sẽ chỉ phải giữ chúng trong đồng bộ trong khi bạn đang làm việc tái cấu trúc.

Chỉnh sửa: Thậm chí còn có sách về nó! Refactoring Databases.

2

Vì những người khác đã chỉ ra điều đó phụ thuộc vào RDBMS của bạn.

Có hai phương pháp:

  • thực hiện thay đổi để bàn và sửa chữa tất cả phụ thuộc
  • làm cho một cái nhìn mà bạn có thể sử dụng thay vì truy cập trực tiếp để bàn (điều này có thể bảo vệ bạn chống lại những thay đổi trong tương lai trong bảng lõi nằm bên dưới (s), nhưng bạn có thể mất một số chức năng cập nhật, tùy thuộc vào DBMS của bạn)
0

Sử dụng SP_Depend 'bảng Tên' để kiểm tra Dependencies của bảng và sau đó sử dụng các sp_rename để Đổi tên Colum n Tên rất hữu ích. sp_rename tự động đổi tên chỉ mục liên quan bất cứ khi nào một ràng buộc PRIMARY KEY hoặc UNIQUE được đổi tên. Nếu một chỉ mục được đổi tên được gắn với một ràng buộc PRIMARY KEY, ràng buộc PRIMARY KEY cũng được tự động đổi tên bởi sp_rename.

và sau đó bắt đầu Cập nhật thủ tục và chức năng từng người một không có lựa chọn tốt khác để thay đổi như thế này nếu bạn tìm thấy sau đó cho tôi biết quá.

+0

Tôi sẽ không tin tưởng thông tin phụ thuộc trừ khi bạn đã chạy sp_refreshsqlmodule trên tất cả các đối tượng. Điều này có thể sai khi phụ thuộc được tạo ra theo thứ tự. –

+0

Khi u bắt đầu Sql thì tất cả làm mới tự động. là tôi đúng hay sai? do đó không có vấn đề gì để kiểm tra Dependencies. – KuldipMCA

+0

Khá chắc chắn điều đó không đúng nhưng cảm thấy tự do để chứng minh cho tôi sai! –

Các vấn đề liên quan