无法授予,拒绝或撤消对sa,dbo,实体所有者,information_schema,sys或您自己的权限

时间:2016-11-20 13:30:21

标签: sql sql-server

今天我一直在阅读有关USERLOGINCREATEGRANT等的信息,但我还没有得到它背后的逻辑

据我所知,LOGIN是对服务器级别的访问,而USER是对数据库级别的访问。它是否正确?如果是这样,那究竟意味着什么?

我想把服务器当成一个有很多文件柜的房间。 LOGIN让我可以进入房间,但不一定能进入某些/所有机柜,而USER则可以访问一个明确的内阁。如果这个比喻是正确的,那么有什么意义,例如,执行以下命令

CREATE USER testusername WITHOUT LOGIN

我的意思是,让用户拥有“键”的重点是什么?打开一些柜子(由GRANT命令授予的钥匙)但不允许他进入房间。

是否有'主密钥'哪个允许用户访问房间里的所有文件柜?

最后我试图看看它是如何工作的,但我遇到了一些问题。

我尝试了以下内容:

        CREATE LOGIN testl
            WITH PASSWORD = 'test'

        CREATE USER test
            FOR LOGIN testl


        GRANT SELECT, INSERT, UPDATE ON Doctor TO test

        SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED


        BEGIN TRANSACTION
            EXECUTE AS USER = 'test'
                SELECT *
                    FROM Doctor

                INSERT INTO Doctor VALUES ('Johnson', 'Jack',2)

                UPDATE Doctor SET Dep_ID=2 WHERE Doc_ID=71

                SELECT *
                    FROM Doctor

        REVERT

        ROLLBACK

        REVOKE SELECT, UPDATE, INSERT ON Doctor FROM test

        /*DROP USER test
        DROP LOGIN testl*/

所有似乎都运行良好,但在回滚此事务并尝试撤销Test的权限后,我收到以下错误:

Cannot grant, deny, or revoke permissions to sa, dbo, entity owner, information_schema, sys, or yourself.

然后我尝试删除登录和用户,我收到以下错误:

Msg 15151, Level 16, State 1, Line 2
Cannot drop the user 'test', because it does not exist or you do not have permission.
Msg 15151, Level 16, State 1, Line 3
Cannot drop the login 'testl', because it does not exist or you do not have permission.

我做错了什么?

1 个答案:

答案 0 :(得分:2)

您的房间和内阁类比基本上是正确的。登录是服务器(或更准确的SQL实例)级主体,而用户是数据库级主体。

没有登录的用户可以被认为是锁在房间里的文件职员(从不从外面进入房间)并被分配到单个文件柜。没有登录的用户的安全上下文仅限于该数据库。

您的“主密钥”类比映射到服务器角色。例如,作为sysadmin服务器角色成员的登录名可以完全控制SQL实例上的所有数据库,并自动映射到所有数据库中的dbo用户。

运行脚本后出现错误的原因是您仍在测试用户的上下文中运行。您需要执行REVERT;才能返回原始安全上下文。