Я програміст, а не дба ... Я знаю просто так, щоб бути небезпечним.
Я успадкував базу даних із застарілим користувачем, який є власником db_owner для бази даних. Ми не можемо коригувати дозвіл цього користувача для існуючих таблиць, схем тощо з бізнес-причин, але створюються нові таблиці, і я хочу лише, щоб цей користувач мав доступ до них SELECT.
Для цього користувача встановлено дозволи для цього користувача, щоб усе було DENIED, крім SELECT, для якого встановлено GRANT.
Однак коли цей користувач (dbadmin) намагається виконати SELECT в одній із цих таблиць (AccountingAudit), ця помилка трапляється:
The SELECT permission was denied on the object 'AccountingAudit', database 'billing', schema 'dbo'.
Я запустив цей SQL, щоб перевірити, які дозволи встановлені для цієї таблиці / користувача:
select object_name(major_id) as object,
user_name(grantee_principal_id) as grantee,
user_name(grantor_principal_id) as grantor,
permission_name,
state_desc
from sys.database_permissions
І ось що я повертаю:
AccountingAudit dbadmin dbo ALTER DENY
AccountingAudit dbadmin dbo CONTROL DENY
AccountingAudit dbadmin dbo DELETE DENY
AccountingAudit dbadmin dbo INSERT DENY
AccountingAudit dbadmin dbo REFERENCES DENY
AccountingAudit dbadmin dbo SELECT GRANT
AccountingAudit dbadmin dbo TAKE OWNERSHIP DENY
AccountingAudit dbadmin dbo UPDATE DENY
AccountingAudit dbadmin dbo VIEW DEFINITION DENY
AccountingAudit dbadmin dbo VIEW CHANGE TRACKING DENY
Здається, це має працювати так?
Виклик SELECT, який я здійснюю, є дуже базовим SELECT * FROM AccountingAudit, зсередини SSMS. Я не роблю спеціального sp_executesql або чогось подібного.
Я спробував явно надати дозвіл:
GRANT SELECT ON [dbo].AccountingAudit TO dbadmin
Це не впливає (чому б це зробити, вищезазначений запит уже показує, що це надано! ;-)
Я шукав stackoverflow.com та інші місця, і не можу знайти нічого, чого я ще не пробував. Мені цікаво, чи має це щось спільне з налаштуванням схем. (На даний момент я дуже мало знаю про схеми.)
Будь-які ідеї? Дякую!