web-dev-qa-db-ja.com

メモリ最適化テーブルを削除するにはどうすればよいですか?

SQL Server Standard 2016 SP2-CU1を実行します。メモリ内ファイルグループにはそれほど関心はありませんが、テーブルオブジェクトを削除できなければなりませんか?それとも名前を変更しますか?

ランニング:

DROP TABLE [REF].[Work_xxyyzz]

与える:

メッセージ12332、レベル16、状態111、行1
DDLステートメントのCREATE、ALTER、DROPでのデータベースとサーバーのトリガーは、メモリ最適化テーブルではサポートされていません。

インメモリテーブルにユーザートリガーまたはイベントがありません。主キーを持つ5つの単純なテーブル。

これらのテーブルへの依存関係や参照はありません。それらは一時テーブルのようなものであり、Work_xxxyyzzテーブル。ただし、それらはデータベーススキーマに属しています。

とりあえず、ファイルグループを適切な場所に保持しても問題ありません。同じ名前のデフォルトオブジェクトを作成するために、これらのテーブルを削除したいと思います。

4
Rocko

私の問題を引き起こしていたのは、トランザクションレプリケーションのトリガーでした。

エヴァン・キャロルの答え 見る方向を示し、 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];
1
Rocko

Evan's answer で指摘されている制限に加えて、テーブルのドロップを防ぐことができる他の多くのことが存在します。それらのほとんどは、通常のディスクベースのテーブルの制限と同様であり、エラーメッセージで呼び出されているはずです。

たとえば、ネイティブにコンパイルされた(スキーマにバインドされた)ストアドプロシージャによって参照されるメモリ内テーブルがある場合、テーブルを削除すると次のエラーが発生します。

オブジェクト 'sp_YourStoredProc'によって参照されているため、テーブル 'YourTable'を削除できません。

その場合の解決策は、最初にストアドプロシージャを削除してから、テーブルを削除することです。


表示されるエラーメッセージは、サーバーまたはデータベースレベルDDLトリガーがあることを示しています。これらのトリガーを無効にするか、削除する必要があります。インメモリテーブルを削除します。これらのクエリを実行すると、そのようなトリガーを見つけることができます。

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

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

これらのトリガーが何をしているのかを調査する必要があります(おそらく監査ですか?)。安全な場合は、 DISABLE TRIGGER ステートメントで無効にしてからテーブルを削除し、次に ENABLE TRIGGER を使用してトリガーを元に戻します。オン。

サーバースコープおよびデータベーススコープのDDLトリガーは、オブジェクトレベルのDMLトリガー(確認したが何もない)とは異なることに注意してください。

6
Josh Darnell

DROP TABLEを使用するだけです 1つの注意点 があります

そのDDL操作に対してサーバーまたはデータベースのトリガーがある場合、メモリ最適化テーブルとネイティブにコンパイルされたストアドプロシージャは作成または削除できません。 CREATE/DROP TABLEおよびCREATE/DROP PROCEDUREのサーバーとデータベースのトリガーを削除します。

DDLイベント通知がないことを確認します。

そのDDL操作に関するサーバーまたはデータベースのイベント通知がある場合、メモリ最適化テーブルとネイティブにコンパイルされたストアドプロシージャは作成または削除できません。 CREATE TABLEまたはDROP TABLEおよびCREATE PROCEDUREまたはDROP PROCEDUREのサーバーおよびデータベースイベント通知を削除します。

3
Evan Carroll