SQL Server 關於列的權限控制


    在SQL SERVER中列權限(Column Permissions)其實真沒有什么好說的,但是好多人對這個都不甚了解,已經被人問了幾次了,所以還是在這里介紹一下,很多人都會問,我能否單獨對表的某列授權給某個用戶? 答案是可以,我們可以對表中的列授予SELECT、UPDATE權限,我們結合下面的簡單案例來闡述一下可能效果更好。

    案例1: 在AdventureWorks2014中,登錄名UserA 只能有權限查詢[Person].[Person]里面的BusinessEntityID, NationalIDNumber, LoginID三個字段權限,不能查詢其它字段

USE [master]
GO
CREATE LOGIN [UserA] WITH PASSWORD=N'UserA', DEFAULT_DATABASE=[master], CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF
GO
USE [AdventureWorks2014]
GO
CREATE USER [UserA] FOR LOGIN [UserA]
GO

給用戶授予相關列的查詢權限(SELECT)

GRANT SELECT(BusinessEntityID, NationalIDNumber, LoginID) ON  [HumanResources].[Employee] TO [UserA]

此時你可以用下面SQL查看授予UserA的權限:

SELECT  dp.grantee_principal_id ,
        P.name AS UName ,
        dp.permission_name ,
        C.name ,
        OBJECT_NAME(O.object_id) AS TabName
FROM    sys.database_permissions dp
        INNER JOIN sys.objects O ON dp.major_id = O.object_id
        INNER JOIN sys.columns C ON C.object_id = O.object_id
                                    AND C.column_id = dp.minor_id
        INNER JOIN sys.database_principals P ON P.principal_id = dp.grantee_principal_id;

clipboard

 

以用戶UserA登錄,如下所示,如果查詢語句使用BusinessEntityID, NationalIDNumber, LoginID字段之外的其它字段,就會出現類似下面錯誤,當然也不能使用SELECT *之類的查詢語句。

Msg 230, Level 14, State 1, Line 8

The SELECT permission was denied on the column 'JobTitle' of the object 'Employee', database 'AdventureWorks2014', schema 'HumanResources'.

clipboard[1]

另外,也可以只授權用戶更新某個列,例如對於登錄名UserB,只允許其修改Person.Address的AddressLine1,AddressLine2兩個字段,其它字段不許修改。

GRANT UPDATE(AddressLine1,AddressLine2) ON [Person].[Address] TO UserB;
 
SELECT  dp.grantee_principal_id ,
        P.name AS UName ,
        dp.permission_name ,
        C.name ,
        OBJECT_NAME(O.object_id) AS TabName
FROM    sys.database_permissions dp
        INNER JOIN sys.objects O ON dp.major_id = O.object_id
        INNER JOIN sys.columns C ON C.object_id = O.object_id
                                    AND C.column_id = dp.minor_id
        INNER JOIN sys.database_principals P ON P.principal_id = dp.grantee_principal_id
WHERE P.name='UserB'

clipboard[2]

 

另外,關於DELETE、INSERT權限,這個是沒有所謂的列權限(Column Permissions)的,其實從邏輯上想想,你也能明白,這這兩者對應的最小單位為一條記錄,所以根本不能再細化到列級別了。

Msg 1020, Level 15, State 1, Line 36

Sub-entity lists (such as column or security expressions) cannot be specified for entity-level permissions.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM