Вы можете, конечно, ограничить результаты запроса. Я делаю это для 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
операторов после журнала. Это ограничение основано как на количестве строк в результатах, так и на ожидаемых затратах на запрос. Значения количества строк и регулятора запросов могут быть переменными, поэтому не составит труда изменить их, чтобы изменить ограничение также на основе текущего пользователя.
Тем не менее, вы также должны заметить, что пользователям, которые «в курсе», довольно легко выйти из этого, если они захотят. В моем случае я рассматриваю возможность время от времени преодолевать ограничения. Но именно поэтому я веду журналирование: код, который преодолевает ограничения, торчит в журналах, и поэтому я могу легко поймать и запретить любому, кто делает это слишком часто, без моего разрешения.
Наконец, любой пользователь, который вызывает это, должен быть только в роли denydatawriters, роли datareaders, а затем иметь явные разрешения на выполнение только этой хранимой процедуры. Тогда они на самом деле не могут ничего сделать , кроме как выбирать на существующих таблицах.
Теперь я предвижу ваш следующий вопрос: можете ли вы сделать это автоматически где-нибудь, например, в построителе отчетов или в студии управления. К сожалению, я не думаю, что это возможно. Вам нужно дать им какой-то интерфейс, который позволит легко вызывать вашу хранимую процедуру. Но я могу ошибаться.