gifts2017

Монопольно ли запущена база 7.7 для SQL. Снятие single user в sql

Опубликовал Павел (d0dger) в раздел Администрирование - Защита, права, пароли

T-SQL скрипт, позволяющий определить монопольно ли запущена база на сервере SQL,  а также перевести базу в multi user

Когда имеется целый зоопарк баз на SQL (да и в других случаях) бывает необходимо определить запущена база монопольно или нет из другой программы (будь то 1С или скрипт автоматического обмена)

Как известно 7-ка при монопольном режиме ставит SQL базу в single user. Получив значение этой переменной SQL Server для базы можно определить монопольно ли кто-либо в ней или нет (хотя конечно single user может быть включен и другими средствами, но опустим это как частный случай). Получить значение данного свойства от SQL Server можно выполнив запрос: 

EXEC sp_dboption 'BASE', 'single user'

Для этого для SQL версии можно воспользоваться следующим кодом 1С 7.7:

Запрос = СоздатьОбъект("ODBCRecordset");
ТекстЗапроса = "EXEC sp_dboption 'BASE', 'single user'";
ТЗ = Запрос.ВыполнитьИнструкцию(ТекстЗапроса);
Попытка 
 Если СокрЛП(Врег(ТЗ.ПолучитьЗначение(1, 2))) = "ON" Тогда 
 Сообщить("Монопольно"); 
 Иначе 
 Сообщить("Не монопольно"); 
 КонецЕсли; 
Исключение 
 Сообщить(ОписаниеОшибки()); 
КонецПопытки; 

Манипулируя этой переменной можно из запущенной 1С снять single user для текущей базы данных, при этом 1С при запуске будет воспринимать базу как запущенную монопольно и не даст войти другим пользователям. Это возможно сделать используя следующий T-SQL скрипт:

declare @CurDBName sysname
set @CurDBName = db_name()
exec sp_dboption @CurDBName, 'single user', 'false'

В 1С это выглядит так:

Если МонопольныйРежим() = 1 Тогда
   
ТекстЗапроса = "
    |declare @CurDBName sysname
    |set @CurDBName = db_name()
    |exec sp_dboption @CurDBName, 'single user', 'false'
    |"
;
   
ЗапросТекущаяБаза = СоздатьОбъект("ODBCRecordset");
    Если
ЗапросТекущаяБаза.Выполнить(ТекстЗапроса) = 0 Тогда
        Сообщить(
"Не удалось снять Single User Mode" + РазделительСтрок + ЗапросТекущаяБаза.ПолучитьОписаниеОшибки(), "!");
        СтатусВозврата(
0);
        Возврат;
    КонецЕсли;
КонецЕсли;

 

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Александр Полетаев (Alias) 11.03.11 18:45
Простите, я чего-то не понял.
А нельзя для этой цели воспользоваться стандартной функцией МонопольныйРежим()?

МонопольныйРежим()
Синтаксис:
МонопольныйРежим()
Назначение:
Возвращает значение режима работы программы: 1 - программа запущена в монопольном режиме; 0 - программа запущена в сетевом режиме.
2. Павел (d0dger) 11.03.11 21:02
(1) Имелось ввиду смотреть монопольный ли режим не из текущей базы, запущенной монопольно. Например, у меня есть скрипт обмена данными, и из него запускается база, я могу с помощью этого скрипта определить запущена ли внешняя база монопольно.
3. Альтаир (Altair777) 12.03.11 14:41
А что вернет этот код ксли база совсем не открыта?
4. Павел (d0dger) 14.03.11 10:02
5. Виктор Виктор (virs) 14.03.11 10:32
Полезная обработка для тех, кто понимает, как использовать...
Однозначно +
6. Альтаир (Altair777) 14.03.11 10:52
(4) думаю что это неправильно с точки зрения здравого смысла ;)
7. vip (vip) 14.03.11 11:53
(6) Думаю, что абсолютно правильно.
Т.к. данный запрос просто показывает возможность работы базы в разделенном режиме.
8. Альтаир (Altair777) 14.03.11 12:15
с доработкой он сможет показывать возможность работы и в монопольном режиме
9. Павел (d0dger) 14.03.11 16:49
(8) vip прав, писалось для этих целей, как правило для всяких sql скриптов и vbs. Не представляю пока задачу, когда мне нужно знать можно ли запустить базу монопольно, а вот могу ли я к базе обратиться прямым запросом из вне - частая потребность. То о чем Вы говорите проще делать опираясь на данные, хранимые в файле ..\SYSLOG\links.tmp - так делает к примеру mlg_speed_viever
В общем истина в
virs пишет:
Полезная обработка для тех, кто понимает, как использовать...
Smith Iron; +1 Ответить
10. Альтаир (Altair777) 14.03.11 17:20
d0dger пишет:
Не представляю пока задачу, когда мне нужно знать можно ли запустить базу монопольно

Например, проверить возможность запуска пакетого режима конфигуратора (выгрузка).
Для этого база должна быть никем не открыта.

d0dger пишет:
То о чем Вы говорите проще делать опираясь на данные, хранимые в файле ..\SYSLOG\links.tmp

да, наверно так и есть :)
11. Павел (d0dger) 14.03.11 18:56
(10) можно настроить чтобы конфигуратор делал выгрузку даже если в базе кто-то есть. Хотя в принципе если там только монопольно можно, то обмен не пройдет и об появится запись в журнале регистрации, поэтому какой смысл анализировать есть ли кто-то в базе если задание обмена и так не застопорится?
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа