行级别安全性

借助列级别安全性,客户可以根据用户的执行上下文或组成员身份,控制对表列的访问。

列级别安全性简化了应用程序中的安全性设计和编程,使你能够限制列访问权限以保护敏感数据。 例如,确保具体用户只能访问表中与其部门相关的特定列。 访问限制逻辑位于数据库层中,而不是在另一个应用层中远离数据。 每当有任何一层的数据访问请求,数据库就会应用访问限制。 此限制会减少整个安全系统的外围应用,从而提高安全措施的可靠性。 此外,使用列级别安全性还无需引入用于筛选掉列的视图以限制用户访问。

可以使用 GRANT Object Permissions T-SQL 语法实现列级别安全性。 使用此机制时,支持 SQL 身份验证和 Microsoft Entra ID(以前是 Azure Active Directory)身份验证。

另请考虑基于 WHERE 子句筛选器对表强制实施行级别安全性的能力。

Diagram shows a schematic table with the first column headed by a closed padlock and its cells an orange color while the other columns are white cells.

语法

对象权限的语句 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)、电话号码和其他个人数据。
  • 医疗保健提供商只允许医生和护士访问敏感病史档案,不允许计费部门成员查看此类数据。

后续步骤