열에서 제약 조건 (인덱스) 삭제


12

인덱스가있는 테이블에서 유형을 수정하려면 어떻게해야합니까? 날짜 테이블에서 varchar (15)로 유형을 수정하기 위해 빈 테이블에서 alter column을 시도했지만 열에 대한 종속성이 있다는 오류가 발생했습니다 (색인으로 나타남).

인덱스를 마우스 오른쪽 버튼으로 클릭하고 드롭 스크립트를 작성하여 로컬로 쉽게 해결할 수 있었지만 인덱스 이름에 액세스 할 수없는 다른 서버에서 롤아웃해야합니다.

색인을 삭제하는 스크립트를 만들 수있는 방법이 있습니까? 열에서 해당 데이터 유형을 변경 한 다음 색인을 읽으십시오. 감사!

답변:


7

sys.indexes 뷰를 사용하여 인덱스를 얻을 수 있습니다. 이 테이블을 sys.tables, sys.columns 및 sys.index_column에 조인하여 동적 삭제 색인을 작성하기위한 정보를 얻을 수 있습니다. 이 간단한 선택을 사용하여 하락 지수를 생성 할 수 있습니다. where 절을 사용하여 테이블과 열을 필터링 할 수 있습니다. Table1.Column1을 변경하려면 해당 이름을 사용하여 올바른 delete 문을 가져 오도록 select를 필터링해야합니다.

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를 사용하여 결합 문을 보강해야하며 그룹화 할 필요가 없습니다.
Bax

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 가지 실수가 있습니다 (2 개의 object_id 조건이 없음). 그리고 필요가 없습니다 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
왜 계정을 등록해야합니까?를 참조하십시오 . 스택 교환 FAQ에서.
Paul White 9
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.