Пользователь SQL не может выбрать объекты из системных объектов, где UID = Пользователь
Я работаю с унаследованной системой, которая пытается выполнить изменения схемы в SQL для определенных пользователей, сначала запросив у sysobjects этого пользователя, чтобы определить, существует ли объект. Если это так, он создает инструкцию ALTER VIEW, в противном случае он создает инструкцию CREATE VIEW. В этом случае представление существует, но в запросе по-прежнему не отображается список объектов.
Например:
setuser 'APPLICATION_DEV'
Select * from sysobjects o, sysusers u
where u.uid = o.uid
and u.name = N'APPLICATION_DEV'
Проблема заключается в том, что некоторые учетные записи в этой базе данных могут выполнять этот запрос без ошибок, и он возвращает все объекты, принадлежащие этому пользователю. Однако другие учетные записи не получают записей, возвращаемых этим запросом. Если я установлю SA и выполню запрос, все эти объекты пользователей появятся. Уязвимый пользователь является владельцем схемы и имеет разрешения на создание представления для этой схемы. Я не могу найти никаких различий в разрешениях между работающим пользователем и неработающей учетной записью пользователя.
Есть ли пропущенное мной разрешение, которое ограничивало бы пользователя от запроса его собственных объектов в системных объектах?
Да, я знаю, что sysobjects устарел, но я не имею никакого контроля над реальным кодом здесь и вместо этого должен исправить базу данных, чтобы их код работал должным образом.
РЕДАКТИРОВАТЬ: Дополнительные выводы. Чтобы усложнить ситуацию, я могу запустить это успешно:
setuser 'APPLICATION_DEV'
Select * from sysusers
Where name = 'APPLICATION_DEV'
Я также могу выполнить это успешно:
setuser 'APPLICATION_DEV'
Select * from sysobjects
Where uid = 308 --308 is the uid of the APPLICATION_DEV user
Однако, когда я использую соединение в предложении where или через INNER JOIN, я не получаю записей. Что бы ограничить мой доступ к записям исключительно на основе объединения? Индекс разрешений?? Я сбит с толку.
1 ответ
Для конкретного пользователя в отображении пользователя проверьте, все ли флажки установлены, кроме db_denydatareader и db_denydatawriter.
также проверьте это
В доступе SELECT было отказано для объекта 'sysobjects', базы данных 'mssqlsystemresource', схемы 'sys'
http://social.msdn.microsoft.com/Forums/en/sqlsecurity/thread/a2befd20-2a9b-4a60-95a9-3a80a1a99ea1