本番データベースにいくつかの列を作成しましたが、ここで削除する必要があります。しかし、これは不可能に思われ、その理由はわかりません。開発データベースの列を問題なく削除しました。本番環境でテーブルを作成して削除しました。しかし、この1つの列を削除しようとすると、エラーが発生します。私はManagement Studio(すぐに失敗します)とT-SQL(時間がかかりますが、まだ失敗します)を使用しました。
ALTER TABLE VEN DROP COLUMN RI_VEN_Approved
何が起こっているのですか?
ここにあるクエリを使用してロックをチェックしました: https://stackoverflow.com/questions/1511675/how-to-check-if-a-table-is-locked-in-sql-server
このクエリを具体的に使用すると:
SELECT resource_type, resource_associated_entity_id,
request_status, request_mode,request_session_id,
resource_description, o.object_id, o.name, o.type_desc
FROM sys.dm_tran_locks l, sys.objects o
WHERE l.resource_associated_entity_id = o.object_id
and resource_database_id = DB_ID()
テーブルは結果に表示されませんでした。
私は走ったsp_who2
およびBlkBy
列には何も表示されませんでした。
T-SQLを使用してテーブルを削除すると、クエリはタイムアウトせず、ブロックされます。このクエリウィンドウのspidを書き留めます(SSMSの下部、ユーザー名のすぐ隣に表示されているはずです)。これが「実行中」の段階になったら、別のクエリウィンドウを開いてこれを行います。
_use master
go
select * from sysprocesses where spid = <spid of the query which is dropping the table\column>
_
ブロックされた列を見て、spid番号を書き留めます。次のクエリは、spidの所有者を確認します(これにより、このテーブルで競合するロックを所有しているユーザーがわかります)。
_select * from sysprocesses where spid = <spid # from above blocked column>
_
これを特定したら、dbcc inputbuffer(spid)
を使用して、このテーブルをロックしているクエリ/コマンドが実行していることを確認できます。そのクエリが重要ではないと思われる場合は、_kill <spidnumber>.
_を使用してそれを強制終了できます。この後、ドロップテーブル/列のクエリが完了するはずです。
更新:列_ALTER TABLE table_name DROP COLUMN column_name;
_を削除してみてください