Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Как запретить одновременный достум к нескольким базам сервера ?  [new]
Krempel
Member

Откуда:
Сообщений: 10
На сервере несколько баз данных, существует юзер с правами ко всем базам.
У юзера есть возможность писать и запускать скрипты для обновления данных.

Есть ли возможность запретить юзеру в скриптах:
1. обращаться одновременно к нескольким базам (например, синтаксисом <база>.dbo.<таблица>)
2. в пределах одного скрипта перемещаться от базы к базе (например командой use)
29 янв 13, 17:11    [13845974]     Ответить | Цитировать Сообщить модератору
 Re: Как запретить одновременный достум к нескольким базам сервера ?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37050
Нет. Только отобрав права.

Сообщение было отредактировано: 29 янв 13, 17:12
29 янв 13, 17:11    [13845978]     Ответить | Цитировать Сообщить модератору
 Re: Как запретить одновременный достум к нескольким базам сервера ?  [new]
Glory
Member

Откуда:
Сообщений: 104760
Krempel
1. обращаться одновременно к нескольким базам (например, синтаксисом <база>.dbo.<таблица>)
2. в пределах одного скрипта перемещаться от базы к базе (например командой use)

Отрубить руки. Чтобы он не мог писать код.
29 янв 13, 17:12    [13845986]     Ответить | Цитировать Сообщить модератору
 Re: Как запретить одновременный достум к нескольким базам сервера ?  [new]
Krempel
Member

Откуда:
Сообщений: 10
Гавриленко Сергей Алексеевич
Нет. Только отобрав права.


Может можно как-то контролировать количество коннектов к базам ?
(в смысле не разрешать больше одного)
29 янв 13, 17:14    [13846002]     Ответить | Цитировать Сообщить модератору
 Re: Как запретить одновременный достум к нескольким базам сервера ?  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
Krempel,

И как это ограничит использование <база>.dbo.<таблица> из одного коннекта к одной бд?!
29 янв 13, 17:16    [13846015]     Ответить | Цитировать Сообщить модератору
 Re: Как запретить одновременный достум к нескольким базам сервера ?  [new]
Glory
Member

Откуда:
Сообщений: 104760
Krempel
Может можно как-то контролировать количество коннектов к базам ?

Logon Trigger
29 янв 13, 17:16    [13846020]     Ответить | Цитировать Сообщить модератору
 Re: Как запретить одновременный достум к нескольким базам сервера ?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37050
А откуда вообще такое пространное желание?
29 янв 13, 17:18    [13846034]     Ответить | Цитировать Сообщить модератору
 Re: Как запретить одновременный достум к нескольким базам сервера ?  [new]
Krempel
Member

Откуда:
Сообщений: 10
Гавриленко Сергей Алексеевич
А откуда вообще такое пространное желание?

Попытаюсь обрисовать расклад...

Через самопальный интерфейс разрешил юзеру играться с данными, исключительно в трансакциях.
Юзеры эти в данном случае люди без особых технических знаний, но сами уверены в обратном и им очень хочется повыделываться с данными напрямую (наверное им на выходных попалась брошюрка типа "SQL - это просто" вот их и попёрло)...
Когда юзер_1 считает, что он наваял конечный скрипт, то он отмечает его как готовый и следующий юзер_2 запускает его с коммитом при успешном завершении.
юзер_1 в данномм случае это мажет быть манагер среднего звена, а юзер_2 это или его начальник, или уборщица или кто угодно, кто считает себя достаточно продвинутым в SQL и изявил желание поучаствовать в этой цепочке "многоуровневого контроля".
Как-бы там нибыло - пожелание клиента закон!

В итоге на сервере несколько баз с одинаковой структурой, но с разной заполненностью данными.
ДБ1 - тестовая с минимальными данными
(с полными данными некоторые таблицы имеют до 30 млн. записей и чтобы не утомлять юзера ожиданием отработки запросов)
ДБ2 - тестовая с полными данными на избранные таблицы, но с минимальными на остальные таблицы.
.....
....
ДБх - тестовая с полными данными.
Продуктив - рабочая база, разумеется с полными данными

В начале на каждой базе был свой комплект юзеров, но это закумарило пользователей, т.к. нужно было каждый раз коннектиться по новой.
Разносить по серверам тоже не вариант (долго объяснять особенности конфигурации).

Интерфейс сам перекидывает юзеров с базы на базу в зависимости от степени готовности скрипта и запуска с коммитом, т.е. сколько там этих тестовых баз и к какой они сейчас подключены в конечном итоге вообще не их собачье дело (некоторые искренне уверены, что они все время работают с продуктивной базой).

И всё это работало, до одного момента, пока самые что ни на есть продвинутые юзеры добрались до команд типа use и записей через .dbo. и начали таскать данные из соседних баз.

Вот тут и назрела потребность ограничивать юзеров с одновременным доступам к нескольким базам

Может есть ещё какие-нибудь концептуально другие решения, я не знаю...
Буду рад любому совету.
29 янв 13, 18:04    [13846410]     Ответить | Цитировать Сообщить модератору
 Re: Как запретить одновременный достум к нескольким базам сервера ?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37050
Раз у вас есть самопальный интерфейс, встройте в него парсинг на предмет указанных команд и отпарывайте.
29 янв 13, 18:07    [13846432]     Ответить | Цитировать Сообщить модератору
 Re: Как запретить одновременный достум к нескольким базам сервера ?  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Krempel
Может есть ещё какие-нибудь концептуально другие решения

Как ни странно, самое верное решение дано здесь 13845986 :-)))
29 янв 13, 18:12    [13846477]     Ответить | Цитировать Сообщить модератору
 Re: Как запретить одновременный достум к нескольким базам сервера ?  [new]
Krempel
Member

Откуда:
Сообщений: 10
Гавриленко Сергей Алексеевич
Раз у вас есть самопальный интерфейс, встройте в него парсинг на предмет указанных команд и отпарывайте.


На данным этапе я именно это и использую, хотя с этим тоже морока...

Например, команда use может оказаться составной частю названия колонки: new_user
А если проверять на пробелы, то в начали и в конце?
а если пишет с начала строки:
use

а если так:
--------------------
use


master


use
ТЕСТ_ДБ
-------------------

а если проверять на значки, а придумают какуюньть динамику типа:

declare @v nvarchar(30)
set @v = ' use' + ' TEST_DB'
exec sp_executesql @v

пока, правда, до такого ещё не додумались, но это может стать вопросом времени.


Вообщем пытаюсь найти более радикальное решение.
29 янв 13, 18:32    [13846603]     Ответить | Цитировать Сообщить модератору
 Re: Как запретить одновременный достум к нескольким базам сервера ?  [new]
Glory
Member

Откуда:
Сообщений: 104760
Krempel
а если проверять на значки, а придумают какуюньть динамику типа:

declare @v nvarchar(30)
set @v = ' use' + ' TEST_DB'
exec sp_executesql @v

пока, правда, до такого ещё не додумались, но это может стать вопросом времени.

Контекст базы после окончания динамического запроса возвращается к текущему
А для пакетного выполнения скриптов используют пакетные же утилиты
Которые уже заранее определенные параметры коннекта, както сервер, база, логин
Таким образом вполне возможно сделать доступ только к единственной базе и обращение к другой базе вызовет ошибку
29 янв 13, 18:38    [13846641]     Ответить | Цитировать Сообщить модератору
 Re: Как запретить одновременный достум к нескольким базам сервера ?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37050
Динамику тоже отпарывать.
Есть парсер для TSQL: https://www.sql.ru/forum/actualthread.aspx?tid=963923&hl=%ef%e0%f0%f1%e5%f0
29 янв 13, 18:39    [13846645]     Ответить | Цитировать Сообщить модератору
 Re: Как запретить одновременный достум к нескольким базам сервера ?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37050
Но вообще, задача административная. Начните за это штрафовать писателей скриптов, и оно само как-то сойдет на нет.
29 янв 13, 18:40    [13846649]     Ответить | Цитировать Сообщить модератору
 Re: Как запретить одновременный достум к нескольким базам сервера ?  [new]
Krempel
Member

Откуда:
Сообщений: 10
Glory
Krempel
а если проверять на значки, а придумают какуюньть динамику типа:

declare @v nvarchar(30)
set @v = ' use' + ' TEST_DB'
exec sp_executesql @v

пока, правда, до такого ещё не додумались, но это может стать вопросом времени.

Контекст базы после окончания динамического запроса возвращается к текущему
А для пакетного выполнения скриптов используют пакетные же утилиты
Которые уже заранее определенные параметры коннекта, както сервер, база, логин
Таким образом вполне возможно сделать доступ только к единственной базе и обращение к другой базе вызовет ошибку


в смысле потребуется сторонний софт или это можно обеспечить силами transact-sql
29 янв 13, 18:50    [13846703]     Ответить | Цитировать Сообщить модератору
 Re: Как запретить одновременный достум к нескольким базам сервера ?  [new]
Glory
Member

Откуда:
Сообщений: 104760
Krempel
в смысле потребуется сторонний софт или это можно обеспечить силами transact-sql

osql.exe/sqlcmd.exe входят в установку сервера/клиентских утилит
29 янв 13, 18:51    [13846713]     Ответить | Цитировать Сообщить модератору
 Re: Как запретить одновременный достум к нескольким базам сервера ?  [new]
Krempel
Member

Откуда:
Сообщений: 10
Glory
Krempel
в смысле потребуется сторонний софт или это можно обеспечить силами transact-sql

osql.exe/sqlcmd.exe входят в установку сервера/клиентских утилит


сходу не совсем понятно, как прикрутить это к своему интерфейсу.

сейчас играюсь с предложеным тобой "Logon Trigger" - мне кажется тут есть перспектива.
29 янв 13, 19:08    [13846862]     Ответить | Цитировать Сообщить модератору
 Re: Как запретить одновременный достум к нескольким базам сервера ?  [new]
invm
Member

Откуда: Москва
Сообщений: 9397
В самопальном интерфейсе можно попробовать сделать так:
1. В каждой БД заводится пользователь с необходимыми полномочиями.
2. Все скрипты должны начинаться с пролога фиксированного формата, в котором каким-либо образом указана целевая БД. Скрипты без пролога или с его неверным форматом не исполняются вообще.
3. Из пролога вытаскивается БД. По БД определяется пользователь из п. 1. Далее текущего пользователя имперсонируем в полученного с опцией no revert.

Правда после каждого выполнения придется переоткрывать соединение.
29 янв 13, 20:03    [13847118]     Ответить | Цитировать Сообщить модератору
 Re: Как запретить одновременный достум к нескольким базам сервера ?  [new]
Glory
Member

Откуда:
Сообщений: 104760
Krempel
сходу не совсем понятно, как прикрутить это к своему интерфейсу.

Запускать, как же еще
30 янв 13, 11:19    [13849340]     Ответить | Цитировать Сообщить модератору
 Re: Как запретить одновременный достум к нескольким базам сервера ?  [new]
Glory
Member

Откуда:
Сообщений: 104760
Krempel
сейчас играюсь с предложеным тобой "Logon Trigger" - мне кажется тут есть перспектива.

Только Logon Trigger не запретит использование команды use и обращений к другим базам.
30 янв 13, 11:20    [13849345]     Ответить | Цитировать Сообщить модератору
 Re: Как запретить одновременный достум к нескольким базам сервера ?  [new]
Krempel
Member

Откуда:
Сообщений: 10
Glory
Только Logon Trigger не запретит использование команды use и обращений к другим базам.


В этом я уже убедился :(

Т.е. он срабатывает только один раз при коннекте.
А дальше можно лазить по всему серверу и по всем его базам куда тебе только прав хватает.

Но видно переигрался с этим триггером - сервер меня самого теперь не пускает.
Не могу подконнектиться даже админом :(
30 янв 13, 14:29    [13850893]     Ответить | Цитировать Сообщить модератору
 Re: Как запретить одновременный достум к нескольким базам сервера ?  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Krempel
Но видно переигрался с этим триггером - сервер меня самого теперь не пускает.
Не могу подконнектиться даже админом :(

Жжёте напалмом.
Подключайтесь через DAC и отключайте триггер.
Можете запостить тут текст триггера? Просто интересно.
30 янв 13, 15:04    [13851234]     Ответить | Цитировать Сообщить модератору
 Re: Как запретить одновременный достум к нескольким базам сервера ?  [new]
Krempel
Member

Откуда:
Сообщений: 10
Гость333
Krempel
Но видно переигрался с этим триггером - сервер меня самого теперь не пускает.
Не могу подконнектиться даже админом :(

Жжёте напалмом.
Подключайтесь через DAC и отключайте триггер.
Можете запостить тут текст триггера? Просто интересно.


Да уже муздыхаюсь с этим DAC
В 2008 Express он стандартно не активирован, пытаюсь запустить но лезут ошибки

Триггер вот:

create trigger conn_lt
on all server with execute as '<имя_юзера>'
for LOGON
as
begin
if original_login()= '<имя_юзера>'
and
(select count(1)
from sys.dm_exec_sessions
where is_user_process = 1
and original_login_name = '<имя_юзера>') > 1
raiserror ('Only one DB!',10, 1)
rollback;
end;
30 янв 13, 15:21    [13851362]     Ответить | Цитировать Сообщить модератору
 Re: Как запретить одновременный достум к нескольким базам сервера ?  [new]
Glory
Member

Откуда:
Сообщений: 104760
Krempel
raiserror ('Only one DB!',10, 1)

Вы точно понимаете, что такое Logon триггер ?
30 янв 13, 15:25    [13851391]     Ответить | Цитировать Сообщить модератору
 Re: Как запретить одновременный достум к нескольким базам сервера ?  [new]
Krempel
Member

Откуда:
Сообщений: 10
Glory
Krempel
raiserror ('Only one DB!',10, 1)

Вы точно понимаете, что такое Logon триггер ?



На сколько я понимаю - срабатывает при коннекте.
Или всё-таки ошибаюсь?

raiserror - генерирует мне ошибку для моего интерфейса
30 янв 13, 15:37    [13851487]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить