文章目录
-
-
- [1、 新建数据库](#1、 新建数据库)
- 2、创建登录名
- 3、为数据库创建用户并关联登录名
- 4、分配数据库角色权限
- 5、数据库新建用户并分配权限
-
- [1. 创建服务器登录名(前提)](#1. 创建服务器登录名(前提))
- [2. 创建数据库用户并关联登录名](#2. 创建数据库用户并关联登录名)
- [3. 分配数据库权限](#3. 分配数据库权限)
- [4. 查看用户权限(验证)](#4. 查看用户权限(验证))
- [5. 注意事项:](#5. 注意事项:)
- 6、数据库权限分配,归属于当前登录人员吗
-
- [1. 权限分配的执行者(谁来分配)](#1. 权限分配的执行者(谁来分配))
- [2. 权限分配的归属(权限给谁)](#2. 权限分配的归属(权限给谁))
- 7、总结
- 8、说明:
-
在 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. 注意事项:
-
权限分配应遵循 最小权限原则,避免过度授权。
-
db_owner
角色权限极高,仅在必要时分配。 -
如果需要撤销权限,使用
REVOKE
语句(如REVOKE SELECT ON [dbo].[Customers] FROM [NewUser];
)。 -
若用户不再需要访问,可删除用户和登录名:
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_EXPIRATION
和CHECK_POLICY
选项用于增强密码安全性- 角色权限应遵循最小权限原则,避免不必要的高权限分配
执行以上步骤后,就完成了数据库创建、登录名创建以及两者的关联绑定。