Sql-Server

如何刪除記憶體優化表?

  • September 25, 2018

執行 SQL Server Standard 2016 SP2-CU1。我不關心 In memory Filegroup,但我必須能夠刪除表對象?或者可能重命名它們?

跑步:

DROP TABLE [REF].[Work_xxyyzz]

給出:

消息 12332,級別 16,狀態 111,第 1 行

DDL 語句 CREATE、ALTER 和 DROP 上的數據庫和伺服器觸發器不受記憶體優化表的支持。

我的記憶體表中沒有使用者觸發器或事件。5 個帶有主鍵的簡單表。

沒有對這些表的依賴或引用。它們就像臨時表,我們將它們命名為Work_xxxyyzz表。但是,它們確實屬於數據庫模式。

我現在可以保留文件組。我想刪除這些表以創建同名的預設對象。

除了Evan 的回答中指出的限制之外,還有許多其他的事情可以防止刪除表。它們中的大多數類似於對基於磁碟的普通表的限制,您應該會在錯誤消息中看到它們。

例如,如果我有一個由本地編譯(模式綁定)儲存過程引用的記憶體表,如果我刪除該表,我將收到此錯誤:

無法刪除表“YourTable”,因為它被對象“sp_YourStoredProc”引用。

這種情況下的解決方案是先刪除儲存過程,然後刪除表。


您收到的錯誤消息表明存在伺服器或數據庫級別的DDL 觸發器。 您需要禁用或刪除這些觸發器才能刪除記憶體表。您可以通過執行以下查詢找到任何此類觸發器:

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

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

您應該查看這些觸發器在做什麼(也許是審計?)。如果這樣做是安全的,請考慮使用DISABLE TRIGGER語句禁用它們,然後刪除表,然後使用ENABLE TRIGGER重新打開觸發器。

請注意,伺服器和數據庫範圍的 DDL 觸發器與對象級 DML 觸發器不同(您提到您檢查過但沒有)。

只需使用DROP TABLE,有一個警告,

如果該 DDL 操作存在伺服器或數據庫觸發器,則無法創建或刪除記憶體優化表和本機編譯的儲存過程。刪除CREATE/DROP TABLECREATE/上的伺服器和數據庫觸發器DROP PROCEDURE

確保沒有 DDL 事件通知,

如果存在針對該 DDL 操作的伺服器或數據庫事件通知,則無法創建或刪除記憶體優化表和本機編譯的儲存過程。CREATE TABLE刪除orDROP TABLECREATE PROCEDUREor上的伺服器和數據庫事件通知DROP PROCEDURE

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