SQL Server Standard 2016 SP2-CU1を実行します。メモリ内ファイルグループにはそれほど関心はありませんが、テーブルオブジェクトを削除できなければなりませんか?それとも名前を変更しますか?
ランニング:
DROP TABLE [REF].[Work_xxyyzz]
与える:
メッセージ12332、レベル16、状態111、行1
DDLステートメントのCREATE、ALTER、DROPでのデータベースとサーバーのトリガーは、メモリ最適化テーブルではサポートされていません。
インメモリテーブルにユーザートリガーまたはイベントがありません。主キーを持つ5つの単純なテーブル。
これらのテーブルへの依存関係や参照はありません。それらは一時テーブルのようなものであり、Work_xxxyyzz
テーブル。ただし、それらはデータベーススキーマに属しています。
とりあえず、ファイルグループを適切な場所に保持しても問題ありません。同じ名前のデフォルトオブジェクトを作成するために、これらのテーブルを削除したいと思います。
私の問題を引き起こしていたのは、トランザクションレプリケーションのトリガーでした。
エヴァン・キャロルの答え 見る方向を示し、 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];
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トリガー(確認したが何もない)とは異なることに注意してください。
DROP TABLE
を使用するだけです 1つの注意点 があります
そのDDL操作に対してサーバーまたはデータベースのトリガーがある場合、メモリ最適化テーブルとネイティブにコンパイルされたストアドプロシージャは作成または削除できません。
CREATE
/DROP TABLE
およびCREATE
/DROP PROCEDURE
のサーバーとデータベースのトリガーを削除します。
DDLイベント通知がないことを確認します。
そのDDL操作に関するサーバーまたはデータベースのイベント通知がある場合、メモリ最適化テーブルとネイティブにコンパイルされたストアドプロシージャは作成または削除できません。
CREATE TABLE
またはDROP TABLE
およびCREATE PROCEDURE
またはDROP PROCEDURE
のサーバーおよびデータベースイベント通知を削除します。