Skip to content

SQLServer 权限管理

权限管理基础

权限体系

SQL Server 采用基于主体(Principal)和安全对象(Securable)的权限体系,通过授予、拒绝或撤销权限来控制主体对安全对象的访问。权限体系分为三个层级:

  • 服务器层级:控制对服务器资源的访问
  • 数据库层级:控制对数据库资源的访问
  • 架构层级:控制对数据库对象的访问

主体与安全对象

主体(Principal)

主体是可以请求 SQL Server 资源访问权限的实体,包括:

  • Windows 登录名:Windows 用户或组
  • SQL Server 登录名:SQL Server 内部创建的登录账号
  • 数据库用户:映射到登录名的数据库级别主体
  • 角色:服务器角色、数据库角色、应用程序角色
  • 应用程序角色:需要密码激活的特殊数据库角色

安全对象(Securable)

安全对象是可以被授予权限的资源,包括:

  • 服务器层级:端点、登录名、服务器角色
  • 数据库层级:数据库、数据库角色、证书、对称密钥、非对称密钥
  • 架构层级:表、视图、存储过程、函数、触发器、同义词等

权限类型

权限类别

  • 对象权限:控制对特定对象的操作,如 SELECT、INSERT、UPDATE、DELETE
  • 语句权限:允许执行特定的 T-SQL 语句,如 CREATE TABLE、CREATE VIEW
  • 暗示权限:主体固有的权限,如 sysadmin 服务器角色成员拥有所有权限

权限操作

  • GRANT:授予主体执行特定操作的权限
  • DENY:明确拒绝主体执行特定操作的权限,优先级高于 GRANT
  • REVOKE:撤销之前授予或拒绝的权限

用户管理

登录名管理

创建 Windows 登录名

sql
-- 创建 Windows 登录名
CREATE LOGIN [Domain\UserName] FROM WINDOWS;

-- 创建 Windows 组登录名
CREATE LOGIN [Domain\GroupName] FROM WINDOWS;

创建 SQL Server 登录名

sql
-- 创建 SQL Server 登录名
CREATE LOGIN SQLUser WITH PASSWORD = 'StrongPassword123!',
    DEFAULT_DATABASE = YourDatabase,
    CHECK_EXPIRATION = ON,
    CHECK_POLICY = ON;

修改登录名

sql
-- 修改登录名密码
ALTER LOGIN SQLUser WITH PASSWORD = 'NewStrongPassword456!';

-- 启用/禁用登录名
ALTER LOGIN SQLUser DISABLE;
ALTER LOGIN SQLUser ENABLE;

删除登录名

sql
-- 删除登录名
DROP LOGIN SQLUser;

数据库用户管理

创建数据库用户

sql
-- 创建映射到 Windows 登录名的数据库用户
USE YourDatabase;
CREATE USER [Domain\UserName] FOR LOGIN [Domain\UserName];

-- 创建映射到 SQL Server 登录名的数据库用户
USE YourDatabase;
CREATE USER SQLUser FOR LOGIN SQLUser;

-- 创建没有登录名的数据库用户(用于应用程序角色或证书映射)
USE YourDatabase;
CREATE USER ApplicationUser WITHOUT LOGIN;

修改数据库用户

sql
-- 修改数据库用户名
USE YourDatabase;
ALTER USER SQLUser WITH NAME = NewSQLUser;

-- 更改用户默认架构
USE YourDatabase;
ALTER USER SQLUser WITH DEFAULT_SCHEMA = Sales;

删除数据库用户

sql
-- 删除数据库用户
USE YourDatabase;
DROP USER NewSQLUser;

关联登录名与数据库用户

查看登录名与用户映射

sql
-- 查看数据库用户及其对应的登录名
USE YourDatabase;
SELECT 
    dp.name AS DatabaseUser,
    sp.name AS ServerLogin
FROM sys.database_principals dp
LEFT JOIN sys.server_principals sp ON dp.sid = sp.sid
WHERE dp.type IN ('S', 'U', 'G');

重新关联用户与登录名

sql
-- 重新关联孤儿用户
USE YourDatabase;
EXEC sp_change_users_login 'Update_One', 'DatabaseUser', 'LoginName';

-- 或使用 ALTER USER 语句(SQL Server 2008 R2 及以上)
USE YourDatabase;
ALTER USER DatabaseUser WITH LOGIN = LoginName;

孤儿用户处理

查找孤儿用户

sql
-- 查找当前数据库中的孤儿用户
USE YourDatabase;
EXEC sp_change_users_login 'Report';

-- 或使用系统视图
USE YourDatabase;
SELECT dp.name AS OrphanUser
FROM sys.database_principals dp
LEFT JOIN sys.server_principals sp ON dp.sid = sp.sid
WHERE dp.type IN ('S', 'U') AND sp.name IS NULL;

修复孤儿用户

sql
-- 修复单个孤儿用户
USE YourDatabase;
ALTER USER OrphanUser WITH LOGIN = LoginName;

-- 自动修复所有孤儿用户(如果登录名与用户名相同)
USE YourDatabase;
EXEC sp_change_users_login 'Auto_Fix', NULL, NULL, 'UpdateOne';

角色管理

服务器角色

固定服务器角色

  • sysadmin:拥有服务器上的所有权限
  • serveradmin:可以配置服务器设置
  • securityadmin:可以管理登录名和服务器级别的权限
  • processadmin:可以终止服务器进程
  • setupadmin:可以管理链接服务器和启动存储过程
  • bulkadmin:可以执行 BULK INSERT 语句
  • diskadmin:可以管理磁盘文件
  • dbcreator:可以创建、修改、删除和恢复数据库
  • public:所有登录名的默认角色,拥有服务器的基本权限

服务器角色操作

sql
-- 将登录名添加到服务器角色
ALTER SERVER ROLE sysadmin ADD MEMBER [Domain\UserName];

-- 从服务器角色中移除登录名
ALTER SERVER ROLE sysadmin DROP MEMBER [Domain\UserName];

-- 查看服务器角色成员
SELECT 
    sp.name AS LoginName,
    sr.name AS ServerRole
FROM sys.server_role_members srm
JOIN sys.server_principals sp ON srm.member_principal_id = sp.principal_id
JOIN sys.server_principals sr ON srm.role_principal_id = sr.principal_id;

数据库角色

固定数据库角色

  • db_owner:拥有数据库中的所有权限
  • db_securityadmin:可以管理数据库角色和权限
  • db_accessadmin:可以管理数据库用户和权限
  • db_backupoperator:可以备份数据库
  • db_ddladmin:可以执行数据定义语言 (DDL) 语句
  • db_datawriter:可以修改数据库中的数据
  • db_datareader:可以读取数据库中的数据
  • db_denydatawriter:不能修改数据库中的数据
  • db_denydatareader:不能读取数据库中的数据
  • public:所有数据库用户的默认角色

数据库角色操作

sql
-- 将用户添加到数据库角色
USE YourDatabase;
ALTER ROLE db_datareader ADD MEMBER SQLUser;

-- 从数据库角色中移除用户
USE YourDatabase;
ALTER ROLE db_datareader DROP MEMBER SQLUser;

-- 查看数据库角色成员
USE YourDatabase;
SELECT 
    dp.name AS DatabaseUser,
    dr.name AS DatabaseRole
FROM sys.database_role_members drm
JOIN sys.database_principals dp ON drm.member_principal_id = dp.principal_id
JOIN sys.database_principals dr ON drm.role_principal_id = dr.principal_id;

应用程序角色

创建和使用应用程序角色

sql
-- 创建应用程序角色
USE YourDatabase;
CREATE APPLICATION ROLE AppRole WITH PASSWORD = 'AppRolePassword123!',
    DEFAULT_SCHEMA = Sales;

-- 激活应用程序角色
USE YourDatabase;
EXEC sp_setapprole 'AppRole', 'AppRolePassword123!';

-- 查看当前激活的应用程序角色
SELECT 
    name,
    is_app_role_enabled
FROM sys.database_principals
WHERE is_app_role_enabled = 1;

-- 撤销应用程序角色上下文
EXEC sp_unsetapprole 'AppRole';

自定义角色

创建自定义数据库角色

sql
-- 创建自定义数据库角色
USE YourDatabase;
CREATE ROLE SalesRole;

-- 向自定义角色授予权限
USE YourDatabase;
GRANT SELECT, INSERT, UPDATE ON Sales.Orders TO SalesRole;
GRANT SELECT ON Sales.Customers TO SalesRole;

-- 将用户添加到自定义角色
USE YourDatabase;
ALTER ROLE SalesRole ADD MEMBER SQLUser;

创建自定义服务器角色

sql
-- 创建自定义服务器角色
CREATE SERVER ROLE CustomServerRole AUTHORIZATION securityadmin;

-- 向自定义服务器角色授予权限
GRANT ALTER ANY LOGIN TO CustomServerRole;
GRANT VIEW ANY DEFINITION TO CustomServerRole;

-- 将登录名添加到自定义服务器角色
ALTER SERVER ROLE CustomServerRole ADD MEMBER SQLUser;

权限分配

授予权限

授予对象权限

sql
-- 授予表权限
USE YourDatabase;
GRANT SELECT, INSERT, UPDATE ON dbo.Employees TO SQLUser;
GRANT DELETE ON dbo.Employees TO SalesRole;

-- 授予视图权限
USE YourDatabase;
GRANT SELECT ON dbo.vw_EmployeeSales TO SQLUser;

-- 授予存储过程权限
USE YourDatabase;
GRANT EXECUTE ON dbo.usp_GetEmployeeDetails TO SQLUser;

授予语句权限

sql
-- 授予创建表权限
USE YourDatabase;
GRANT CREATE TABLE TO SQLUser;

-- 授予创建视图权限
USE YourDatabase;
GRANT CREATE VIEW TO SQLUser;

授予架构权限

sql
-- 授予架构权限
USE YourDatabase;
GRANT SELECT, INSERT, UPDATE, DELETE ON SCHEMA::Sales TO SalesRole;

拒绝权限

拒绝对象权限

sql
-- 拒绝删除表权限
USE YourDatabase;
DENY DELETE ON dbo.Employees TO SQLUser;

-- 拒绝特定列的更新权限
USE YourDatabase;
DENY UPDATE (Salary) ON dbo.Employees TO SQLUser;

拒绝语句权限

sql
-- 拒绝创建存储过程权限
USE YourDatabase;
DENY CREATE PROCEDURE TO SQLUser;

撤销权限

撤销对象权限

sql
-- 撤销插入表权限
USE YourDatabase;
REVOKE INSERT ON dbo.Employees FROM SQLUser;

-- 撤销架构权限
USE YourDatabase;
REVOKE SELECT ON SCHEMA::Sales FROM SalesRole;

权限继承

权限继承示例

sql
-- 向角色授予权限,角色成员自动继承权限
USE YourDatabase;
GRANT SELECT ON dbo.Orders TO SalesRole;
ALTER ROLE SalesRole ADD MEMBER SQLUser;
-- SQLUser 自动获得对 Orders 表的 SELECT 权限

-- 撤销角色权限,角色成员权限也被撤销
USE YourDatabase;
REVOKE SELECT ON dbo.Orders FROM SalesRole;
-- SQLUser 失去对 Orders 表的 SELECT 权限

查看有效权限

sql
-- 查看数据库用户的有效权限
USE YourDatabase;
EXECUTE AS USER = 'SQLUser';
SELECT * FROM fn_my_permissions('dbo.Employees', 'OBJECT');
REVERT;

-- 查看特定权限是否被授予
USE YourDatabase;
SELECT HAS_PERMS_BY_NAME('dbo.Employees', 'OBJECT', 'SELECT') AS HasSelectPermission;

行级安全

行级安全概述

行级安全 (Row-Level Security, RLS) 允许根据用户的特征控制对表中特定行的访问,确保用户只能访问其有权查看的数据行。

行级安全组件

  • 安全策略:将安全谓词绑定到表
  • 安全谓词:内联表值函数,定义访问规则

实现行级安全

1. 创建测试表和数据

sql
USE YourDatabase;
CREATE TABLE Sales (
    SalesID INT PRIMARY KEY,
    ProductID INT,
    SalesAmount DECIMAL(10, 2),
    SalesPerson NVARCHAR(50)
);

INSERT INTO Sales VALUES
(1, 100, 500.00, 'John'),
(2, 200, 750.00, 'Jane'),
(3, 100, 300.00, 'John'),
(4, 300, 1200.00, 'Jane');

2. 创建安全谓词函数

sql
-- 创建安全谓词函数
USE YourDatabase;
CREATE FUNCTION fn_securitypredicate(@SalesPerson AS NVARCHAR(50))
RETURNS TABLE
WITH SCHEMABINDING
AS
RETURN SELECT 1 AS fn_securitypredicate_result
WHERE @SalesPerson = USER_NAME() OR USER_NAME() = 'dbo';

3. 创建安全策略

sql
-- 创建安全策略
USE YourDatabase;
CREATE SECURITY POLICY SalesSecurityPolicy
ADD FILTER PREDICATE dbo.fn_securitypredicate(SalesPerson) ON dbo.Sales
WITH (STATE = ON);

4. 测试行级安全

sql
-- 创建测试用户
CREATE LOGIN JohnLogin WITH PASSWORD = 'JohnPassword123!';
CREATE LOGIN JaneLogin WITH PASSWORD = 'JanePassword456!';

USE YourDatabase;
CREATE USER John FOR LOGIN JohnLogin;
CREATE USER Jane FOR LOGIN JaneLogin;

GRANT SELECT ON dbo.Sales TO John, Jane;

-- 测试 John 只能看到自己的销售数据
EXECUTE AS USER = 'John';
SELECT * FROM dbo.Sales;
-- 只返回 John 的销售记录
REVERT;

-- 测试 Jane 只能看到自己的销售数据
EXECUTE AS USER = 'Jane';
SELECT * FROM dbo.Sales;
-- 只返回 Jane 的销售记录
REVERT;

行级安全最佳实践

  • 保持安全谓词函数简单高效
  • 避免在安全谓词中使用复杂逻辑或外部函数
  • 测试性能影响,尤其是在大型表上
  • 定期审查安全策略和谓词函数

列级安全

列级安全概述

列级安全允许控制用户对表中特定列的访问权限,确保用户只能访问其有权查看的列。

实现列级安全

1. 使用 GRANT/REVOKE/DENY 控制列访问

sql
-- 授予表的 SELECT 权限,但只允许访问特定列
USE YourDatabase;
GRANT SELECT (SalesID, ProductID, SalesAmount) ON dbo.Sales TO SQLUser;

-- 拒绝访问 Salary 列
USE YourDatabase;
DENY SELECT (Salary) ON dbo.Employees TO SQLUser;

2. 使用列级安全策略(SQL Server 2016+)

sql
-- 创建列级安全策略
USE YourDatabase;
CREATE FUNCTION fn_columsecuritypredicate(@ColumnName AS sysname)
RETURNS TABLE
WITH SCHEMABINDING
AS
RETURN SELECT 1 AS fn_columsecuritypredicate_result
WHERE USER_NAME() = 'dbo' OR @ColumnName <> 'Salary';

-- 应用列级安全策略
CREATE SECURITY POLICY ColumnSecurityPolicy
ADD BLOCK PREDICATE dbo.fn_columsecuritypredicate(COLUMN_NAME) ON dbo.Employees
WITH (STATE = ON);

动态数据掩码

动态数据掩码概述

动态数据掩码 (Dynamic Data Masking, DDM) 允许对敏感数据进行掩码处理,根据用户权限动态显示或隐藏敏感数据,而不改变底层数据。

掩码函数

可用的掩码函数

  • Default:根据数据类型应用默认掩码
    • 字符串:XXXX 或更少
    • 数字:0
    • 日期和时间:1900-01-01
  • Email:显示电子邮件前缀的第一个字符,其余用 XXXX 替换,保留域名
    • 示例:jXXXX@example.com
  • Partial:自定义掩码,指定可见前缀、填充字符和可见后缀
    • 语法:partial(prefix, [padding], suffix)
    • 示例:partial(2, "XXX", 2)123-45-6789 显示 12XXX789
  • Random:对数字列生成随机值
    • 语法:random(minValue, maxValue)

实现动态数据掩码

1. 创建带掩码的表

sql
-- 创建带动态数据掩码的表
USE YourDatabase;
CREATE TABLE Customers (
    CustomerID INT PRIMARY KEY,
    FirstName NVARCHAR(50),
    LastName NVARCHAR(50),
    Email NVARCHAR(100) MASKED WITH (FUNCTION = 'email()'),
    Phone NVARCHAR(20) MASKED WITH (FUNCTION = 'partial(3, "XXX-XXX-", 4)'),
    CreditCardNumber NVARCHAR(20) MASKED WITH (FUNCTION = 'partial(4, "XXXXXXXXXXXX", 4)'),
    Salary DECIMAL(10, 2) MASKED WITH (FUNCTION = 'default()')
);

2. 向现有表添加掩码

sql
-- 向现有表添加掩码
USE YourDatabase;
ALTER TABLE Employees
ALTER COLUMN Email ADD MASKED WITH (FUNCTION = 'email()');

ALTER TABLE Employees
ALTER COLUMN Phone ADD MASKED WITH (FUNCTION = 'partial(3, "XXX-XXX-", 4)');

3. 测试动态数据掩码

sql
-- 创建测试用户
USE YourDatabase;
CREATE USER MaskedUser FOR LOGIN MaskedUserLogin;
GRANT SELECT ON Customers TO MaskedUser;

-- 管理员查看完整数据
SELECT * FROM Customers;

-- 普通用户查看掩码数据
EXECUTE AS USER = 'MaskedUser';
SELECT * FROM Customers;
-- 显示掩码数据
REVERT;

4. 授予查看未掩码数据的权限

sql
-- 授予查看未掩码数据的权限
USE YourDatabase;
GRANT UNMASK TO AdminUser;

-- 测试权限
EXECUTE AS USER = 'AdminUser';
SELECT * FROM Customers;
-- 显示完整数据
REVERT;

权限审核

审核概述

权限审核允许监控和记录 SQL Server 中的权限变更和访问活动,帮助满足合规要求和检测安全事件。

审核配置

1. 创建服务器审计

sql
-- 创建服务器审计
CREATE SERVER AUDIT PermissionAudit
TO FILE (FILEPATH = 'D:\Audits\', MAXSIZE = 100 MB, MAX_ROLLOVER_FILES = 10)
WITH (ON_FAILURE = CONTINUE);

-- 启用服务器审计
ALTER SERVER AUDIT PermissionAudit WITH (STATE = ON);

2. 创建服务器审计规范

sql
-- 创建服务器审计规范
CREATE SERVER AUDIT SPECIFICATION PermissionServerSpec
FOR SERVER AUDIT PermissionAudit
ADD (SERVER_PRINCIPAL_CHANGE_GROUP),
ADD (SERVER_ROLE_MEMBER_CHANGE_GROUP),
ADD (LOGIN_CHANGE_PASSWORD_GROUP);

-- 启用服务器审计规范
ALTER SERVER AUDIT SPECIFICATION PermissionServerSpec WITH (STATE = ON);

3. 创建数据库审计规范

sql
-- 创建数据库审计规范
USE YourDatabase;
CREATE DATABASE AUDIT SPECIFICATION PermissionDatabaseSpec
FOR SERVER AUDIT PermissionAudit
ADD (DATABASE_PRINCIPAL_CHANGE_GROUP),
ADD (DATABASE_ROLE_MEMBER_CHANGE_GROUP),
ADD (SCHEMA_OBJECT_PERMISSION_CHANGE_GROUP),
ADD (SELECT ON dbo.Employees BY PUBLIC);

-- 启用数据库审计规范
ALTER DATABASE AUDIT SPECIFICATION PermissionDatabaseSpec WITH (STATE = ON);

审核日志查看

1. 查询审计日志

sql
-- 查询服务器审计日志
SELECT 
    event_time,
    action_id,
    succeeded,
    server_principal_name,
    database_principal_name,
    object_name,
    statement
FROM sys.fn_get_audit_file('D:\Audits\PermissionAudit*', NULL, NULL);

2. 使用 SSMS 查看审计日志

  1. 在 SSMS 中,展开 "Security" → "Audits"
  2. 右键点击审计名称,选择 "View Audit Logs"
  3. 使用过滤器和搜索功能查看特定事件

审核最佳实践

  • 仅审计必要的事件,避免性能影响
  • 定期归档和清理审计日志
  • 监控审计日志,及时发现异常活动
  • 确保审计日志的安全性和完整性

权限管理最佳实践

最小权限原则

  • 仅授予用户完成工作所需的最小权限
  • 避免将用户直接添加到固定服务器角色(如 sysadmin)
  • 使用自定义角色管理权限
  • 定期审查和撤销不必要的权限

角色分离

  • 分离管理、开发和运维角色
  • 避免单一用户拥有过多权限
  • 实施职责分离,防止欺诈和误操作

定期审查

  • 定期审查登录名和用户权限
  • 审查角色成员资格
  • 审计权限变更
  • 移除不活跃的登录名和用户

密码策略

  • 启用强密码策略(CHECK_POLICY = ON)
  • 启用密码过期(CHECK_EXPIRATION = ON)
  • 禁用密码缓存(CACHE_PASSWORD = OFF)
  • 定期更换密码

其他最佳实践

  • 使用 Windows 身份验证替代 SQL Server 身份验证
  • 启用登录审核
  • 使用加密连接
  • 定期备份 master 数据库(包含登录名信息)

版本差异

SQL Server 2008/2008 R2

  • 支持基本的权限管理功能
  • 支持固定服务器角色和数据库角色
  • 不支持行级安全
  • 不支持动态数据掩码
  • 不支持自定义服务器角色
  • 审计功能有限

SQL Server 2012

  • 增强了审计功能
  • 引入了包含数据库用户
  • 支持服务器级别的审核
  • 不支持行级安全
  • 不支持动态数据掩码
  • 不支持自定义服务器角色

SQL Server 2014

  • 引入了自定义服务器角色
  • 增强了审计功能
  • 不支持行级安全
  • 不支持动态数据掩码

SQL Server 2016

  • 引入行级安全 (RLS)
  • 引入动态数据掩码 (DDM)
  • 增强了包含数据库功能
  • 引入了 Always Encrypted

SQL Server 2017

  • 增强了行级安全功能
  • 增强了动态数据掩码功能
  • 引入了 Linux 平台支持
  • 增强了包含数据库功能

SQL Server 2019

  • 引入了 Azure AD 身份验证增强
  • 增强了行级安全性能
  • 增强了动态数据掩码功能
  • 引入了大数据群集安全功能

SQL Server 2022

  • 增强了 Azure AD 身份验证
  • 引入了 Ledger 功能
  • 增强了行级安全和动态数据掩码
  • 引入了 Microsoft Purview 集成

常见问题 (FAQ)

如何创建数据库用户?

创建数据库用户的步骤:1) 首先创建服务器登录名(或使用现有登录名);2) 在目标数据库中创建数据库用户,并将其映射到登录名;3) 根据需要分配权限或添加到角色。例如:

sql
-- 创建登录名
CREATE LOGIN SQLUser WITH PASSWORD = 'StrongPassword123!';
-- 创建数据库用户
USE YourDatabase;
CREATE USER SQLUser FOR LOGIN SQLUser;

如何分配权限?

分配权限使用 GRANT 语句,可以授予对象权限、语句权限或架构权限。例如:

  • 授予表的 SELECT 权限:GRANT SELECT ON dbo.TableName TO UserName;
  • 授予创建表的权限:GRANT CREATE TABLE TO UserName;
  • 授予架构的所有权限:GRANT SELECT, INSERT, UPDATE, DELETE ON SCHEMA::SchemaName TO UserName;

什么是最小权限原则?

最小权限原则是指仅授予用户完成工作所需的最小权限,避免授予过多权限导致的安全风险。这是权限管理的核心原则,有助于减少误操作和安全漏洞。

如何实现行级安全?

实现行级安全的步骤:1) 创建安全谓词函数,定义访问规则;2) 创建安全策略,将谓词函数绑定到表;3) 向用户授予表的访问权限。行级安全确保用户只能访问其有权查看的数据行。

如何审核权限变更?

审核权限变更的方法:1) 启用 SQL Server 审计,创建服务器审计和数据库审计规范;2) 配置审计事件,如数据库主体变更、角色成员变更、权限变更等;3) 定期查看审计日志,监控权限变更活动。

如何处理孤儿用户?

处理孤儿用户的方法:1) 查找孤儿用户:EXEC sp_change_users_login 'Report';;2) 重新关联用户与登录名:ALTER USER DatabaseUser WITH LOGIN = LoginName;EXEC sp_change_users_login 'Update_One', 'DatabaseUser', 'LoginName';;3) 对于大量孤儿用户,可以使用 EXEC sp_change_users_login 'Auto_Fix', NULL, NULL, 'UpdateOne'; 自动修复。

动态数据掩码和列级安全的区别是什么?

动态数据掩码 (DDM) 用于对敏感数据进行掩码处理,根据用户权限动态显示或隐藏数据,不改变底层数据。列级安全用于控制用户对特定列的访问权限,用户要么能看到完整列数据,要么完全看不到该列。

如何查看用户的有效权限?

查看用户有效权限的方法:1) 使用 fn_my_permissions 函数:EXECUTE AS USER = 'UserName'; SELECT * FROM fn_my_permissions('ObjectName', 'OBJECT'); REVERT;;2) 使用 HAS_PERMS_BY_NAME 函数检查特定权限:SELECT HAS_PERMS_BY_NAME('ObjectName', 'OBJECT', 'SELECT') AS HasSelectPermission;;3) 使用 SSMS 查看用户属性中的权限。

如何创建和使用自定义角色?

创建和使用自定义角色的步骤:1) 创建自定义角色:CREATE ROLE RoleName;;2) 向角色授予权限:GRANT Permission ON ObjectName TO RoleName;;3) 将用户添加到角色:ALTER ROLE RoleName ADD MEMBER UserName;。自定义角色有助于集中管理权限,便于维护和审计。

如何安全地管理 SQL Server 权限?

安全管理 SQL Server 权限的最佳实践:1) 遵循最小权限原则;2) 使用角色管理权限;3) 实施定期权限审查;4) 启用登录审核和权限变更审计;5) 使用 Windows 身份验证;6) 分离管理、开发和运维角色;7) 启用强密码策略;8) 定期备份 master 数据库;9) 移除不活跃的登录名和用户。