Конечно, вы можете ограничить результаты запроса. Я делаю это для 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