Разрешение для запроса dbo.sysobjects - PullRequest
5 голосов
/ 02 декабря 2011

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

DECLARE @testForEmpty BIT
if exists 
    (select top 1 null from dbo.sysobjects where (objectproperty(id, 'IsMsShipped') = 0)) 
        set @testForEmpty = 0 
else set @testForEmpty = 1

Когда я запускаю этот запрос как конкретный пользователь, я всегда получаю testForEmpty = 1. Это означает, что вызов if Существует возвращает пустые строки.

Однако, если я добавлю пользователя в качестве sysadmin, то получу значение testFormEmpty равным 0, и по крайней мере одна строка будет выделена.

Я не хочу добавлять пользователя в качестве системного администратора. Какую минимальную роль / разрешения я должен предоставить, чтобы объект select из dbo.sysobjects возвращал содержимое.

Спасибо

1 Ответ

8 голосов
/ 02 декабря 2011

Во-первых, вы должны использовать sys.objects вместо dbo.sysobjects. dbo.sysobjects - это конструкция SQL 2000, которая существует только в SQL 2008 по причинам обратной совместимости. sys.objects содержит строку для каждого определенного пользователем объекта области схемы, который создается в базе данных, поэтому вам не нужно будет фильтровать ваш запрос вообще. sys.all_objects - это расширенный набор, содержащий как системные, так и пользовательские объекты.

Второе - на стороне разрешений - в SQL Server 2005 и более поздних версиях видимость метаданных в представлениях каталога ограничивается защищаемыми объектами, которыми пользователь владеет или на которые ему предоставлено какое-то разрешение. Таким образом, ваш пользователь должен получить некоторое разрешение на элементы, которые он ищет. Предоставление пользователю VIEW DEFINITION в схемах в базе данных позволит запросу работать без предоставления доступа к каким-либо данным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...