Разрешения MSSQL не имеют смысла в MSSQL2008
Я создаю базу данных в Management Studio. Добавлен SQL-аутентифицированный пользователь в список пользователей для БД.
Я установил (предоставил) права доступа так:
use DjangoDB;
grant select,insert,update,alter,delete,references to django;
select
a.*,
b.name
from sys.database_permissions a
inner join sys.database_principals b
on a.grantee_principal_id = b.principal_id
and b.name = 'django'
Вывод этой команды:
class class_desc major_id minor_id grantee_principal_id grantor_principal_id type permission_name state state_desc name
0 DATABASE 0 0 5 1 AL ALTER G GRANT django
0 DATABASE 0 0 5 1 CO CONNECT G GRANT django
0 DATABASE 0 0 5 1 DL DELETE G GRANT django
0 DATABASE 0 0 5 1 IN INSERT G GRANT django
0 DATABASE 0 0 5 1 RF REFERENCES G GRANT django
0 DATABASE 0 0 5 1 SL SELECT G GRANT django
0 DATABASE 0 0 5 1 UP UPDATE G GRANT django
Таким образом, у пользователя, кажется, есть разрешения (особенно выберите, который он позже будет утверждать, что у этого пользователя нет разрешения)
Тогда я бегу python manage.py syncdb
Syncing...
Creating tables ...
Creating table auth_permission
Creating table auth_group_permissions
Creating table auth_group
Creating table auth_user_user_permissions
Creating table auth_user_groups
Creating table auth_user
...
и я (иногда) получаю ошибку вроде:
File "E:\python\cloudbox\.cloudbox\lib\site-packages\sqlserver_ado\dbapi.py", line 99, in standardErrorHandler
raise errorclass(errorvalue)
DatabaseError: (-2147352567, 'Exception occurred.', (0, u'Microsoft OLE DB Provider for SQL Server', u"User 'django' does not have permission to run DBCC checkconstraints for database 'DjangoDB'.", None, 0, -2147217900), None)
Command:
DBCC CHECKCONSTRAINTS
Parameters:
[]
Когда я смотрю на эту ошибку, она говорит:
Требуется членство в предопределенной роли сервера sysadmin или предопределенной роли базы данных db_owner.
Я могу найти целый список ролей, в которые можно поставить этого пользователя, но ни одна из них не является сисадмином. Где эта роль скрыта?
Если я немедленно перезапущу syncdb, ничего не меняя, я получу другую ошибку:
sqlserver_ado.dbapi.DatabaseError: (-2147352567, 'Exception occurred.', (0, u'Microsoft OLE DB Provider for SQL Server', u"The SELECT permission was denied on the object 'django_content_type', database 'DjangoDB', schema 'dbo'.", None, 0, -2147217911), None)
Command:
SELECT [django_content_type].[id], [django_content_type].[name], [django_content_type].[app_label], [django_content_type].[model] FROM [django_content_type] WHERE ([django_content_type].[model] = ? AND [django_content_type].[app_label] = ? )
Parameters:
[Name: p0, Dir.: Input, Type: adBSTR, Size: 10, Value: "permission", Precision: 0, NumericScale: 0, Name: p1, Dir.: Input, Type: adBSTR, Size: 4, Value: "auth", Precision: 0, NumericScale: 0]
Теперь он говорит, что у пользователя нет привилегии SELECT? Но выше это показывает, что он имеет право выбора?
Есть ли какая-то магия в предоставлении привилегии выбора?
Итак, теперь сюжет утолщается. Я делаю пользователя sql 'django' СОБСТВЕННОЙ базы данных. Теперь все будет работать, все создает, ошибок нет, миграция на юг работает.....
Но я не хочу, чтобы мой пользователь веб-сервера был "владельцем" БД. Я хочу, чтобы он мог делать такие вещи, как select,insert,update,alter,delete,references
, Но, похоже, я не могу просто дать ему ограниченный набор разрешений, чтобы он мог выполнять эту роль. Это похоже на запуск XP под учетной записью администратора, что НЕ имеет смысла.
Что я делаю не так с разрешениями? Почему пользователь базы данных веб-сервера должен владеть этой базой данных?
3 ответа
Некоторые ответы:
1) sysadmin
это роль сервера, а не роль базы данных, как db_owner
, Это намного мощнее, чем сделать своего пользователя владельцем базы данных, поэтому вы определенно не хотите его выдавать.
2) По причинам, которые являются чем-то загадочным, разрешения на доступ к объектам должны быть эффективно предоставлены как для базы данных (DjangoDB), так и для схемы (dbo). Вы уже сделали базу данных, теперь вы должны сделать то же самое для схемы. Вот что эти команды могут быть в T-SQL:
GRANT DELETE ON SCHEMA::[dbo] TO [django]
GRANT EXECUTE ON SCHEMA::[dbo] TO [django]
GRANT INSERT ON SCHEMA::[dbo] TO [django]
GRANT REFERENCES ON SCHEMA::[dbo] TO [django]
GRANT SELECT ON SCHEMA::[dbo] TO [django]
GRANT UPDATE ON SCHEMA::[dbo] TO [django]
GRANT VIEW DEFINITION ON SCHEMA::[dbo] TO [django]
3) Что касается DBCC
, это очень мощная служебная команда, следовательно, она требует мощных разрешений. Вы можете предоставить своему пользователю db_owner
роль вместо того, чтобы сделать их владельцем базы данных, но на самом деле это не намного лучше. В идеале, либо ваш syncdb
должен выполняться только администратором, а не пользователями вашего приложения, или вы должны создать хранимую процедуру, чтобы DBCC авторизовал процесс с помощью EXECUTE As OWNER
затем авторизуйте пользователя для этого хранимого процесса (уже сделано, если они авторизованы для схемы, как указано выше), и, наконец, syncdb
изменил вызов этой процедуры вместо того, чтобы делать DBCC напрямую.
Вы не должны использовать одного и того же пользователя для обоих развертываний и выполнения кода приложения. Это разные роли с разными требованиями к разрешениям.
Команде Django syncdb требуется возможность включать / отключать ограничения, и она является частью его API базы данных.
sysadm - это роль сервера.
Вторая ошибка происходит с базой данных под названием Amegy