официальный партнёр 1С по деловому софту
Закрыть
Логин:
Пароль:
Забыли свой пароль?
  Войти
Войти как пользователь
Вы можете войти на сайт, если вы зарегистрированы на одном из этих сервисов:
 
8(495)229-30-42

Блог 1С Эксперта

  • Архив

    «   Март 2025   »
    Пн Вт Ср Чт Пт Сб Вс
              1 2
    3 4 5 6 7 8 9
    10 11 12 13 14 15 16
    17 18 19 20 21 22 23
    24 25 26 27 28 29 30
    31            

Если "умер" TEMPDB

Рабочий способ тут
https://www.xtivia.com/start-sql-server-lost-tempdb-data-files/

Версия MSSQL сервера запросом

Все подробности в 2 клика
--Version Number
select @@version

--Edition
select serverproperty('Edition')

--Service Pack
select serverproperty('ProductLevel')

--Version Number
select serverproperty('ProductVersion')

SQL. RAISEERROR вместо PRINT при выводе сообщений о статусе выполнения

При выполнении длинных скриптов в MSSQL-студии хочется наблюдать статус. Куда дошло, что происходит в данный момент, сколько осталось?
Для этого можно использовать оператор PRINT
Но у него есть одна крайне неприятная особенность. Выводит текст только когда уже скрипт выполнен. Частный случай: при выполнении команды GO, что по сути - то же самое.
То есть чтобы сразу увидеть текст - можно после PRINT вставить GO, и мгновенно увидим сообщение.
Но минус данного финта состоит в том, что при выполнении GO мы какбы намекает SQL что предыдущая часть скрипта уже отработала полностью, и он удаляет все перемененные, определённые через DECLARE, а это в некоторых случаях заставляет пренебречь выводом сообщений в пользу сохранения работоспособности скрипта.

Но выход есть, конструкция RAISERROR (и не спрашивайте, где еще одна Е :) )
С флагом WITH NOWAIT
Чуть сложней использовать из-за того, что текст сообщения нельзя собирать динамически при передаче в метод, но в целом даёт нужный результат

Подробней здесь
https://www.sqltheater.com/2017/09/12/stop-using-print/

Как получить админские права в базу 1С с сохранением списка и паролей пользователей

База должна быть на MSSQL, куда должен быть доступ
http://www.msav.ru/blog/1334-sbros-parolya-1s-pod-sql

MSSQL: текущие запросы, транзакции и их отмена

Иногда возникает желание посмотреть что именно сейчас делается в SQL: какие запросы выполняются и какие транзакции активны?

Сделать это можно следующим образом.

Текущие запросы, с их текстами
select session_id, status, wait_type, command, last_wait_type  
  , qt.text sql_text  
  , total_elapsed_time/1000 as [total_elapsed_time, sec],  
         wait_time/1000 as [wait_time, sec], (total_elapsed_time - wait_time)/1000 as [work_time, sec] , percent_complete 
    from sys.dm_exec_requests as qs  
    CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) as qt  
    where session_id >= 50 and session_id <> @@spid -- чтоб исключить текущую сессию и этот запрос

Самая долгая транзакция
DBCC OPENTRAN 
Возвращает результаты в виде
Oldest active transaction:
   SPID (server process ID): 65
   UID (user ID) : -1
   Name          : user_transaction
   LSN           : (14627553:1424:2)
   Start time    : Mar 12 2018  5:25:34:807PM
   SID           : 0x01

Подробности транзакции по SPID
DECLARE @sqltext VARBINARY(128)
SELECT @sqltext = sql_handle
FROM sys.sysprocesses
WHERE spid = [SPID, полученный из DBCC OPENTRAN]
SELECT *
FROM sys.dm_exec_sql_text(@sqltext)
GO

Принудительно откатить транзакцию, можно убив процесс
KILL [SPID, полученный из DBCC OPENTRAN]

Как прикрепить базу MSSQL только при наличии файла MDF (без LDF)

На практике MSSQL DBA бывают случаи, когда необходимо прикрепить базу SQL и журнала транзакций нет.
ЛИБО лог очень вырос и никакой shrink не помогает уменьшить его размер (модель восстановления simple)
В этом случае, после закрытия всех транзакций, можно сделать Detach базы
После чего переместить-переименовать файл журнала транзакций, и attach-нуть базу следующим скриптом
EXEC sp_attach_single_file_db @dbname = 'dbname', 
   @physname = 'D:\path\db.mdf'
Если всё хорошо - получим сообщение вида
File activation failure. The physical file name "D:\path\db_log.ldf" may be incorrect.
New log file 'D:\path\db_log.LDF' was created.
SQL создаст пустой журнал транзакций на старом месте.
После чего старый лог можно удалить.

Данный способ не сработает, если в базе на момент отключения были неподтвержденные транзакции. В этом случае поможет план Б из статьи https://infostart.ru/public/277252/