В соответствии с вот этой вот статьей: https://its.1c.ru/db/metod8dev/content/5837/hdoc начиная с версии платформы 8.3.22 1С снимает стандартные блокировки БД на уровне страниц. Вообще снимает.
Поэтому любые попытки обслужить базы - реиндексации и дефрагментации - в БД средствами SQL вызывают ошибки - "невозможно ... поскольку отключена блокировка на уровне страницы" Дефрагментация индексов и реиндексация баз при этом являются требованием при обслуживании баз 1с (на что прямо указывается в этой же статье)
В этой же статье, в разделе "Дефрагментация индексов" упоминается использование команды:
ALTER INDEX ALTER INDEX index_name ON table_name SET (ALLOW_PAGE_LOCKS = ON, ALLOW_ROW_LOCKS = ON);
для включения блокировок в таблицах.
Однако реальное использование этой команды со всеми ее параметрами в контексте работы именно с 1С не расписано.
На самом деле необходимо осуществить:
- выбор базы,
- затем перебор всех таблиц в базе с перебором всех нестандартных индексов в базе ...
- включить блокировку
- затем осуществить выбор базы + перебор всех таблиц в базе + перебор всех нестандартных индексов в базе ...
- выключить блокировку.
Далее предлагается шаблон скрипта, который выполняет эту функцию
Автор сего скрипта //infostart.ru/profile/411182/, я публикую с его разрешения.
DECLARE @DBName varchar(255)
DECLARE @TEMPLATE VARCHAR(MAX)
DECLARE @SQL_SCRIPT VARCHAR(MAX)
DECLARE @TableName varchar(255)
DECLARE @IndexName varchar(255)
DECLARE @TEMPLATE_DB VARCHAR(MAX)
SET @TEMPLATE =
'DECLARE contact_cursor CURSOR FOR
SELECT
tab.name as tabName,
ind.name as indName
FROM [{DBNAME}].[sys].[tables] as tab
inner join [{DBNAME}].[sys].[indexes] as ind on tab.object_id = ind.object_id
WHERE ind.allow_page_locks = 0
and ind.name is not null'
SET @TEMPLATE_DB =
'ALTER INDEX [{INDEXNAME}] ON [{DBNAME}].[dbo].[{TABLENAME}] SET (ALLOW_PAGE_LOCKS = ON, ALLOW_ROW_LOCKS = ON)
ALTER INDEX [{INDEXNAME}] ON [{DBNAME}].[dbo].[{TABLENAME}] REORGANIZE WITH (LOB_COMPACTION = ON)
ALTER INDEX [{INDEXNAME}] ON [{DBNAME}].[dbo].[{TABLENAME}] SET (ALLOW_PAGE_LOCKS = OFF, ALLOW_ROW_LOCKS = ON)'
DECLARE db_cursor CURSOR FOR
SELECT
db.name as dbName
FROM
[master].[sys].[databases] as db
WHERE db.owner_sid <> 0x01 and db.state_desc = 'ONLINE'
OPEN db_cursor
FETCH NEXT FROM db_cursor INTO @DBName
WHILE @@FETCH_STATUS = 0
BEGIN
PRINT @DBNAme
SET @SQL_SCRIPT = REPLACE(@TEMPLATE, '{DBNAME}', @DBName)
EXECUTE(@SQL_SCRIPT)
OPEN contact_cursor
FETCH NEXT FROM contact_cursor INTO @TableName, @IndexName
WHILE @@FETCH_STATUS = 0
BEGIN
PRINT ' Table: ' + @TableName + '; Index: ' + @IndexName
SET @SQL_SCRIPT = REPLACE(@TEMPLATE_DB, '{DBNAME}', @DBName)
SET @SQL_SCRIPT = REPLACE(@SQL_SCRIPT, '{INDEXNAME}', @IndexName)
SET @SQL_SCRIPT = REPLACE(@SQL_SCRIPT, '{TABLENAME}', @TableName)
EXECUTE(@SQL_SCRIPT)
FETCH NEXT FROM contact_cursor INTO @TableName, @IndexName
END
CLOSE contact_cursor
DEALLOCATE contact_cursor
FETCH NEXT FROM db_cursor INTO @DBName
END
CLOSE db_cursor
DEALLOCATE db_cursor
GO