如何删除内存优化表?

Roc*_*cko 4 sql-server memory-optimized-tables drop-table sql-server-2016

运行 SQL Server Standard 2016 SP2-CU1。我不太关心内存文件组,但我必须能够删除表对象?或者可能重命名它们?

跑步:

DROP TABLE [REF].[Work_xxyyzz]
Run Code Online (Sandbox Code Playgroud)

给出:

消息 12332,级别 16,状态 111,第 1 行
内存优化表不支持 DDL 语句 CREATE、ALTER 和 DROP 上的数据库和服务器触发器。

我的内存表上没有用户触发器或事件。5 个带主键的简单表。

这些表没有依赖关系或引用。它们就像临时表,我们将它们命名为Work_xxxyyzz表。但是,它们确实属于数据库模式。

我可以暂时保留文件组。我想删除这些表以创建同名的默认对象。

Jos*_*ell 6

除了Evan's answer 中指出的限制之外,还有许多其他事情可以防止删除表。它们中的大多数类似于对普通基于磁盘的表的限制,您应该会在错误消息中看到它们。

例如,如果我有一个由本机编译(模式绑定)存储过程引用的内存表,如果我删除该表,我将收到此错误:

无法删除表“YourTable”,因为它正被对象“sp_YourStoredProc”引用。

这种情况下的解决方案是先删除存储的过程,然后再删除表。


您收到的错误消息表明存在服务器或数据库级DDL 触发器。 您需要禁用或删除这些触发器才能删除内存表。您可以通过运行以下查询找到任何此类触发器:

USE [master];
GO
SELECT * FROM sys.server_triggers;

USE [YourDatabaseName];
GO
SELECT * FROM sys.triggers;
Run Code Online (Sandbox Code Playgroud)

您应该查看这些触发器在做什么(也许是审计?)。如果这样做是安全的,请考虑使用DISABLE TRIGGER语句禁用它们,然后删除您的表,然后使用ENABLE TRIGGER重新打开触发器。

请注意,服务器范围和数据库范围的 DDL 触发器与对象级 DML 触发器(您提到您检查过但没有)不同。


Roc*_*cko 4

这是一个事务复制触发器导致了我的问题。

Evan Carroll 的答案提供了查看的方向,jadarnel27 的答案提供了语法,它们都帮助我将 DDL 触发器作为根本原因。我需要在正确的数据库上下文中执行。

回答:

USE [userdb]
GO
SELECT * FROM sys.triggers;

tr_MStran_droptable 18203215    0   DATABASE    0   TR  SQL_TRIGGER 2018-07-19 16:14:05.537 2018-09-21 10:32:34.580 1   1   0   0
....

DISABLE TRIGGER tr_MStran_droptable ON DATABASE;

DROP TABLE [REF].[Work_xxyyzz];
Run Code Online (Sandbox Code Playgroud)