web-dev-qa-db-ja.com

列を削除するときに「ロックリクエストのタイムアウト期間を超えた」原因は何ですか?

本番データベースにいくつかの列を作成しましたが、ここで削除する必要があります。しかし、これは不可能に思われ、その理由はわかりません。開発データベースの列を問題なく削除しました。本番環境でテーブルを作成して削除しました。しかし、この1つの列を削除しようとすると、エラーが発生します。私はManagement Studio(すぐに失敗します)とT-SQL(時間がかかりますが、まだ失敗します)を使用しました。

ALTER TABLE VEN DROP COLUMN RI_VEN_Approved

lock request time out period exceeded

何が起こっているのですか?

ここにあるクエリを使用してロックをチェックしました: 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列には何も表示されませんでした。

1
DropDude

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;_を削除してみてください

このリンクを確認してください: https://social.msdn.Microsoft.com/Forums/sqlserver/en-US/77fc7e09-ed14-481f-89d5-d5e143dab7bd/trying-to-delete-a-table-in- sql-server-management-studio-and-getting-a-strange-error?forum = sqldatabaseengine

3
CR241