行级别安全性
借助列级别安全性,客户可以根据用户的执行上下文或组成员身份,控制对表列的访问。
列级别安全性简化了应用程序中的安全性设计和编程,使你能够限制列访问权限以保护敏感数据。 例如,确保具体用户只能访问表中与其部门相关的特定列。 访问限制逻辑位于数据库层中,而不是在另一个应用层中远离数据。 每当有任何一层的数据访问请求,数据库就会应用访问限制。 此限制会减少整个安全系统的外围应用,从而提高安全措施的可靠性。 此外,使用列级别安全性还无需引入用于筛选掉列的视图以限制用户访问。
可以使用 GRANT Object Permissions T-SQL 语法实现列级别安全性。 使用此机制时,支持 SQL 身份验证和 Microsoft Entra ID(以前是 Azure Active Directory)身份验证。
另请考虑基于 WHERE
子句筛选器对表强制实施行级别安全性的能力。
语法
对象权限的语句 GRANT
的语法允许对表上以逗号分隔的列列表授予权限。
GRANT <permission> [ ,...n ] ON
[ OBJECT :: ][ schema_name ]. object_name [ ( column [ ,...n ] ) ]
TO <database_principal> [ ,...n ]
[ WITH GRANT OPTION ]
[ AS <database_principal> ]
<permission> ::=
SELECT
| UPDATE
<database_principal> ::=
Database_user
| Database_role
| Database_user_mapped_to_Windows_User
| Database_user_mapped_to_Windows_Group
示例
下面的示例展示了如何限制 TestUser
访问 Membership
表的 SSN
列:
创建 Membership
表,其中包含用于存储社会安全号码的 SSN
列:
CREATE TABLE Membership
(MemberID int IDENTITY,
FirstName varchar(100) NULL,
SSN char(9) NOT NULL,
LastName varchar(100) NOT NULL,
Phone varchar(12) NULL,
Email varchar(100) NULL);
允许 TestUser
访问所有列,包含敏感数据的 SSN
列除外:
GRANT SELECT ON Membership(MemberID, FirstName, LastName, Phone, Email) TO TestUser;
如果包含 SSN
列,以 TestUser
身份执行的查询便会失败:
SELECT * FROM Membership;
生成如下错误:
Msg 230, Level 14, State 1, Line 12
The SELECT permission was denied on the column 'SSN' of the object 'Membership', database 'CLS_TestDW', schema 'dbo'.
用例
下面是目前的一些列级别安全性用例示例:
- 金融服务公司只允许客户经理访问客户的社会安全号码 (SSN)、电话号码和其他个人数据。
- 医疗保健提供商只允许医生和护士访问敏感病史档案,不允许计费部门成员查看此类数据。