1

我编写了一个简单的 c# 代码,连接到 sql-server 数据库并执行查询:

        cmd = new SqlCommand(txtQuery.Text.ToString().Trim(), con);
        cmd.ExecuteNonQuery();
  • 在我的数据库中,我有一个名为 myTB 的表。我也有两个用户:user1(所有者),user2(新用户创建)

  • 我使用user2的用户名和密码登录(连接到数据库) !

  • 我可以使用下面的查询访问由 user1 创建的表:

    “从 user1.myTB 中选择 *”

    (我不知道为什么这个查询会出错:“select * from myTB”,现在算了吧!)

  • 现在我想撤销 user2的“选择”权限。我的意思是我不希望 user2 对由 user1 创建的 myTB 表执行选择查询。

  • 我该怎么办是我被困在上面的问题!我使用了这个查询,但没有任何改变!

Q1:“从 user2 撤消对 user1.myTB 的选择”

再次 user2 可以从 user1.myTB 中选择 * !!!为什么 !?

请帮我解决一下这个。谢谢。

4

3 回答 3

1

You cannot REVOKE something you did not GRANT. Looks like you want to:

  1. investigate and understand why user2 has permission to SELECT
  2. possibly DENY permission to SELECT to user2

The permission work like following:

  • initialy an user has the poermissions derived from his group mebership (including public roles)
  • GRANT explictly grants a privilege
  • REVOKE takes back a previously granted priviledge, reverting to the user having the privileges implictily inherited from group(s) memberhip
  • DENY denies a privilege

The rules of precedence are that any DENY take precedence over any GRANT or inherited privilege. One can get access through a number of GRANTs but one single DENY will revoke the privilege. You cannot GRANT/REVOKE/DENY permissions to the securable owner (members of db_owner own everything and members of sysadmin own everything on the entire server).

于 2013-02-27T13:07:58.970 回答
1

user2 可能是从角色成员中获得它的权限。

跑:

use [<YourDatabase>]
GO

exec sp_helpuser

在第一列中找到用户,然后查看第二列。用户是db_datareaderor的成员db_owner吗?

如果是这样,您可以通过执行以下操作撤销成员资格,例如 db_datareader:

exec sp_droprolemember 'db_datareader', 'user2'
GO
于 2013-02-27T13:05:37.650 回答
0

谢谢朋友,我已经解决了,并使用 DENY 而不是 REVOKE :

DENY选择 ON user1.myTB TO user2

于 2013-03-01T10:44:50.690 回答