Могу ли я принудительно установить определенные параметры пользователем в SQL Server?

У меня есть группа пользователей, делающих специальные запросы к базе данных, на которой работает SQL Server. Иногда кто-то запускает запрос, который блокирует систему на длительный период времени, поскольку он получает 10 ММ строк.

Можно ли установить некоторые параметры при подключении определенного логина? например.:

  • уровень изоляции транзакций
  • максимальное количество строк
  • тайм-аут запроса

Если это невозможно в SQL Server 2000, возможно ли это в другой версии? Насколько я могу судить, регулятор ресурсов не дает вам такого контроля (он просто позволяет вам управлять памятью и процессором).

Я понимаю, что пользователь может сделать многое из этого сам, но было бы здорово, если бы я мог управлять этим с сервера для каждого пользователя.

Очевидно, я хотел бы отвести пользователей от прямого доступа к таблице/представлению, но на данный момент это не вариант.


person Michael Haren    schedule 01.10.2009    source источник


Ответы (2)


Конечно, вы можете ограничить результаты запроса. Я делаю это для StackQL, используя хранимую процедуру, которая выглядит примерно так:

CREATE PROCEDURE [dbo].[WebQuery] 
    @QueryText nvarchar(1000)
AS
BEGIN

    INSERT INTO QueryLogs(QueryText) 
        VALUES(@QueryText)

    SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
    SET QUERY_GOVERNOR_COST_LIMIT 15000 
    SET ROWCOUNT 500 

    Begin Try
        exec (@QueryText) 
    End Try
    Begin Catch
        SELECT ERROR_NUMBER() AS ErrorNumber, 
            ERROR_MESSAGE() AS ErrorMessage,
            ERROR_PROCEDURE() AS ErrorProcedure,
            ERROR_SEVERITY() AS ErrorSeverity,
            ERROR_LINE() AS ErrorLine,
            ERROR_STATE() AS ErrorState
    End Catch

END

Важной частью здесь является серия из трех операторов SET после журнала. Это ограничение основано как на количестве строк в результатах, так и на ожидаемой стоимости запроса. Значения rowcount и регулятора запросов могут использоваться как переменные, поэтому не должно быть сложно изменить это, чтобы изменить ограничение, основанное также на текущем пользователе.

Тем не менее, вы также должны отметить, что пользователям, которые «в курсе», довольно легко выйти из этого, если они захотят. В моем случае я считаю особенностью способность время от времени преодолевать ограничения. Но это также то, почему я веду журнал: код для преодоления ограничений торчит в журналах, и поэтому я могу легко поймать и забанить любого, кто делает это слишком часто без моего разрешения.

Наконец, любой пользователь, который вызывает это, должен быть только в роли denydatawriters, роли datareaders, а затем ему должны быть предоставлены явные разрешения на выполнение только этой хранимой процедуры. Тогда они не могут ничего делать, кроме как выбирать из существующих таблиц.

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

person Joel Coehoorn    schedule 01.10.2009
comment
@Joel: То есть вместо того, чтобы позволять пользователям выполнять запросы напрямую к базе данных, я мог бы позволить им использовать эту тонкую оболочку? Мне нравится, спасибо! И да, вы пригвоздили мой следующий вопрос. - person Michael Haren; 01.10.2009

В SQL Server 2005 и 2008 вы можете добавить в базу данных триггер LOGIN, который может изменять параметры подключения в зависимости от того, от кого они подключены. Однако вам нужно быть очень осторожными с ними, так как ошибка или ошибка в триггере может привести к тому, что все будут заблокированы.

Ничего подобного в SQL Server 2000 нет.


Я просто хотел добавить, что если подход Джоэла работает для вас, то я бы настоятельно рекомендовал этот метод вместо моего, потому что триггер входа в систему — это одна большая и опасная граната, которую нужно бросить на эту проблему.

Если вы все еще хотите их выполнить, здесь это хорошая статья, которая демонстрирует, как их использовать. Однако еще важнее здесь, в котором есть важные инструкции о том, что делать, если ваш триггер входа в систему блокирует всех.

person RBarryYoung    schedule 01.10.2009
comment
+1 Спасибо за это, выглядит многообещающе. Хотя пример был бы полезен. - person Michael Haren; 02.10.2009