15

削除したい非クラスター化インデックスがあります (クラスター化インデックスの複製です)。ただし、外部キー制約によって使用されています。インデックスを使用している制約を特定できるようにしたいので、主キー インデックスを使用するように更新できます。

ドロップしようとすると:

DROP INDEX [idx_duplicate] ON [dbo].[MyTable]

エラーが発生します:

明示的な DROP INDEX は、インデックス 'dbo.MyTable.idx_duplicate' では許可されていません。FOREIGN KEY 制約の適用に使用されています。

次のクエリで犯人を見つけようとしましたが、うまくいきませんでした:

SELECT name
FROM sys.foreign_keys
WHERE OBJECT_NAME (referenced_object_id) = 'idx_duplicate'
4

3 に答える 3

20

何かのようなもの

Select
    f.name,
    object_name(f.parent_object_id)
From
    sys.foreign_keys f
        inner join
    sys.indexes i
        on f.referenced_object_id = i.object_id and
           f.key_index_id = i.index_id
Where
    i.name = 'idx_duplicate' and
    i.object_id = object_id('[dbo].[MyTable]')
于 2013-09-09T21:37:38.750 に答える
9

これにより、関連するテーブル、外部キー、および列がわかります。

select f.name
  , parentTable = o.name
  , parentColumn = c.name
  , foreignTable = ofr.name
  , foreignColumn = cfr.name
from sys.foreign_keys f
  inner join sys.foreign_key_columns fc on f.object_id = fc.constraint_object_id
  inner join sys.objects o on fc.parent_object_id = o.object_id
  inner join sys.columns c on fc.parent_column_id = c.column_id
    and o.object_id = c.object_id
  inner join sys.objects ofr on fc.referenced_object_id = ofr.object_id
  inner join sys.columns cfr on fc.referenced_column_id = cfr.column_id
    and ofr.object_id = cfr.object_id
  inner join sys.indexes i on ofr.object_id = i.object_id
where i.name = 'MyIndex'

demo を使用した SQL Fiddle

于 2013-09-09T21:39:51.480 に答える