SQL Server 数据库创建与用户权限绑定

文章目录

在 SQL Server 中新建数据库并绑定安全登录名的步骤和相关 SQL 语句:

1、 新建数据库

使用 CREATE DATABASE 语句创建新数据库:

sql 复制代码
-- 创建新数据库
CREATE DATABASE MyNewDatabase
ON PRIMARY 
(
    NAME = MyNewDatabase_Data,  -- 数据文件逻辑名称
    FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\DATA\MyNewDatabase.mdf',  -- 数据文件路径
    SIZE = 8MB,  -- 初始大小
    MAXSIZE = UNLIMITED,  -- 最大大小
    FILEGROWTH = 64MB  -- 自动增长幅度
)
LOG ON 
(
    NAME = MyNewDatabase_Log,  -- 日志文件逻辑名称
    FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\DATA\MyNewDatabase.ldf',  -- 日志文件路径
    SIZE = 8MB,  -- 初始大小
    MAXSIZE = 2048GB,  -- 最大大小
    FILEGROWTH = 64MB  -- 自动增长幅度
);

2、创建登录名

使用 CREATE LOGIN 语句创建 SQL Server 登录名:

sql 复制代码
-- 创建 SQL Server 身份验证的登录名
CREATE LOGIN MyLoginName
WITH PASSWORD = 'StrongPassword123!',  -- 登录密码
     DEFAULT_DATABASE = MyNewDatabase,  -- 默认数据库
     CHECK_EXPIRATION = ON,  -- 启用密码过期
     CHECK_POLICY = ON;  -- 强制密码策略

3、为数据库创建用户并关联登录名

需要先切换到目标数据库,然后创建数据库用户并关联到登录名:

sql 复制代码
-- 切换到目标数据库
USE MyNewDatabase;
GO

-- 创建数据库用户并关联到登录名
CREATE USER MyDatabaseUser FOR LOGIN MyLoginName;
GO

4、分配数据库角色权限

根据需要为用户分配适当的数据库角色:

sql 复制代码
-- 将用户添加到 db_owner 角色(拥有数据库全部权限)
ALTER ROLE db_owner ADD MEMBER MyDatabaseUser;
GO

-- 或者添加到其他角色,如只读角色
-- ALTER ROLE db_datareader ADD MEMBER MyDatabaseUser;
-- GO

5、数据库新建用户并分配权限

在 SQL Server 中为数据库新建用户并分配权限,通常需要先创建登录名(服务器级别的身份),再创建数据库用户(数据库级别的身份),最后分配具体权限。以下是详细步骤和 SQL 语句:

1. 创建服务器登录名(前提)

登录名是服务器级别的身份验证对象,用户需要先有登录名才能访问 SQL Server 实例:

sql 复制代码
-- 创建 SQL Server 身份验证的登录名
CREATE LOGIN [NewLogin]
WITH PASSWORD = 'YourStrongPassword123!',  -- 强密码
     DEFAULT_DATABASE = [YourDatabase],   -- 默认连接的数据库
     CHECK_EXPIRATION = ON,               -- 启用密码过期策略
     CHECK_POLICY = ON;                   -- 强制密码复杂度策略

如果需要使用 Windows 身份验证(域账号或本地账号),则创建方式为:

sql 复制代码
-- 创建 Windows 身份验证的登录名(需替换为实际 Windows 账号)
CREATE LOGIN [DOMAIN\WindowsUserName] FROM WINDOWS
WITH DEFAULT_DATABASE = [YourDatabase];
2. 创建数据库用户并关联登录名

切换到目标数据库,创建数据库用户并与已有的登录名关联:

sql 复制代码
-- 切换到目标数据库
USE [YourDatabase];
GO

-- 创建数据库用户,关联到之前创建的登录名
CREATE USER [NewUser] FOR LOGIN [NewLogin];
GO

此时,NewUser 已成为 YourDatabase 数据库的用户,但尚未分配任何权限。

3. 分配数据库权限

根据需求分配权限,常见方式有两种:分配预定义角色分配细粒度权限

方式一:分配预定义数据库角色(推荐)

SQL Server 提供了多个预定义角色,包含常用权限集合,适合快速分配:

sql 复制代码
-- 切换到目标数据库
USE [YourDatabase];
GO

-- 示例1:分配只读权限(只能查询数据)
ALTER ROLE db_datareader ADD MEMBER [NewUser];

-- 示例2:分配只写权限(只能插入/更新/删除数据,但不能查询)
ALTER ROLE db_datawriter ADD MEMBER [NewUser];

-- 示例3:分配数据库所有者权限(谨慎使用,拥有全部权限)
ALTER ROLE db_owner ADD MEMBER [NewUser];

-- 示例4:分配ddl_admin权限(可以创建/修改表等结构,但无数据权限)
ALTER ROLE ddl_admin ADD MEMBER [NewUser];
方式二:分配细粒度权限(精确控制)

如果需要更精细的权限控制(如只允许操作特定表),可以直接分配权限:

sql 复制代码
-- 切换到目标数据库
USE [YourDatabase];
GO

-- 示例1:允许用户查询指定表(如:Customers表)
GRANT SELECT ON [dbo].[Customers] TO [NewUser];

-- 示例2:允许用户插入/更新指定表(如:Orders表)
GRANT INSERT, UPDATE ON [dbo].[Orders] TO [NewUser];

-- 示例3:允许用户执行指定存储过程
GRANT EXECUTE ON [dbo].[GetOrderDetails] TO [NewUser];

-- 示例4:拒绝用户删除操作(优先级高于GRANT)
DENY DELETE ON [dbo].[Customers] TO [NewUser];
4. 查看用户权限(验证)

可以通过以下语句查看已分配的权限:

sql 复制代码
-- 查看用户所属角色
USE [YourDatabase];
GO
EXEC sp_helpuser [NewUser];

-- 查看用户的具体权限
SELECT 
    dp.permission_name,
    dp.state_desc,
    OBJECT_NAME(dp.major_id) AS object_name
FROM sys.database_permissions dp
JOIN sys.database_principals dbp ON dp.grantee_principal_id = dbp.principal_id
WHERE dbp.name = 'NewUser';
5. 注意事项:
  1. 权限分配应遵循 最小权限原则,避免过度授权。

  2. db_owner 角色权限极高,仅在必要时分配。

  3. 如果需要撤销权限,使用 REVOKE 语句(如 REVOKE SELECT ON [dbo].[Customers] FROM [NewUser];)。

  4. 若用户不再需要访问,可删除用户和登录名:

    sql 复制代码
    -- 删除数据库用户
    USE [YourDatabase];
    DROP USER [NewUser];
    
    -- 删除服务器登录名
    DROP LOGIN [NewLogin];

6、数据库权限分配,归属于当前登录人员吗

在 SQL Server 中,数据库权限的分配与"当前登录人员"的关系取决于两个关键点:谁执行权限分配操作权限分配的目标对象

1. 权限分配的执行者(谁来分配)

执行权限分配(GRANT/DENY/ALTER ROLE 等语句)的必须是 具备足够权限的登录名,通常是:

  • 系统管理员(sa 账户)
  • 数据库所有者(db_owner 角色成员)
  • 被显式授予了权限管理权限的用户(如被授予 GRANT ANY PERMISSION 权限的用户)

当前登录人员 若具备上述权限,则可以执行权限分配操作;若没有,则会操作失败。

2. 权限分配的归属(权限给谁)

权限分配的目标是 数据库用户(关联到登录名),而非"当前登录人员"本身,除非明确指定将权限分配给当前登录的用户。

例如:

sql 复制代码
-- 假设当前登录的是 [AdminLogin],对应的数据库用户是 [AdminUser]

-- 情况1:将权限分配给其他用户(与当前登录者无关)
GRANT SELECT ON [dbo].[Orders] TO [NewUser];  -- 权限归属于 [NewUser]

-- 情况2:将权限分配给当前登录者自己(权限归属于当前登录者)
GRANT INSERT ON [dbo].[Customers] TO [AdminUser];  -- 权限归属于当前登录者对应的用户

7、总结

  • 权限分配操作 由当前登录人员执行 (前提是其有足够权限),但权限本身 归属于被指定的目标用户,而非必然归属于执行者。
  • 权限分配是"将 A 的权限赋予 B"的过程,A 是执行者(需有授权能力),B 是权限的所有者(可以是任何用户,包括 A 自己)。

例如:管理员(A)可以给普通用户(B)分配查询权限,此时权限归属于 B,与 A 无关(除非 A 同时也是 B)。

8、说明:

  • 请根据实际情况修改文件路径、数据库名称、登录名和密码
  • 确保 SQL Server 服务账户对指定的文件路径有写入权限
  • CHECK_EXPIRATIONCHECK_POLICY 选项用于增强密码安全性
  • 角色权限应遵循最小权限原则,避免不必要的高权限分配

执行以上步骤后,就完成了数据库创建、登录名创建以及两者的关联绑定。

相关推荐
DebugKitty5 小时前
网络编程5-数据库、sqlite3数据库
数据库·sql·sqlite·sqlite3_exec·sqlite3_open·sqlite3_close
张人玉5 小时前
SQLSERVER关键字:N
数据库·sqlserver
闪电麦坤955 小时前
数据结构:基数排序 (Radix Sort)
数据结构·算法·排序算法
lypzcgf5 小时前
Coze源码分析-API授权-获取令牌列表-后端源码
数据库·人工智能·后端·系统架构·go·开源软件·安全架构
qq7798233406 小时前
PostgreSQL(1) FETCH用法
数据库·postgresql
胡萝卜3.06 小时前
【LeetCode&数据结构】栈和队列的应用
数据结构·学习·算法··队列·栈和队列oj题
ftpeak6 小时前
Rust SQLx 开发指南:利用 Tokio 进行性能优化
开发语言·oracle·性能优化·rust·个人开发
类似不类似7 小时前
mysql实例是什么?
数据库·mysql·adb