我在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
所以用户似乎有权限(特别是select,它稍后会声明这不是该用户拥有的权限)
然后运行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:pythoncloudbox.cloudboxlibsite-packagessqlserver_adodbapi.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固定数据库角色的成员资格。
我可以找到一个完整的角色列表来放置这个用户,但是没有一个是sysadmin。这个角色隐藏在哪里?
如果我立即重新运行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特权?但是上面显示是否有选择权限?
是否有一些魔法授予select特权?
所以,现在情节变厚了。我让sql用户'django' 自己的数据库。现在,一切正常,一切创建,没有错误,南迁移工作.....
但我不希望我的webserver用户是数据库的"所有者"。我希望它能像select,insert,update,alter,delete,references
那样。但似乎我不能只给它一组有限的权限,让它完成这个角色。这看起来很像以管理员身份运行XP,这是没有意义的。
我在权限上做错了什么?为什么webserver db用户必须拥有这个数据库?
一些答案:
1) sysadmin
是服务器角色,而不是像db_owner
那样是数据库角色。它比让你的用户成为数据库所有者要强大得多,所以你肯定不想把它给出去。
2)由于一些神秘的原因,对象访问权限必须有效地授予数据库(django)和模式(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
应该只由管理员而不是应用程序的用户执行,或您应该使用EXECUTE As OWNER
创建一个存储过程来执行DBCC授权过程,然后将用户授权到该存储过程(如果他们已经授权到模式,如上所述),最后将syncdb
更改为调用该过程而不是直接执行DBCC。
-
systemm是服务器角色。
-
第二个错误发生在一个名为Amegy的数据库
不应该在部署和运行应用程序代码时使用同一个用户。它们是不同的角色,具有不同的权限要求。
Django的syncdb命令需要启用/禁用约束,它是数据库API的一部分。