SQL Server 2000 здесь.
Я пытаюсь быть временным администратором, но не очень разбираюсь в механике сервера баз данных, поэтому я немного застрял. Есть клиентский процесс, который одновременно обрабатывает три представления. Эти три представления запрашивают удаленный сервер для получения данных.
Похоже, что один из этих запросов будет работать, но два других не будут выполнены (клиентский процесс сообщает, что время ожидания истекло, поэтому я предполагаю, что блокировка может это сделать) Процесс запроса имеет блокировку, которая сохраняется до тех пор, пока процесс SQL не будет перезапущен (я получил смелость и попытался убить spid один раз, но он не отпустил). Любые запросы к этой базе данных после зависания блокировки и обвинение первого процесса в ее блокировке.
Процесс сообщает об этих блокировках ... (извиняюсь за форматирование, функция предварительного просмотра показывает его полностью выровненным).
spid dbid ObjId IndId Type Resource Mode Status
53 17 0 0 DB S GRANT
53 17 1445580188 0 TAB Sch-S GRANT
53 17 1445580188 0 TAB [COMPILE] X GRANT
Я не могу анализировать это слишком хорошо. Объект 1445580188 является sp_bindefault, системной хранимой процедурой в master. Для чего он держится в эксклюзивном замке?
Просмотр кода, чтобы защитить частную собственность ... Я только изменил имена (они оставались согласованными с псевдонимами и так далее) и попытался сохранить все остальное точно таким же.
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER OFF
GO
ALTER view [dbo].[theView]
as
select
a.[column1] column_1
,b.[column2] column_2
,[column3]
,[column4]
,[column5]
,[column6]
,[column7]
,[column8]
,[column9]
,[column10]
,p.[column11]
,p.[column12]
FROM
[remoteServer].db1.dbo.[tableP] p
join [remoteServer].db2.dbo.tableA a on p.id2 = a.id
join [remoteServer].db2.dbo.tableB b on p.id = b.p_id
WHERE
isnumeric(b.code) = 1
GO
SET ANSI_NULLS OFF
GO
SET QUOTED_IDENTIFIER ON
GO