为什么删除的索引仍然存在,它是否可以防止表被更改?

Hey*_*ude 5 index sql-server alter-table dependencies

我有一个列(名为RequestDate),我需要将其从 更改NULLNOT NULL,但是该列上有一个聚集索引,因此我首先需要删除该索引。

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

CREATE CLUSTERED INDEX IX_RequestDate   
    ON [MyDB].[dbo].[MyTable] (RequestDate); 
Run Code Online (Sandbox Code Playgroud)

为了放弃它,我执行了:

Drop Index IX_RequestDate On [MyDB].[dbo].[MyTable]
Run Code Online (Sandbox Code Playgroud)

然后尝试使用以下方法更改列无效性:

ALTER TABLE [MyDB].[dbo].[MyTable] ALTER COLUMN [RequestDate] DATETIME NOT NULL
Run Code Online (Sandbox Code Playgroud)

但是得到了一个错误:

对象“MyTable”依赖于“RequestDate”列。

然后我MyTable使用这个查询列出了的索引,并且索引仍然存在,尽管现在它没有名称并且它的类型是HEAP(最初CLUSTERED):

TableName   IndexName   IndexType   ColumnOrdinal   ColumnName     ColumnType
MyTable        NULL       HEAP         0            RequestDate     datetime
Run Code Online (Sandbox Code Playgroud)

我有两个问题:

  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
)
Run Code Online (Sandbox Code Playgroud)

Ron*_*ldo 6

  1. 为什么下降的索引还在?

事实上,该索引不再存在,该列仍然存在,曾经的聚集索引现在是一个Heap

  1. 由于这个仍然存在的索引,我是否得到了上面的依赖错误?

不,因为索引不再存在。

如果没有,还有什么我应该检查的吗?我想避免丢掉桌子。

您可以按照Erik Darling 的建议查看表的依赖关系


正如您在评论中提到的,您使用此方法找到了一个 VIEW,如果您检查CREATE VIEW文档,您将看到选项 SCHEMABINDING 可能导致您提到的错误:

SCHEMABINDING
将视图绑定到一个或多个基础表的架构。当指定了 SCHEMABINDING 时,不能以影响视图定义的方式修改一个或多个基表。必须首先修改或删除视图定义本身以移除对要修改的表的依赖关系。[...]