|   |   | 
| 
 | v7: Можно ли с пом SQLDMO узнать уровень польовательского допуска (MULTI_USER/SINGL? | ☑ | ||
|---|---|---|---|---|
| 0
    
        trdm 29.05.17✎ 13:03 | 
        Можно ли с пом SQLDMO узнать уровень польовательского допуска (MULTI_USER/SINGLE_USER) и как?
 Полагаю надо создать сервер: Set oServer = CreateObject("SQLDmo.SqlServer") 'используем аутентификацию Windows oServer.LoginSecure = True oServer.Connect "localhost" For Each oDatabase In oServer.Databases WScript.Echo oDatabase.Name & " " & oDatabase.SpaceAvailableInMB ' А вот тут спросить у oDatabase. уровень. Только не могу найти в какой проперти/методе это сидит. Next oServer.DisConnect Set oServer = Nothing | |||
| 1
    
        Вафель 29.05.17✎ 13:05 | 
        а через запрос?     | |||
| 2
    
        trdm 29.05.17✎ 13:05 | 
        как?     | |||
| 3
    
        Вафель 29.05.17✎ 13:07 | 
        if (SELECT user_access_desc FROM sys.databases WHERE name = 'YourDb') 
 = 'SINGLE_USER' begin print 'It is in single user mode!' end | |||
| 4
    
        trdm 29.05.17✎ 13:08 | 
        Короче, мне надо из vbs скрипта поймать момент когда БД в мультиюзере, что-бы автоматически запустить перепроведение.
 Если я запускаю перепроведение из скрипта, а БД в синглеюзере я получаю: ALTER DATABASE failed because a lock could not be placed on database | |||
| 5
    
        trdm 29.05.17✎ 13:10 | 
        Фишка в том что SQLDMO может меня послать подальше, если БД в синглеюзере.     | |||
| 6
    
        Вафель 29.05.17✎ 13:11 | 
        так можно же set single user что-то там сразу и всех остальных выгнать     | |||
| 7
    
        Вафель 29.05.17✎ 13:11 | 
        ALTER DATABASE ERP_TEST
 SET SINGLE_USER WITH ROLLBACK IMMEDIATE; | |||
| 8
    
        trdm 29.05.17✎ 13:12 | 
        а если 1С-ку пытаешся стартовать не проверив тип доступа, то получаешь блокировку входа, сообщение "ALTER DATABASE failed because a lock could not be placed on database" и висячее окно в сеансе терминала. А утром вопли.     | |||
| 9
    
        trdm 29.05.17✎ 13:15 | 
        (6) А если архивация еще не кончилась?     | |||
| 10
    
        trdm 29.05.17✎ 13:16 | 
        (7) то же самое. т.е. (9)
 Мне надо уловить момент, когда архивация отработает и БД перейдет в мультиюзер. | |||
| 11
    
        1dvd 29.05.17✎ 14:02 | 
        Вроде, v7 не умеет коннектиться через домен. не?     | |||
| 12
    
        Вафель 29.05.17✎ 14:13 | 
        (10) Запускай отдельный таск по завершению этого     | |||
| 13
    
        trdm 29.05.17✎ 14:20 | 
        (12) Конечно. Запускаю. Получаю: http://prntscr.com/fdcsp4     | |||
| 14
    
        Вафель 29.05.17✎ 14:23 | 
        (13) Через агента запускаешь?
 Можно еще делать бэкап батником, а после выполнения запускать дальше. Типа такого https://gist.github.com/a-sitnikov/85a870b2375fd253e7657e8ba45f5552 | |||
| 15
    
        trdm 29.05.17✎ 14:25 | 
        Пока БД не отпустило, sp_helpdb не отдает строку с нужной БД.
 Фактически, если спросить: sp_helpdb 'НужнаяБд' и если придет пустой скульрезульт, то значит БД в синглеюзере и нефиг пока соваться. (14) бекап делается по расписанию vbs-скриптом, который много чего делает. | |||
| 16
    
        Вафель 29.05.17✎ 14:26 | 
        (15) скрипт ждет завершения бэкапа?
 Если да, то пусть по окончании запускает нужное | |||
| 17
    
        trdm 29.05.17✎ 14:27 | 
        (16) Ясное дело ждет, ему ведь еще dat-файл архивировать.     | |||
| 18
    
        Вафель 29.05.17✎ 14:30 | 
        ты бэкап через 1с делаешь чтоли?     | |||
| 19
    
        trdm 29.05.17✎ 14:39 | 
        да     | |||
| 20
    
        Вафель 29.05.17✎ 14:41 | 
        (19) но зачем????     | |||
| 21
    
        Вафель 29.05.17✎ 14:42 | 
        тогда можно еще делать 
 set multi user | |||
| 22
    
        trdm 29.05.17✎ 15:30 | 
        Родил такую функцию:
 function dbIsBusy(psBdName) dbIsBusy = false Set oServer = CreateObject("SQLDmo.SqlServer") oServer.LoginSecure = True 'используем аутентификацию Windows 'stop oServer.Connect "(local)" Set oResult = oServer.ExecuteWithResults("sp_helpdb '"+psBdName+"'") if oResult.Rows = 0 Then dbIsBusy = true End if oServer.DisConnect Set oServer = Nothing end function если БД в синглюзере - возвращается true, иначе false | |||
| 23
    
        Вафель 29.05.17✎ 15:40 | 
        (22) и в цикле запускаешь?     | |||
| 24
    
        trdm 29.05.17✎ 15:43 | 
        (23) Одна БД архивируется. Я этот прикол знаю...     | |||
| 25
    
        Вафель 29.05.17✎ 15:48 | 
        (24) Я имею ввиду, что в цикле опрос делашь     | |||
| 26
    
        trdm 29.05.17✎ 16:06 | 
        (25) Скрипт запускается с интервалом в 20 минут. Определяет есть ли уже архив, если есть, идет на перепроведение, если нет, делает архив, и потом запускает сеанс с перепроведением.     | |||
| 27
    
        Вафель 29.05.17✎ 16:14 | 
        (26) А что нельзя сделать архив и запустить перепроведение последовательно?     | |||
| 28
    
        trdm 29.05.17✎ 16:25 | 
        (27) тогда получаю: (13)     | |||
| 29
    
        trdm 29.05.17✎ 16:27 | 
        Не знаю, чем там БД занимается, но получаю ошибку "ALTER DATABASE failed because a lock could not be placed on database"  если все последовательно.
 Не спасает даже слип. 5-ти минутный. Ну и пару заданий на обслуживание БД в районе 5 утра. | 
 
 | Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |