Column-Level 安全性允许客户根据用户的执行上下文或组成员身份控制对表列的访问。
列级安全性简化了应用程序中的安全性设计和编码,允许限制列访问以保护敏感数据。 例如,确保特定用户只能访问与其部门相关的表的某些列。 访问限制逻辑位于数据库层中,而不是在另一个应用层中远离数据。 每次从任何层尝试数据访问时,数据库都会应用访问限制。 通过减少您整体安全系统的攻击面,此限制使安全性更加稳固且可靠。 此外,列级安全性还消除了引入视图以筛选出列以对用户施加访问限制的需要。
可以使用 GRANT 对象权限 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
访问 SSN
表的 Membership
列:
创建 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;
执行为TestUser
的查询若包含SSN
列则会失败。
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)、电话号码和其他个人数据。
- 医疗保健提供商只允许医生和护士访问敏感医疗记录,同时阻止计费部门的成员查看此数据。