Thả một ràng buộc (chỉ mục) trên một cột


12

Làm cách nào tôi có thể sửa đổi loại trên bảng có chỉ mục trên đó? Tôi đã cố gắng thực hiện một cột thay đổi trên một bảng trống để sửa đổi loại từ thời gian ngày thành varchar (15) và gặp lỗi nói rằng nó có phụ thuộc vào cột (hóa ra là chỉ mục).

Tôi có thể dễ dàng khắc phục điều này cục bộ bằng cách nhấp chuột phải vào chỉ mục và viết kịch bản, nhưng tôi cần đưa nó ra trên các máy chủ khác nơi tôi sẽ không có quyền truy cập vào tên chỉ mục.

Có cách nào để tôi có thể tạo một tập lệnh sẽ loại bỏ bất kỳ chỉ mục nào không, hãy để tôi thực hiện thay đổi kiểu dữ liệu đó trên cột sau đó đọc chỉ mục? Cảm ơn!

Câu trả lời:


7

Bạn có thể sử dụng chế độ xem sys.indexes để lấy chỉ mục. Bạn có thể tham gia bảng này vào sys.tables, sys.columns và sys.index_column để nhận thông tin để tạo chỉ số thả động. Bạn có thể sử dụng lựa chọn đơn giản này để tạo chỉ số thả của bạn. Bạn có thể sử dụng mệnh đề where để lọc các bảng và các cột. Nếu bạn muốn thay đổi Table1.Column1, bạn phải sử dụng các tên đó để lọc lựa chọn để có được câu lệnh xóa đúng

use [testdb]
go
declare @sqlDropIndex NVARCHAR(1000)

select @sqlDropIndex = 'DROP INDEX ' + idx.name + ' ON ' + tbl.name
from sys.indexes idx inner join 
        sys.tables tbl on idx.object_id = tbl.object_id inner join
        sys.index_columns idxCol on idx.index_id = idxCol.index_id inner join
        sys.columns col on idxCol.column_id = col.column_id
where idx.type <> 0 and
        tbl.name = 'MyTableName' and
        col.name = 'MyColumnName'
group by idx.name, tbl.name
order by idx.name desc

print @sqlDropIndex
--exec sp_executeSql @sqlDropIndex
go

Hy vọng điều này sẽ giúp bạn


3
khi tham gia, bạn phải làm phong phú các câu lệnh nối với idx.object_id = idxCol.object_id & idxCol.object_id = col.object_id và không cần phải nhóm.
Bax

2

Để thay đổi bất kỳ cột nào, trước tiên, bạn phải loại bỏ chỉ mục hoặc bất kỳ ràng buộc nào khác có chứa cột đó và sau khi tạo lại chỉ mục / ràng buộc. Nhưng DBA phải thực hiện nhiệm vụ này bởi vì bất kỳ sự sụt giảm nào về chỉ số hoặc ràng buộc sẽ ảnh hưởng đến một mặt dữ liệu được truy vấn - trong khi chỉ mục bị hủy và mặt khác đặt chặn trên toàn bộ bảng trong thời gian chỉ mục được đặt lại tạo. Bạn cần chắc chắn rằng người dùng sẽ nhận thức được việc bảo trì nhỏ hay lớn này (tùy thuộc vào kích thước bảng). Chúc may mắn!

Tuy nhiên, việc tạo Index có thể được thực hiện với tùy chọn Trực tuyến ít bị chặn hơn.


0

Nếu bạn bỏ chỉ mục trước, bạn sẽ không thể đọc lại từ đó, trừ khi chỉ mục được tạo lại. Những gì bạn có thể làm điều đó để vô hiệu hóa việc thực thi các ràng buộc.

ALTER TABLE name_of_the_table NOCHECK CONSTRAINT name_of_the_constraint;

Sau khi tập lệnh này được chạy, ràng buộc sẽ không được thực thi và bạn có thể nhập dữ liệu mà không phải lo lắng về việc kiểm tra ràng buộc. Bạn có thể thay đổi bảng một lần nữa, để kích hoạt lại các ràng buộc.

ALTER TABLE name_of_the_table CHECK CONSTRAINT name_of_the_constraint;

Bất kỳ vi phạm nào trước đây sẽ không được kiểm tra hoặc sửa chữa, nhưng bất kỳ mục nào sau khi ràng buộc đã được thi hành, sẽ được kiểm tra.


-2

Có 2 lỗi trong câu trả lời của Niko (thiếu 2 điều kiện object_id). Và không cần phải group by:

SELECT  @sql = 'DROP INDEX ' + idx.name + ' ON ' + tbl.name
FROM    sys.indexes             idx 
INNER JOIN sys.tables           tbl     ON idx.object_id = tbl.object_id 
INNER JOIN sys.index_columns    idxCol  ON idx.index_id = idxCol.index_id   AND idx.object_id = idxCol.object_id 
INNER JOIN sys.columns          col     ON idxCol.column_id = col.column_id AND  idxCol.object_id = col.object_id
WHERE   idx.type <> 0 
AND     tbl.name = 'file_transfer_log' 
AND     col.name = 'tender_id';

1
Vui lòng xem tại sao tôi nên đăng ký tài khoản? trong Câu hỏi thường gặp về trao đổi ngăn xếp.
Paul White 9
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.