Дозвіл SELECT відхилено для об'єкта 'Користувачі', бази даних 'XXX', схеми 'dbo'


83

Я перемістив базу даних із SQL Server 2012 в Azure. Я не хочу користуватися користувачем master, тому я створив користувача test. Це те, що я зробив для бази даних XXX на Azure:

create user test from login test with default_schema=[dbo]
exec sp_addrolemember 'db_owner','test'

Я перевірив, і всі об’єкти бази даних, які мене цікавлять, знаходяться у схемі dbo. Таблиця Usersє на схемі dbo.

Рядок підключення в моєму веб-проекті має testім'я для входу. Він видає повідомлення про помилку:

The SELECT permission was denied on the object 'Users', database 'XXX', schema 'dbo'

Що означає повідомлення про помилку і що я можу зробити, щоб дозволити користувачеві testотримати доступ до бази даних XXX?


Дякую за це запитання :)
Kamlesh

Відповіді:


76

Я думаю, що проблема полягає в тому, що користувач має заборону на привілеї . Ця помилка виникає, коли створений вами користувач не має достатніх привілеїв для доступу до ваших таблиць у базі даних. Надайте привілеї користувачеві, щоб отримати бажане.

НАДАЙТЕ спеціальні дозволи користувача, такі як ВИБРАТИ, ВСТАВИТИ, ОНОВИТИ та ВИДАЛИТИ для таблиць у цій базі даних.


3
Іноді вам не вистачить параметрів читання даних db / власника баз даних? windowstechinfo.com/2014/09/…
Аравінда,

5
Мені довелося зняти прапорці 'db_denydatareader' та 'db_denydatawriter', і, мабуть, саме це означає SaeX під "відкликати". Дякую SaeX.
Ага.

@AH. У мене була така ж проблема, як і у вас, тому я написав відповідь на це запитання. Перевірте це, якщо у вас буде шанс
Каньйон Колоба

Ви рятувальник, спасибі :)
Kamlesh

58
  1. Відкрийте SQL Management Studio
  2. Розширте свою базу даних
  3. Розгорніть папку "Безпека"
  4. Розгорніть "Користувачі"
  5. Клацніть правою кнопкою миші користувача (того, хто намагається виконати запит) і виберіть Properties.
  6. Виберіть сторінку Membership.
  7. Обов’язково зніміть прапорець

    db_denydatareader

    db_denydatawriter

введіть тут опис зображення

Про це слід говорити само собою, а надавати дозволи лише тому, що потрібно користувачеві. Легким ледачим виправленням є перевірка, db_ownerяк у мене, але це не найкраща практика безпеки.


4
Ви рятувальник, спасибі :)
Kamlesh

1
Ви врятували мені ГОДИНИ марнотратства, гуглінгу та розчарування!
Скотт Флемінг

2
Багато з нас просто вибирають їх усіх, припускаючи, що ми отримаємо всі дозволи. Однак є denyтеж
Murali Муругесана

30

Синтаксис надання дозволу на вибір у певній таблиці:

USE YourDB;

GRANT SELECT ON dbo.functionName TO UserName;

Щоб надати дозвіл на вибір для всіх таблиць бази даних:

USE YourDB;

GRANT SELECT TO UserName;

2
Вперше я зробив це, тому я не впевнений, що це було правильно, але я хотів надати дозвіл на вибір для всієї бази даних, тому я зробив GRANT SELECT TO UserName і залишив пункт ON. Це спрацювало.
Rich Rich

18

Ось як я зміг вирішити проблему, зіткнувшись із нею

  1. Запустіть SQL Management Studio.
  2. Розгорніть вузол сервера (у «Провіднику об’єктів»).
  3. Розгорніть вузол баз даних, а потім розгорніть конкретну базу даних, до якої ви намагаєтесь отримати доступ, використовуючи конкретного користувача.
  4. Розгорніть вузол «Користувачі» під вузлом «Безпека» для бази даних.
  5. Клацніть правою кнопкою миші конкретного користувача та натисніть "властивості". Ви отримаєте діалогове вікно.
  6. Переконайтеся, що користувач є членом групи db_owner (будь ласка, прочитайте коментарі нижче, перш ніж використовувати цей шлях) та інших необхідних змін, використовуючи представлення. (Я використовував це у 2016 році. Не впевнений, як виглядає конкретний діалог в іншій версії, а отже, не конкретний)

6
Будьте обережні, кого ви вводите в роль бази даних db_owner. Не всі користувачі повинні бути додані до цієї ролі.
Род,

1
@Rod Якщо надання db_owner не рекомендується, то який тип доступу рекомендується для взаємодії програми з базою даних?
Яків

1
Чи вистачило б публіки?
Род

2
@Jacob Для запису та читання даних у будь-якій таблиці є ідентифікатори db_datareader та db_datawriter. db_owner також дає дозвіл змінювати визначення таблиць.
Оскар Берггрен,

3
Це не працює, якщо користувач перевірив db_denydatareadeабоdb_denydatawriter
Kolob Canyon


0

Перевірте простір вашої бази даних. Ця помилка виникає, коли простір збільшується порівняно з простіром, наданим базі даних.


Також змініть ідентифікатор і пароль бази даних
Нілеш

0

Використовуючи SSMS, я переконався, що користувач має дозволи на підключення як до бази даних, так і до ReportServer.

У конкретній базі даних, яка запитується, у розділі властивостей я зіставив їх облікові дані та ввімкнув читання даних та загальнодоступні дозволи. Крім того, як заявляли інші, я переконався, що не вибрано жодного поля заперечення / заперечення.

Я не хотів вмикати право власності на db, коли для їхніх звітів, оскільки вони мали лише дозволи на вибір.


-1

Я вирішую свою проблему, роблячи це. [ВАЖЛИВА ПРИМІТКА. Це дозволяє ескалації (розширення) привілеїв для певного облікового запису, можливо, більше, ніж потрібно для окремого сценарію].

  1. Перейдіть до " Object Explorer " у SQL Management Studio.
  2. Розгорніть Security , потім Ввійти .
  3. Виберіть користувача, з яким працюєте, клацніть правою кнопкою миші та виберіть Властивості Windows .
  4. У Виберіть сторінку перейдіть до Ролі сервера
  5. Клацніть на sysadmin і збережіть.

2
Не впевнений, чому ця відповідь була проголосована проти. Ця відповідь вирішила мою проблему. Отже, я проголосував.
Emran Hussain

9
Цю відповідь ПОВИННО голосувати проти, оскільки вона відверто повідомляє читачеві надати користувачеві об'єкт повний, повний і повний контроль над усім сервером, не пояснюючи і не попереджаючи, що це саме він робить. Виходячи з формулювання запитання та цієї відповіді, я думаю, існує певна небезпека, що користувачі-початківці застосують це "виправлення", не розуміючи повністю.
Оскар Берггрен,

3
Це варіант грубої сили, який не слід застосовувати. Якщо ви не розумієте, що це робить, тоді ви не повинні цього робити.
n8.

Кожен - не робіть цього у виробничому середовищі.
gotqn

Звичайно, я б не робив цього у виробництві, але це вирішило мою проблему (у середовищі розробника). Тож це заслуговує мого голосу. Дякую ccassob.
Fl4v

-2

Можливо, термін дії вашої підписки на панель Plesk або іншої підписки закінчився .... перевірте підписку End.


Будь ласка, надайте ще трохи опису щодо вашої відповіді
asolanki
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.