Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Как правильно проверить  [new]
igor2222
Member

Откуда: Харків
Сообщений: 1233
Подскажите плиз.
Есть несколько таблиц в БД Мастер.
Пользователь с неизвестными правами подконнектился к другой БД.
Нужно проверить, существует ли таблица в Мастере.
В 2000-м без проблем по object_id('master.dbo.моя_таблица)
А вот как в 2005-м?
Если права есть- то АйДи возвращается, а если нет- возвращается NULL.
При этом если прав не хватает, то желательно вернуть что-то типа -1.
9 сен 09, 18:50    [7638927]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно проверить  [new]
DeColo®es
Member

Откуда: Москва
Сообщений: 5499
Блог
На выбор:
1) Написать собственную функцию, внутри неё пользоваться execute as
2) Дать права процедуре/функции из п.1, используя сертификаты (например, как здесь)
3) Сделать GRANT VIEW DEFINITION TO public (будет, "как в 2000")
9 сен 09, 23:15    [7639527]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно проверить  [new]
aleks2
Guest
igor2222
Подскажите плиз.
Есть несколько таблиц в БД Мастер.
Пользователь с неизвестными правами подконнектился к другой БД.
Нужно проверить, существует ли таблица в Мастере.
В 2000-м без проблем по object_id('master.dbo.моя_таблица)
А вот как в 2005-м?
Если права есть- то АйДи возвращается, а если нет- возвращается NULL.
При этом если прав не хватает, то желательно вернуть что-то типа -1.


1. А какая разница пользователю, если он НЕ имеет доступа к этим таблицам?
2. Ежели всеж пользователь имеет доступ к master, а большинство имеют к ней доступ, то что бы не использовать INFORMATION_SCHEMA?
10 сен 09, 07:32    [7639886]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно проверить  [new]
DeColo®es
Member

Откуда: Москва
Сообщений: 5499
Блог
aleks2
1. А какая разница пользователю, если он НЕ имеет доступа к этим таблицам?
Не скажу, что конкретно у автора, но у нас получилась такая картина:
есть код в процедуре proc1:
if object_id('proc2') is not null
    exec proc2
У процедуры proc1 есть GRANT EXEC для public, у proc2 - соответственно нет.
Владелец процедур совпадает.
В 2000 все работало прекрасно, в 2005 exec proc2 выполняется, но object_id проверяет права не в контексте владельца обоих процедур, а в контексте пользователя, который proc2 "не видит".
Получили некоторое количество глюков. :)
10 сен 09, 10:54    [7640550]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно проверить  [new]
igor2222
Member

Откуда: Харків
Сообщений: 1233
Спасибо за ответы.
Но оптимального варианта всё же не вижу.
Есть два десятка серверов. Это и 2000 и 2005. На всех автостартует процедура, которая запускает трассировку и упаковывает результаты в таблицу. Естесственно процедура в мастере.
Если процедура автостартовала, а таблицы нет- то она создается.
Из клиентского приложения нужно посмотреть есть ли на данный момент эта таблица, и если нет- закрыть приложение.
Скажем так, собственная функция скорее всего отпадает по причине проблемы "защита от админа". Сертификаты- несколько проблематично. Сервер теоретически может быть МСДЕ на вин2000, а может быть 2008 на висте. Хотя может это и решение... Грант то паблик- точно нет. Пользователю нужно только знать есть таблица или нет. К INFORMATION_SCHEMA доступ есть, но отображаются только системные таблицы. Можно ли сделать видимой хотя бы одну, созданную из автостартованной процедуры?
Извините за ламерские вопросы. В оракле я бы скорее всего дал грант селект на вьюху с таблицами. Как это правильно сделать в МС с учетом и 2000-х и 2005-х серверов. Или может на крайний случай вариант такой- если пользователь имеет доступ к object_id('proc2') - то давать информацию, а если не имеет - не давать. Но чтобы не возвращался NULL, если объект существует, а прав не хватает. В таком случае вернуть -1 например.
10 сен 09, 11:24    [7640808]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно проверить  [new]
DeColo®es
Member

Откуда: Москва
Сообщений: 5499
Блог
Хм. Еще раз.
Если пользователь не может получать данные из таблицы - зачем знать, есть она или нет?
Если наличие этой таблицы служит каким-либо признаком, то лучше воспользоваться ДРУГИМ признаком наличия функционала в системе.

Насчет сертификатов - попробуйте сначала.
10 сен 09, 12:21    [7641247]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить