原文:https://blog.csdn.net/hfdgjhv/article/details/83834076
https://www.cnblogs.com/shi-yongcui/p/7755521.html
https://www.cnblogs.com/accumulater/p/6158387.html
https://www.cnblogs.com/xwdreamer/archive/2012/06/25/2562828.html
https://docs.microsoft.com/zh-cn/sql/t-sql/statements/grant-transact-sql?view=sql-server-2017
Grant命令:同意,授予==>授權;為主體授予安全對象的權限。
GRANT 【1】<某種權限> ON 【2】<某個對象> TO 【3】<某個用戶、登錄名或組> [WITH GRANT OPTION]
適用於: SQL Server(從 2008 開始)
其中:
【1】<某種權限>稱為“安全對象的權限”,【2】<某個對象>稱為“安全對象”,【3】<某個用戶、登錄名或組>稱為“主體”
【1】<某種權限>是由【2】<某個對象>決定的:不同安全對象擁有不同的權限
安全對象 | 權限 |
數據庫 | BACKUP DATABASE、BACKUP LOG、CREATE DATABASE、CREATE DEFAULT、CREATE FUNCTION、CREATE PROCEDURE、CREATE RULE、CREATE TABLE 和 CREATE VIEW |
標量函數 | EXECUTE 和 REFERENCES(參考文獻) |
表值函數 | DELETE、INSERT、UPDATE、SELECT 和 REFERENCES(參考文獻) |
存儲過程 | EXECUTE |
表 | DELETE、INSERT、UPDATE、SELECT 和 REFERENCES(參考文獻) |
視圖 | DELETE、INSERT、UPDATE、SELECT 和 REFERENCES(參考文獻) |
Deny命令:否認,拒絕==>禁用;為主體禁用安全對象的權限。
Deny 【1】<某種權限> ON 【2】<某個對象> TO 【3】<某個用戶、登錄名或組> [CASCADE]
適用於: SQL Server(從 2008 開始)
其余同Grant命令。
Revoke命令:撤銷,取消==>取消;從主體中取消已有安全對象的權限
Revoke 【1】<某種權限> ON 【2】<某個對象> From 【3】<某個用戶、登錄名或組>
適用於: SQL Server(從 2008 開始)
其余同Grant命令。
實例:在Sql Server 2012上添加一個登陸用戶test,使其只能查詢某個數據庫temp的某兩張表[dbo].[T_DD_OP201],[dbo].[T_DD_OP202]
分析:要想成功訪問 SQL Server 數據庫中的數據, 我們需要兩個方面的授權:1.獲得准許連接 SQL Server 服務器的權利;2. 獲得訪問特定數據庫中數據的權利(select, update, delete, create table ...)。
備注:操作時必須有管理員的權限
1.在當前數據庫temp中創建數據庫角色testrole
exec sp_addrole '角色名'
exec sp_addrole 'testrole'
2. 給數據庫角色testrole分配權限,使其只能查詢兩張表
GRANT 權限 ON 表名 TO 角色名
GRANT SELECT ON dbo.T_DD_OP201 TO testrole
GRANT SELECT ON dbo.T_DD_OP202 TO testrole
3.創建登陸用戶
exec sp_addlogin '登陸用戶名','登陸用戶密碼','登陸用戶默認數據庫'
exec sp_addlogin 'test','test123456','temp'
這時候,test登陸帳戶就可以連接到 SQL Server 服務器上了。但是此時還不能訪問數據庫中的對象。要使 test帳戶能夠在temp數據庫中訪問自己需要的對象, 需要在數據庫temp中建立一個“數據庫用戶”,賦予這個“數據庫用戶” 某些訪問權限,並且把登陸帳戶test和這個“數據庫用戶” 映射起來
4.創建數據庫用戶
exec sp_adduser '登錄用戶名','數據庫用戶名','數據庫角色'【將Sql Server '登陸用戶名'賬戶添加到具有'數據庫用戶名'的賬戶的當前數據庫中,並將'數據庫用戶名'賬戶添加到'數據庫角色'中】
exec sp_adduser 'test','dbtestname','testrole'
備注:將 SQL Server 登錄名test添加到具有用戶名dbtestname的當前數據庫,並將數據庫用戶dbtestname添加到testrole數據庫角色中。這樣,登陸用戶和數據庫用戶就關聯起來了,當登陸用戶登錄后就可以訪問所有與它關聯的數據庫用戶所在的數據庫中的數據。
習慣上,“數據庫用戶名” 和 “登陸用戶名”的名字相同,即以上語句可以改為
exec sp_adduser 'test','test','testrole'
實例:數據庫用戶、角色、登錄的刪除操作
1.從數據庫角色中刪除用戶
EXEC sp_droprolemember 'testrole', 'dbtestname'
備注:需有管理員的權限,並在當前數據庫中執行
2.刪除當前數據庫用戶
EXEC sp_revokedbaccess 'dbtestname';
3.刪除數據庫角色
EXEC sp_droprole 'testrole'
4.刪除數據庫登錄
EXEC sp_droplogin 'test'
實例:在執行“EXEC sp_droplogin 'test'”刪除登陸名時發生錯誤:無法刪除登錄名 '***',因為該用戶當前正處於登錄狀態。 (Microsoft SQL Server,錯誤: 15434)
1.首先執行:EXEC sp_who 查出用戶進程的spid,
2.然后執行:kill spid
3.最后執行:sp_droplogin ‘用戶名’