Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 无法授予、拒绝或撤消对sa、dbo、实体所有者、信息\u架构、sys或您自己的权限_Sql_Sql Server - Fatal编程技术网

Sql 无法授予、拒绝或撤消对sa、dbo、实体所有者、信息\u架构、sys或您自己的权限

Sql 无法授予、拒绝或撤消对sa、dbo、实体所有者、信息\u架构、sys或您自己的权限,sql,sql-server,Sql,Sql Server,今天我一直在读关于用户,登录,创建,授予,等等的书,但我不明白背后的逻辑 据我所知,登录是对服务器级别的访问,而用户是对数据库级别的访问。这是正确的吗?如果是,那真正的意思是什么 我把服务器想象成一个有很多文件柜的房间。登录允许我访问房间,但不一定要访问部分/所有机柜,而用户允许我访问特定机柜。如果这个类比是正确的,那么执行以下命令的意义是什么 CREATE USER testusername WITHOUT LOGIN 我的意思是,让一个拥有“钥匙”的用户打开一些橱柜(由命令GRANT授予的

今天我一直在读关于
用户
登录
创建
授予
,等等的书,但我不明白背后的逻辑

据我所知,
登录
是对服务器级别的访问,而
用户
是对数据库级别的访问。这是正确的吗?如果是,那真正的意思是什么

我把服务器想象成一个有很多文件柜的房间。
登录
允许我访问房间,但不一定要访问部分/所有机柜,而
用户
允许我访问特定机柜。如果这个类比是正确的,那么执行以下命令的意义是什么

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.
然后,我尝试删除登录名和用户,但出现以下错误:

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.

我做错了什么?

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

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

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


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

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

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

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


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

您可以共享整个代码吗steps@TheGameiswar我已经编辑了这篇文章,添加了脚本的最后一部分。我运行了你的整个脚本,无法重新编写该问题。你可以共享你的全部代码吗steps@TheGameiswar我已经编辑了这篇文章,添加了脚本的最后一部分。我运行了整个脚本脚本,我无法重新编写该问题