Кто-нибудь знает способ принудительно намекнуть nolock на все транзакции, выпущенные определенным пользователем? Я хотел бы предоставить логин для группы поддержки для запроса производственной системы, но я хочу защитить ее, принудительно блокируя все, что они делают. Я использую SQL Server 2005.
Обычно они используют SQL Server Management Studio. Однако я знаю, что некоторые из них используют SQuirreL.
Не могли бы вы пояснить, чего вы здесь пытаетесь достичь? Вы пытаетесь защитить данные в своей БД?


Вы можете создать ограниченного пользователя для группы поддержки, а затем написать хранимые процедуры или представления с помощью nolock-hint. Затем предоставьте доступ только к ним, а не к прямому доступу к таблице.
Как намекнул Эспо, я почти уверен, что прямого способа сделать то, о чем вы просите, нет. По его словам, вы можете вроде как добиться этого, ограничив доступ пользователя только к процессам, в которых есть встроенный код NOLOCK.
Вы можете настроить SQL Management Studio своего обслуживающего персонала, чтобы установить уровень изоляции транзакции по умолчанию на READ UNCOMMITTED (Tools-> Options-> Query Execution-> SQL Server-> Advanced). Функционально это то же самое, что и НЕТ подсказок для всего.
Недостатком является то, что вам придется делать это для каждого члена вашей группы поддержки, и у них будет возможность изменить конфигурацию в своей SQL Management Studio.
Вы спасли мою жизнь
К сожалению, ограничение пользователей SP нарушает цель этого. Я надеялся, что есть какой-то способ позволить им запрашивать все и тем самым улучшить их навыки поиска и устранения неисправностей. Спасибо за помощь ребята.
Это болезненный и хитрый способ сделать это, но это то, чем мы занимаемся там, где я работаю. Мы также используем классический asp, поэтому мы используем встроенные вызовы sql. мы фактически оборачиваем вызов sql в функцию (здесь вы можете проверить конкретного пользователя) и добавляем "SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED" в начало вызова.
Я считаю, что функционально это то же самое, что и подсказка об отсутствии блокировки. Извините, у меня нет ответа на чистом SQL, мне было бы интересно услышать, найдете ли вы хороший способ сделать это.
Это, вероятно, лучший способ позволить им писать любой sql, который они хотят, но при этом защитить базу данных.
Должен ли я запускать команду «УСТАНОВИТЬ УРОВЕНЬ ИЗОЛЯЦИИ ТРАНЗАКЦИИ, ЧТЕНИЕ НЕЗАВЕРШЕНО» каждый раз при запросе?
Хорошо, вам нужно уточнить, что вы здесь пытаетесь сделать.
Если вы пытаетесь уменьшить блокировку базы данных и, возможно, предоставить своим пользователям службы поддержки данные, которые, возможно, никогда не будут зафиксированы в базе данных. Позволяя им записывать в базу данных все, что они хотят, nolock - лучший способ. Вы получите дополнительный бонус в том, что ваш пользователь по-прежнему сможет повысить свой уровень изоляции с помощью команды SET TRANSACTION ISOLATION LEVEL.
Если вы пытаетесь ограничить ущерб, который они могут причинить при запуске чего-либо против БД, посмотрите на реализацию безопасности, убедитесь, что им разрешен доступ только для чтения к вашим таблицам, и посмотрите, как запретить доступ к сохраненным процессам и функциям.
Я считаю, что NOLOCK неправильно понимают при переполнении стека.
Через что они запрашивают базу данных?