ปล่อยข้อ จำกัด (ดัชนี) บนคอลัมน์


12

ฉันจะแก้ไขประเภทในตารางที่มีดัชนีอยู่ได้อย่างไร ฉันพยายามที่จะแก้ไขคอลัมน์ในตารางว่างเปล่าเพื่อแก้ไขประเภทจากวันที่เป็น varchar (15) และมีข้อผิดพลาดที่บอกว่ามีการพึ่งพาคอลัมน์ (ซึ่งกลายเป็นดัชนี)

ฉันสามารถไปที่จุดนี้ได้อย่างง่ายดายด้วยการคลิกขวาที่ดัชนีและวางสคริปต์ แต่ฉันจำเป็นต้องทำสิ่งนี้บนเซิร์ฟเวอร์อื่น ๆ ที่ฉันจะไม่สามารถเข้าถึงชื่อดัชนีได้

มีวิธีที่ฉันสามารถสร้างสคริปต์ที่จะวางดัชนีใด ๆ ให้ฉันทำประเภทข้อมูลที่เปลี่ยนแปลงในคอลัมน์แล้วอ่านดัชนีหรือไม่ ขอบคุณ!

คำตอบ:


7

คุณสามารถใช้มุมมอง sys.indexes เพื่อรับดัชนี คุณสามารถเข้าร่วมตารางนี้เพื่อ sys.tables, sys.columns และ sys.index_column เพื่อรับข้อมูลเพื่อสร้างดัชนีการปล่อยแบบไดนามิก คุณสามารถใช้ตัวเลือกแบบง่ายนี้เพื่อสร้างดัชนีการปล่อยของคุณ คุณสามารถใช้ส่วนคำสั่ง where เพื่อกรองตารางและคอลัมน์ หากคุณต้องการเปลี่ยน Table1.Column1 คุณต้องใช้ชื่อเหล่านั้นเพื่อกรองการเลือกเพื่อให้ได้คำสั่งลบที่ถูกต้อง

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

หวังว่านี่จะช่วยคุณได้


3
เมื่อเข้าร่วมคุณจะต้องเพิ่มงบการเข้าร่วมด้วย idx.object_id = idxCol.object_id & idxCol.object_id = col.object_id และไม่จำเป็นต้องจัดกลุ่ม
แบ็กซ์

2

ในการแก้ไขคอลัมน์ใด ๆ อันดับแรกคุณต้องวางดัชนีหรือข้อ จำกัด อื่น ๆ ที่มีคอลัมน์นั้นและหลังจากสร้างดัชนี / ข้อ จำกัด อีกครั้ง แต่งานนี้จะต้องทำโดย DBA เพราะการลดลงของดัชนีหรือข้อ จำกัด ใด ๆ ที่จะมีผลต่อข้อมูลที่ถูกสอบถาม - ในขณะที่ดัชนีถูกทิ้งและในทางกลับกันทำให้เกิดการอุดตันบนตารางทั้งหมดในเวลาที่ดัชนีนั้น สร้าง คุณต้องแน่ใจว่าผู้ใช้จะรับรู้ถึงการบำรุงรักษาเล็กน้อยหรือใหญ่ (ขึ้นอยู่กับขนาดของตาราง) โชคดี!

อย่างไรก็ตามการสร้างดัชนีสามารถทำได้ด้วยตัวเลือกออนไลน์ที่มีการปิดกั้นน้อยกว่า


0

หากคุณวางดัชนีก่อนคุณจะไม่สามารถอ่านได้อีกเว้นแต่จะมีการสร้างดัชนีใหม่ คุณสามารถทำอะไรเพื่อปิดการบังคับใช้ข้อ จำกัด

ALTER TABLE name_of_the_table NOCHECK CONSTRAINT name_of_the_constraint;

หลังจากรันสคริปต์นี้ข้อ จำกัด จะไม่ถูกบังคับใช้และคุณสามารถป้อนข้อมูลโดยไม่ต้องกังวลเกี่ยวกับการตรวจสอบข้อ จำกัด คุณสามารถเปลี่ยนตารางอีกครั้งเพื่อเปิดใช้งานข้อ จำกัด อีกครั้ง

ALTER TABLE name_of_the_table CHECK CONSTRAINT name_of_the_constraint;

การละเมิดก่อนหน้านี้จะไม่ถูกตรวจสอบหรือแก้ไข แต่รายการใด ๆ หลังจากข้อ จำกัด ได้รับการบังคับใช้จะถูกตรวจสอบ


-2

คำตอบของ Niko มีข้อผิดพลาด 2 ข้อ (ไม่มีเงื่อนไข object_id 2 ข้อ) และไม่จำเป็นต้อง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
โปรดดูทำไมฉันจึงควรลงทะเบียนบัญชีของฉัน ในคำถามที่พบบ่อยสแต็คแลกเปลี่ยน
พอลไวท์ 9
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.