Hey*_*ude 5 index sql-server alter-table dependencies
我有一个列(名为RequestDate),我需要将其从 更改NULL为NOT 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)
我有两个问题:
请注意,此表没有任何限制。
我使用的是 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)
- 为什么下降的索引还在?
事实上,该索引不再存在,该列仍然存在,曾经的聚集索引现在是一个Heap。
- 由于这个仍然存在的索引,我是否得到了上面的依赖错误?
不,因为索引不再存在。
如果没有,还有什么我应该检查的吗?我想避免丢掉桌子。
您可以按照Erik Darling 的建议查看表的依赖关系。
正如您在评论中提到的,您使用此方法找到了一个 VIEW,如果您检查CREATE VIEW文档,您将看到选项 SCHEMABINDING 可能导致您提到的错误:
SCHEMABINDING
将视图绑定到一个或多个基础表的架构。当指定了 SCHEMABINDING 时,不能以影响视图定义的方式修改一个或多个基表。必须首先修改或删除视图定义本身以移除对要修改的表的依赖关系。[...]
| 归档时间: |
|
| 查看次数: |
87 次 |
| 最近记录: |