Sql-Server

為什麼刪除的索引仍然存在,它會阻止表被更改嗎?

  • October 22, 2020

我有一列(名為RequestDate),我需要將其從 更改NULLNOT NULL,但該列上有一個聚集索引,因此我首先需要刪除該索引。

最初,索引是使用以下方法創建的:

CREATE CLUSTERED INDEX IX_RequestDate   
   ON [MyDB].[dbo].[MyTable] (RequestDate); 

為了放棄它,我執行了:

Drop Index IX_RequestDate On [MyDB].[dbo].[MyTable]

然後嘗試使用以下方法更改列無效性:

ALTER TABLE [MyDB].[dbo].[MyTable] ALTER COLUMN [RequestDate] DATETIME NOT NULL

但出現錯誤:

對象“MyTable”依賴於列“RequestDate”。

MyTable然後我使用這個查詢列出了 的索引,並且索引仍然存在,儘管現在它沒有名稱並且它的類型是HEAP(最初CLUSTERED):

TableName   IndexName   IndexType   ColumnOrdinal   ColumnName     ColumnType
MyTable        NULL       HEAP         0            RequestDate     datetime

我有兩個問題:

  1. 為什麼刪除的索引仍然存在?
  2. 由於這個仍然存在的索引,我是否得到了上面的依賴錯誤?

如果是這樣,我該如何刪除它?

如果沒有,還有什麼我應該檢查的嗎?我想避免丟桌子。

請注意,此表沒有任何限制。

我正在使用 SQL Server 2014、OS Windows Server 2012 R2,以下是SCRIPT TABLE AS -> CREATE TO(我更改了一些列名)的輸出:

CREATE TABLE [dbo].[MyTable](
   [RequestDate] [datetime] NULL,
   [UserName] [nvarchar](50) NULL,
   [HostName] [nvarchar](20) NULL,
   [RequestContent] [ntext] NULL,
   [ResponseContent] [ntext] NULL,
   [RequestStatus] [int] NULL,
   [ErrorMessage] [ntext] NULL,
   [Duration] [float] NULL,
   [ServiceName] [nvarchar](100) NULL,
   [Direction] [int] NULL,
   [RequestId] [uniqueidentifier] NOT NULL,
   [IsRetry] [bit] NULL,
   [CallerId] [nvarchar](100) NULL
)
  1. 為什麼刪除的索引仍然存在?

事實上,索引不再存在,列仍然存在,曾經的聚集索引現在變成了

  1. 由於這個仍然存在的索引,我是否得到了上面的依賴錯誤?

不,因為索引不再存在。

如果沒有,還有什麼我應該檢查的嗎?我想避免丟桌子。

您可以按照Erik Darling的建議查看表的依賴關係


正如您在評論中提到的,您使用此方法找到了一個 VIEW,如果您檢查CREATE VIEW文件,您將看到選項 SCHEMABINDING 可能導致您提到的錯誤:

SCHEMABINDING
將視圖綁定到基礎表的架構。指定 SCHEMABINDING 時,不能以會影響視圖定義的方式修改一個或多個基表。必須首先修改或刪除視圖定義本身,以刪除對要修改的表的依賴關係。

$$ … $$

引用自:https://dba.stackexchange.com/questions/278504