0

我在 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,这是没有意义的。

我在权限上做错了什么?为什么网络服务器数据库用户必须拥有这个数据库?

4

3 回答 3

2

一些答案:

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 授权 proc EXECUTE As OWNER,然后授权用户使用该存储过程(如果他们被授权,则已经完成schema,如上所述),最后syncdb更改为调用该过程而不是直接执行 DBCC。

于 2013-05-05T03:37:17.290 回答
0
  1. sysadm 是一个服务器角色。

  2. 第二个错误是针对名为 Amegy 的数据库发生的

于 2013-05-05T03:35:36.153 回答
0

您不应将同一用户用于部署和运行应用程序代码。它们是具有不同权限要求的不同角色。

Django 的 syncdb 命令需要启用/禁用约束的能力,并且是其数据库 API 的一部分。

于 2013-05-05T14:05:18.687 回答