SQL Server用户权限管理 #

一、安全主体概述 #

1.1 安全层次结构 #

text
SQL Server安全层次:
├── Windows级别
│   └── Windows用户/组
├── SQL Server级别
│   ├── 登录名(Login)
│   └── 服务器角色
└── 数据库级别
    ├── 用户(User)
    ├── 数据库角色
    └── 架构(Schema)

1.2 权限类型 #

text
SQL Server权限类型:
├── 服务器权限
│   ├── CREATE DATABASE
│   ├── ALTER ANY DATABASE
│   └── SHUTDOWN
├── 数据库权限
│   ├── CREATE TABLE
│   ├── CREATE VIEW
│   └── BACKUP DATABASE
└── 对象权限
    ├── SELECT
    ├── INSERT
    ├── UPDATE
    └── DELETE

二、登录名管理 #

2.1 创建登录名 #

sql
-- Windows身份验证登录名
CREATE LOGIN [DOMAIN\user] FROM WINDOWS;

-- SQL Server身份验证登录名
CREATE LOGIN user1 WITH PASSWORD = 'Strong@Password123';

-- 创建带选项的登录名
CREATE LOGIN user2 
WITH 
    PASSWORD = 'Strong@Password123',
    DEFAULT_DATABASE = mydb,
    DEFAULT_LANGUAGE = 简体中文,
    CHECK_EXPIRATION = ON,
    CHECK_POLICY = ON;

-- 从证书创建登录名
CREATE LOGIN login_cert FROM CERTIFICATE cert_name;

2.2 修改登录名 #

sql
-- 修改密码
ALTER LOGIN user1 WITH PASSWORD = 'NewStrong@Password456';

-- 修改默认数据库
ALTER LOGIN user1 WITH DEFAULT_DATABASE = master;

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

-- 解锁登录名
ALTER LOGIN user1 WITH PASSWORD = 'NewPassword' UNLOCK;

-- 修改登录名
ALTER LOGIN user1 WITH NAME = new_user1;

2.3 删除登录名 #

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

-- 安全删除
IF EXISTS (SELECT 1 FROM sys.sql_logins WHERE name = 'user1')
    DROP LOGIN user1;

2.4 查看登录名 #

sql
-- 查看所有登录名
SELECT name, type_desc, is_disabled, default_database_name
FROM sys.sql_logins;

-- 使用系统存储过程
EXEC sp_helplogins;

三、数据库用户管理 #

3.1 创建用户 #

sql
-- 从登录名创建用户
CREATE USER user1 FOR LOGIN user1;

-- 创建带默认架构的用户
CREATE USER user1 FOR LOGIN user1 WITH DEFAULT_SCHEMA = dbo;

-- 创建不带登录名的用户(用于模拟)
CREATE USER app_user WITHOUT LOGIN;

-- 从Windows用户创建
CREATE USER [DOMAIN\user] FOR LOGIN [DOMAIN\user];

3.2 修改用户 #

sql
-- 修改默认架构
ALTER USER user1 WITH DEFAULT_SCHEMA = sales;

-- 修改用户名
ALTER USER user1 WITH NAME = new_user1;

-- 修改登录名映射
ALTER USER user1 WITH LOGIN = new_login;

3.3 删除用户 #

sql
-- 删除用户
DROP USER user1;

-- 安全删除
IF EXISTS (SELECT 1 FROM sys.database_principals WHERE name = 'user1')
    DROP USER user1;

3.4 查看用户 #

sql
-- 查看数据库用户
SELECT name, type_desc, default_schema_name
FROM sys.database_principals
WHERE type IN ('S', 'U');

-- 使用系统存储过程
EXEC sp_helpuser;

四、角色管理 #

4.1 服务器角色 #

sql
-- 固定服务器角色
/*
sysadmin       - 系统管理员
securityadmin  - 安全管理员
serveradmin    - 服务器管理员
setupadmin     - 设置管理员
processadmin   - 进程管理员
diskadmin      - 磁盘管理员
dbcreator      - 数据库创建者
bulkadmin      - 批量操作管理员
*/

-- 添加登录名到服务器角色
ALTER SERVER ROLE sysadmin ADD MEMBER user1;

-- 从服务器角色移除
ALTER SERVER ROLE sysadmin DROP MEMBER user1;

-- 查看服务器角色成员
EXEC sp_helpsrvrolemember;

4.2 数据库角色 #

sql
-- 固定数据库角色
/*
db_owner        - 数据库所有者
db_accessadmin  - 访问管理员
db_securityadmin - 安全管理员
db_ddladmin     - DDL管理员
db_backupoperator - 备份操作员
db_datareader   - 数据读取者
db_datawriter   - 数据写入者
db_denydatareader - 拒绝读取
db_denydatawriter - 拒绝写入
*/

-- 添加用户到数据库角色
ALTER ROLE db_datareader ADD MEMBER user1;

-- 从数据库角色移除
ALTER ROLE db_datareader DROP MEMBER user1;

-- 查看数据库角色成员
EXEC sp_helprolemember;

4.3 自定义角色 #

sql
-- 创建自定义数据库角色
CREATE ROLE app_reader;

-- 授予权限给角色
GRANT SELECT ON SCHEMA::dbo TO app_reader;

-- 添加用户到自定义角色
ALTER ROLE app_reader ADD MEMBER user1;

-- 删除角色
DROP ROLE app_reader;

4.4 应用程序角色 #

sql
-- 创建应用程序角色
CREATE APPLICATION ROLE app_role
WITH PASSWORD = 'Strong@Password123',
     DEFAULT_SCHEMA = dbo;

-- 激活应用程序角色
EXEC sp_setapprole 'app_role', 'Strong@Password123';

-- 修改应用程序角色
ALTER APPLICATION ROLE app_role
WITH PASSWORD = 'NewStrong@Password456';

-- 删除应用程序角色
DROP APPLICATION ROLE app_role;

五、权限管理 #

5.1 授予权限 #

sql
-- 授予对象权限
GRANT SELECT ON users TO user1;
GRANT INSERT, UPDATE ON users TO user1;
GRANT SELECT ON users TO user1 WITH GRANT OPTION;  -- 允许授权给他人

-- 授予架构权限
GRANT SELECT ON SCHEMA::dbo TO user1;

-- 授予数据库权限
GRANT CREATE TABLE TO user1;
GRANT CREATE VIEW TO user1;

-- 授予服务器权限
GRANT CREATE ANY DATABASE TO user1;

5.2 撤销权限 #

sql
-- 撤销权限
REVOKE SELECT ON users FROM user1;
REVOKE INSERT, UPDATE ON users FROM user1;

-- 撤销GRANT OPTION
REVOKE GRANT OPTION FOR SELECT ON users FROM user1;

-- 撤销所有权限
REVOKE ALL ON users FROM user1;

5.3 拒绝权限 #

sql
-- 拒绝权限(优先级最高)
DENY SELECT ON users TO user1;
DENY INSERT, UPDATE ON users TO user1;

-- 拒绝会覆盖GRANT
GRANT SELECT ON users TO user1;
DENY SELECT ON users TO user1;  -- user1无法SELECT

5.4 权限层次 #

text
权限优先级:
DENY > GRANT

权限继承:
服务器角色 → 数据库角色 → 用户权限

权限累计:
用户的最终权限是所有权限的并集(DENY除外)

六、架构管理 #

6.1 创建架构 #

sql
-- 创建架构
CREATE SCHEMA sales AUTHORIZATION dbo;

-- 创建架构并创建对象
CREATE SCHEMA hr
    CREATE TABLE employees (id INT, name NVARCHAR(50))
    GRANT SELECT TO public;

6.2 修改架构 #

sql
-- 修改架构所有者
ALTER AUTHORIZATION ON SCHEMA::hr TO user1;

-- 转移对象到新架构
ALTER SCHEMA sales TRANSFER hr.employees;

6.3 删除架构 #

sql
-- 删除空架构
DROP SCHEMA hr;

-- 如果架构有对象,需要先转移或删除对象

七、权限查询 #

7.1 查看权限 #

sql
-- 查看服务器权限
SELECT 
    pr.principal_id,
    pr.name,
    pe.permission_name,
    pe.state_desc
FROM sys.server_principals pr
LEFT JOIN sys.server_permissions pe ON pr.principal_id = pe.grantee_principal_id
WHERE pr.type = 'S';

-- 查看数据库权限
SELECT 
    USER_NAME(grantee_principal_id) AS user_name,
    permission_name,
    state_desc,
    OBJECT_NAME(major_id) AS object_name
FROM sys.database_permissions
WHERE class = 1;  -- 对象权限

-- 查看用户权限
EXEC sp_helprotect @username = 'user1';

7.2 查看有效权限 #

sql
-- 查看用户的有效权限
EXEC AS USER = 'user1';
SELECT * FROM fn_my_permissions(NULL, 'DATABASE');
REVERT;

-- 查看服务器权限
SELECT * FROM fn_my_permissions(NULL, 'SERVER');

八、最佳实践 #

8.1 安全设计原则 #

text
安全设计原则:
├── 最小权限原则
├── 使用角色管理权限
├── 使用Windows身份验证
├── 定期审计权限
├── 使用强密码策略
├── 禁用sa账户
└── 定期更改密码

8.2 权限管理建议 #

sql
-- 创建角色并授权
CREATE ROLE report_reader;
GRANT SELECT ON SCHEMA::report TO report_reader;

-- 将用户添加到角色
ALTER ROLE report_reader ADD MEMBER user1;

-- 使用存储过程封装权限
CREATE PROCEDURE usp_get_sensitive_data
WITH EXECUTE AS OWNER
AS
BEGIN
    SELECT * FROM sensitive_table;
END

九、总结 #

权限管理要点:

概念 说明
登录名 服务器级别访问
用户 数据库级别访问
角色 权限集合
权限 具体操作授权
架构 对象容器

最佳实践:

  1. 使用最小权限原则
  2. 使用角色管理权限
  3. 定期审计权限
  4. 使用强密码策略
  5. 禁用sa账户

下一步,让我们学习备份与恢复!

最后更新:2026-03-27