Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Скинуть логин  [new]
Sandist
Member

Откуда:
Сообщений: 395
Доброго времени суток

1. Есть процедура которая обновляет данные в таблицах
2. Есть пользователь под логином (ttt) который работает с таблицами через MS access
3. Сервер Microsoft SQL Server 2008 (SP4) - 10.0.6241.0 (X64) Apr 17 2015 10:56:08 Copyright (c) 1988-2008 Microsoft Corporation Enterprise Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1) (VM)

При обновлении данных в базе иногда происходит лок таблиц этим пользователем. Мне нужен код, который будет скидывать все соединения пользователя ttt из базы перез запуском обновлений.

Помогите пожалуйста с таким запросом
6 сен 19, 10:28    [21965140]     Ответить | Цитировать Сообщить модератору
 Re: Скинуть логин  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36377
alter database ... set restricted_user with rollback immediate
Ну и сисадмина/овнера отобрать у пользователя предварительно.
6 сен 19, 10:49    [21965163]     Ответить | Цитировать Сообщить модератору
 Re: Скинуть логин  [new]
Sandist
Member

Откуда:
Сообщений: 395
Гавриленко Сергей Алексеевич,
что-то боязно мне так делать

[url=]http://qaru.site/questions/25463/how-do-you-kill-all-current-connections-to-a-sql-server-2005-database[/url]
USE master
GO

SET NOCOUNT ON
DECLARE @DBName varchar(50)
DECLARE @spidstr varchar(8000)
DECLARE @ConnKilled smallint
SET @ConnKilled=0
SET @spidstr = ''

Set @DBName = 'DB_NAME'
IF db_id(@DBName) < 4
BEGIN
PRINT 'Connections to system databases cannot be killed'
RETURN
END
SELECT @spidstr=coalesce(@spidstr,',' )+'kill '+convert(varchar, spid)+ '; '
FROM master..sysprocesses WHERE dbid=db_id(@DBName)

IF LEN(@spidstr) > 0
BEGIN
EXEC(@spidstr)
SELECT @ConnKilled = COUNT(1)
FROM master..sysprocesses WHERE dbid=db_id(@DBName)
END

Можно так? что скажете?
6 сен 19, 11:08    [21965175]     Ответить | Цитировать Сообщить модератору
 Re: Скинуть логин  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1041
Sandist
Можно так? что скажете?

А если юзер переподключится после прибивания сессии и снова заблокирует таблицы - что делать будете?

restricted_user - это опция, предназначенная для ограничения прав пользователей на время регламентных работ (типа обновлений).
6 сен 19, 11:14    [21965180]     Ответить | Цитировать Сообщить модератору
 Re: Скинуть логин  [new]
PsyMisha
Member

Откуда: другая столица
Сообщений: 312
Sandist,

Мой вариант реализации, для поиска зависших сессий от определенного логина.
Запускалось по зашедуленному джобу - надо подумать, как и чем вам лучше этот код запускать перед своим процессом, но сам код рабочий и функциональный

DECLARE @Session_ID varchar(1000), @SQLCMD nvarchar(4000);

DECLARE Sessions_Cursor CURSOR READ_ONLY FOR 
--##################################################
SELECT DISTINCT 
sp.spid AS 'Session_ID'
FROM sysprocesses AS sp
WHERE sp.loginame = '%INSERT_YOUR_LOGIN_NAME%'
AND DATEDIFF(HOUR, sp.last_batch, GETDATE()) >= 2 --поиск зависших сессий, вариант если сессия работала больше 2х часов. Можно убрать всю эту строку в WHERE
--##################################################

OPEN Sessions_Cursor
FETCH NEXT FROM Sessions_Cursor INTO @Session_ID
WHILE @@FETCH_STATUS = 0
BEGIN
	SET @SQLCMD = 'KILL ' + @Session_ID
	
	PRINT @SQLCMD -- закомментировать опционально - только отображает
	--EXEC sp_executesql @SQLCMD -- раскомментировать для выполнения
	
FETCH NEXT FROM Sessions_Cursor INTO @Session_ID
END

CLOSE Sessions_Cursor
DEALLOCATE Sessions_Cursor
6 сен 19, 16:19    [21965456]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить