db_ddladmin vs db_owner
З того, що я можу сказати з того, що я тестував і читав, здебільшого ваш список виглядає точним, за винятком випадків, чи db_ddladmin
дозволяєте ви CREATE SCHEMA
. Я підтвердив, що в інших дозволах безпеки, які ви перераховували, насправді було відхилено.
Заборонено лише DDLADMIN:
[ALTER ANY USER]
[BACKUP DATABASE]
, [BACKUP LOG]
,[CHECKPOINT]
[ALTER ANY APPLICATION ROLE]
, [ALTER ANY ROLE]
[DROP DATABASE]
Зазначаючи, що. . .
db_datareader
дозволить SELECT
отримати доступ до всіх таблиць
db_datarwriter
дозволить INSERT
, UPDATE
і DELETE
доступ до всіх таблиць
db_executor
дозволить EXECUTE
отримати доступ до всіх виконуваних об’єктів
Крім того, наявність дозволів на роль db_ddladmin може означати. . .
Примітка. Оскільки у 2005–2014 рр. У вас так багато різних версій SQL Server, можливо, найкраще буде невеликий набір користувачів тестувати це спочатку, щоб побачити, хто кричить, щоб виправити будь-які перегини тощо.
Об'єкти, які їм належать з цією роллю, не будуть належати DBO, тому вам, можливо, доведеться мати справу з проблемами зміни власності, якщо коли-небудь буде проблема з чимось на цьому рівні. Я не на 100% впевнений, що це буде проблемою, але це варто згадати про всяк випадок.
Джерело: Ланки власності
Завдяки цій ролі (може змінюватися залежно від версії SQL Server) вони можуть мати змогу додавати принципи безпеки SQL, визначені в поточній БД, до об'єктів, якими вони ще володіють, тільки не всі об'єкти (ті, якими вони не володіють), або додавати новий сервер -рівень, визначений головним до рівня БД.
Крім того, відсутність дозволів на роль DBO може означати. . .
Примітка. Оскільки у 2005–2014 рр. У вас так багато різних версій SQL Server, можливо, найкраще буде невеликий набір користувачів тестувати це спочатку, щоб побачити, хто кричить, щоб виправити будь-які перегини тощо.
Відсутність ролі DBO може перешкоджати заповненню чи відкриттю певних інтерфейсів інтерфейсу дизайнера SSMS (варіюється версія SQL Server) без помилок (наприклад, при зміні таблиць або стовпців через GUI), навіть якщо це робиться через T-SQL і працює, і дозволи мають місце . У деяких версіях SQL Server це може бути вирішено, якщо дозволити, GRANT VIEW DEFINITION
де це проблема, і це може бути лише попередженням лише для певних версій SQL Server.
Ресурси
Ви не ввійшли в систему як власник бази даних або як користувач, який є членом ролі db_owner. Ви не зможете зберегти зміни в таблицях, якими ви не володієте.
Роль db_ddladmin не дозволяє використовувати функції "дизайну" в SSMS
"Ми намагаємось не допустити надання користувачам / розробникам dbo у свої бази QA наскільки це можливо. Однією з проблем цього є те, що їм все ще потрібно мати можливість створювати та змінювати об'єкти бази даних, такі як користувацькі таблиці. Багато розробників нові для MS SQL і, таким чином, прагнуть дотримуватися графічного інтерфейсу (SSMS) для такої роботи. Проблема виникає, коли ми надаємо їм db_ddladmin (не dbo), і вони більше не можуть змінювати таблиці або стовпці за допомогою GUI дизайнера таблиць. їм потрібно зайняти додатковий час, щоб вивчити команди TSQL та їх синтаксис (який їм більше ніколи не знадобиться) або залучити команду DBA, яка забирає час від інших наших заходів.
Я не знаю, чи це помилка чи запит на функцію, але я вважаю це помилкою, оскільки користувач має достатньо дозволів для зміни таблиці через TSQL, але графічний інтерфейс передає їм повідомлення про те, що:
" Ви не ввійшли в систему як власник бази даних або системний адміністратор. Можливо, ви не зможете зберегти зміни в таблицях, які у вас не є." ТА "Таблиця [schema].[table]
встановлена лише для читання, користувач не має достатньо прав на цю таблицю. "
Слід, схоже, вказує на те, що чек є is_member ('db_owner'), який буде виключати членів db_ddladmin, хоча вони насправді мають дозвіл на зміну об'єкта. Майстерня управління Microsoft SQL Server "
Опубліковано агентом DBA 25.01.2010 о 7:06 ранку
У мене виникло подібне питання, і мені вдалося вирішити його, виконавши наступний грант
GRANT view definition on schema:: <schemaname> to <username>
Інші міркування
Оскільки ви заявляєте, що це перевіряється в кожному конкретному випадку
Один з дозволів, які наразі обмежені, є дозволами db_owner.
Цей дозвіл переглядається в кожному конкретному випадку, але загальною зміною є заміна дозволів db_owner на таке:
- db_datareader
- db_datawriter
- db_ddladmin
- db_executor
Чи ви розглядали можливість створення додаткових спеціальних ролей для отримання більш доступного для всіх "об'єктів" рівня DB, а не надання їм db_ddladmin
ролі, оскільки це, ймовірно, дасть їм більше, ніж їм потрібно для об'єктів рівня БД.
Зазвичай я даю саме те, що потрібно, і більше нічого, щоб вони виконували свою роботу, і якщо є "звичайна" або "стандартна" потреба в доступі до об'єктів рівня БД до всіх об'єктів у БД, я створюю власну роль БД на зразок db_executor
але дивіться мій нижній приклад. Таким чином, ви можете надати людям те, що їм насправді потрібно, для ВСІХ об’єктів DB у певній БД, якщо ви не отримуєте явного рівня об’єктів у ваших БД для їх безпеки.
----Custom Database Roles
/* CREATE A NEW ROLE -- Execute to all stored procs including newly created ones*/
-- Database specific
CREATE ROLE db_All_StoredProc_Execute
GRANT EXECUTE TO db_All_StoredProc_Execute
/* CREATE A NEW ROLE -- Alter to all stored procs including newly created ones*/
-- Database specific
CREATE ROLE db_All_StoredProc_Alter
GRANT ALTER ANY SCHEMA TO db_All_StoredProc_Alter
/* CREATE A NEW ROLE -- View Definition to all stored procs including newly created ones*/
-- Database specific
CREATE ROLE db_All_StoredProc_View
GRANT VIEW DEFINITION TO db_All_StoredProc_View
/* CREATE A NEW ROLE - Any schema alter and create procedure permissions */
-- Database specific
CREATE ROLE db_All_CreateProc_AlterSchema
GRANT ALTER ANY SCHEMA TO db_All_CreateProc_AlterSchema
GRANT CREATE PROCEDURE TO db_All_CreateProc_AlterSchema
GO
/* CREATE A NEW ROLE - Any schema alter and create table permissions */
-- Database specific
CREATE ROLE db_All_CreateTable_AlterSchema
GRANT ALTER ANY SCHEMA TO db_All_CreateTable_AlterSchema
GRANT CREATE TABLE TO db_All_CreateTable_AlterSchema
/* CREATE A NEW ROLE - Any schema alter and create function permissions */
-- Database specific
CREATE ROLE db_All_CreateFunction_AlterSchema
GRANT ALTER ANY SCHEMA TO db_All_CreateFunction_AlterSchema
GRANT CREATE FUNCTION TO db_All_CreateFunction_AlterSchema
/* CREATE A NEW ROLE - Any schema alter and create aggregate permissions */
-- Database specific
CREATE ROLE db_All_CreateAggregate_AlterSchema
GRANT ALTER ANY SCHEMA TO db_All_CreateAggregate_AlterSchema
GRANT CREATE AGGREGATE TO db_All_CreateAggregate_AlterSchema
/* CREATE A NEW ROLE - Any schema alter and create view permissions */
-- Database specific
CREATE ROLE db_All_CreateView_AlterSchema
GRANT ALTER ANY SCHEMA TO db_All_CreateView_AlterSchema
GRANT CREATE VIEW TO db_All_CreateView_AlterSchema
/* CREATE A NEW ROLE - Any schema alter and create schema permissions */
-- Database specific
CREATE ROLE db_All_CreateSchema_AlterSchema
GRANT ALTER ANY SCHEMA TO db_All_CreateSchema_AlterSchema
GRANT CREATE SCHEMA TO db_All_CreateSchema_AlterSchema
Я також хотів поділитися роллю db_DDLAdmin_Restriction, яку ви можете розглянути як створити інакше з явним DENY
обмеженням db_ddladmin
доступу, щоб ви могли принаймні створити це в БД, де ви надаєте їм цю роль і встановите явне DENY
для фактичних типів об'єктів тощо. ви не хочете, щоб вони мали доступ.
Наприклад, якщо ви знаєте , що вони, безумовно , буде створювати збережені процедури і функції, ви можете виключити DENY CREATE FUNCTION
, DENY CREATE PROCEDURE
, DENY ALTER ANY SCHEMA
.
---Create ddladmin restriction custom DB role
DENY ALTER ANY ASSEMBLY TO db_DDLAdmin_Restriction
DENY ALTER ANY ASYMMETRIC KEY TO db_DDLAdmin_Restriction
DENY ALTER ANY CERTIFICATE TO db_DDLAdmin_Restriction
DENY ALTER ANY CONTRACT TO db_DDLAdmin_Restriction
DENY ALTER ANY DATABASE DDL TRIGGER TO db_DDLAdmin_Restriction
DENY ALTER ANY DATABASE EVENT NOTIFICATION TO db_DDLAdmin_Restriction
DENY ALTER ANY DATASPACE TO db_DDLAdmin_Restriction
DENY ALTER ANY FULLTEXT CATALOG TO db_DDLAdmin_Restriction
DENY ALTER ANY MESSAGE TYPE TO db_DDLAdmin_Restriction
DENY ALTER ANY REMOTE SERVICE BINDING TO db_DDLAdmin_Restriction
DENY ALTER ANY ROUTE TO db_DDLAdmin_Restriction
DENY ALTER ANY SCHEMA TO db_DDLAdmin_Restriction
DENY ALTER ANY SERVICE TO db_DDLAdmin_Restriction
DENY ALTER ANY SYMMETRIC KEY TO db_DDLAdmin_Restriction
DENY CHECKPOINT TO db_DDLAdmin_Restriction
DENY CREATE AGGREGATE TO db_DDLAdmin_Restriction
DENY CREATE DEFAULT TO db_DDLAdmin_Restriction
DENY CREATE FUNCTION TO db_DDLAdmin_Restriction
DENY CREATE PROCEDURE TO db_DDLAdmin_Restriction
DENY CREATE QUEUE TO db_DDLAdmin_Restriction
DENY CREATE RULE TO db_DDLAdmin_Restriction
DENY CREATE SYNONYM TO db_DDLAdmin_Restriction
DENY CREATE TABLE TO db_DDLAdmin_Restriction
DENY CREATE TYPE TO db_DDLAdmin_Restriction
DENY CREATE VIEW TO db_DDLAdmin_Restriction
DENY CREATE XML SCHEMA COLLECTION TO db_DDLAdmin_Restriction
DENY REFERENCES TO db_DDLAdmin_Restriction
GO