今天我一直在阅读有关USER
,LOGIN
,CREATE
,GRANT
等的信息,但我还没有得到它背后的逻辑
据我所知,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.
我做错了什么?
答案 0 :(得分:2)
您的房间和内阁类比基本上是正确的。登录是服务器(或更准确的SQL实例)级主体,而用户是数据库级主体。
没有登录的用户可以被认为是锁在房间里的文件职员(从不从外面进入房间)并被分配到单个文件柜。没有登录的用户的安全上下文仅限于该数据库。
您的“主密钥”类比映射到服务器角色。例如,作为sysadmin服务器角色成员的登录名可以完全控制SQL实例上的所有数据库,并自动映射到所有数据库中的dbo用户。
运行脚本后出现错误的原因是您仍在测试用户的上下文中运行。您需要执行REVERT;
才能返回原始安全上下文。