# SQL Server 2014 SP3 中为用户设置严格权限

要在 **SQL Server 2014 SP3** 中为用户 `sqluser` 设置严格权限，使其：

✅ **只能访问 `SZHW` 数据库中的 `SZCIS` 表**  
✅ **可以执行：SELECT（列出）、INSERT（添加）、UPDATE（编辑）**  
❌ **不能 DELETE（删除数据）**  
❌ **不能 ALTER（修改表结构）**  
❌ **不能访问其他任何表或对象**

---

## ✅ 完整操作步骤（使用 T-SQL）

### 🔹 步骤 1：确保用户已存在（登录名 + 数据库用户）

```sql
-- 如果还没有登录名，先创建（在 master 数据库中）
USE master;
CREATE LOGIN [sqluser] WITH PASSWORD = 'YourStrongPassword123!';

-- 切换到目标数据库
USE [SZHW];

-- 创建数据库用户（映射登录名）
CREATE USER [sqluser] FOR LOGIN [sqluser];

```

> ⚠️ 如果用户已存在，跳过此步。

---

### 🔹 步骤 2：**显式拒绝所有高危权限（安全兜底）**

```sql
-- 拒绝对整个 dbo 架构的 ALTER 权限（防止改表结构）
DENY ALTER ON SCHEMA::dbo TO [sqluser];

-- 拒绝对整个 dbo 架构的 CONTROL 权限（防止获得完全控制）
DENY CONTROL ON SCHEMA::dbo TO [sqluser];

-- 拒绝对整个 dbo 架构的 DELETE 权限（防止删数据）
DENY DELETE ON SCHEMA::dbo TO [sqluser];

```

> ✅ 这些 `DENY` 是**全局性限制**，优先级高于后续的 `GRANT`。

---

### 🔹 步骤 3：**仅授予对 `SZCIS` 表的必要权限**

```sql
-- 只允许对 SZCIS 表进行 SELECT, INSERT, UPDATE
GRANT SELECT, INSERT, UPDATE ON OBJECT::dbo.SZCIS TO [sqluser];

```

> 💡 注意：这里**只授权给特定表**，而不是整个架构。

---

### 🔹 步骤 4：（可选）验证权限

#### 测试允许的操作（用 `sqluser` 账号连接后执行）：

```sql
-- ✅ 应成功
SELECT * FROM dbo.SZCIS;
INSERT INTO dbo.SZCIS (Part_Number, Description) VALUES ('TEST001', 'Test');
UPDATE dbo.SZCIS SET Description = 'Updated' WHERE Part_Number = 'TEST001';

```

#### 测试禁止的操作：

```sql
-- ❌ 应失败：权限被拒绝
DELETE FROM dbo.SZCIS WHERE Part_Number = 'TEST001';

-- ❌ 应失败：无法修改表结构
ALTER TABLE dbo.SZCIS ADD NewColumn NVARCHAR(50);

-- ❌ 应失败：无法访问其他表
SELECT * FROM dbo.OtherTable;  -- 假设存在其他表

```

---

## 🔒 权限设计原理说明

<table id="bkmrk-%E6%93%8D%E4%BD%9C-%E5%A6%82%E4%BD%95%E5%AE%9E%E7%8E%B0%E9%99%90%E5%88%B6-%E4%B8%8D%E8%83%BD%E5%88%A0%E6%95%B0%E6%8D%AE-deny"><thead><tr><th>操作</th><th>如何实现限制</th></tr></thead><tbody><tr><td>**不能删数据**</td><td>`DENY DELETE ON SCHEMA::dbo`</td></tr><tr><td>**不能改表结构**</td><td>`DENY ALTER ON SCHEMA::dbo`</td></tr><tr><td>**不能访问其他表**</td><td>**不授予任何其他表的权限**（默认无权限）</td></tr><tr><td>**只能操作 SZCIS**</td><td>`GRANT ... ON OBJECT::dbo.SZCIS`（精确到表）</td></tr></tbody></table>

> ✅ SQL Server 默认遵循 **“最小权限原则”**：未显式授予权限 = 无权限。

---

## 🛡️ 额外安全建议

### 1. **不要将用户加入任何角色**

- ❌ 不要加入 `db_datareader`、`db_datawriter` 等内置角色
- 这些角色会自动授予整个数据库的读写权限，违背你的需求

### 2. **定期审计权限**

```sql
-- 查看用户权限
SELECT 
    p.permission_name,
    p.state_desc,
    o.name AS object_name
FROM sys.database_permissions p
LEFT JOIN sys.objects o ON p.major_id = o.object_id
WHERE grantee_principal_id = USER_ID('sqluser');

```

### 3. **使用专用账号**

- 为不同应用/用户创建独立账号，避免共用 `sa` 或通用账号

---

## 📌 最终完整脚本（一键复制）

```sql
-- 1. 创建登录名（如不存在）
USE master;
IF NOT EXISTS (SELECT * FROM sys.server_principals WHERE name = 'sqluser')
    CREATE LOGIN [sqluser] WITH PASSWORD = 'YourStrongPassword123!';

-- 2. 在 SZHW 数据库中创建用户
USE [SZHW];
CREATE USER [sqluser] FOR LOGIN [sqluser];

-- 3. 拒绝高危权限（全局限制）
DENY ALTER ON SCHEMA::dbo TO [sqluser];
DENY CONTROL ON SCHEMA::dbo TO [sqluser];
DENY DELETE ON SCHEMA::dbo TO [sqluser];

-- 4. 仅授权 SZCIS 表的必要操作
GRANT SELECT, INSERT, UPDATE ON OBJECT::dbo.SZCIS TO [sqluser];

```

> ✅ 执行后，`sqluser` 将严格受限于你的要求。

---

## ❓常见问题

**Q：能否限制只能修改某些字段？**  
A：SQL Server 不支持列级 UPDATE 权限。  
✅ 替代方案：创建一个 **视图（View）**，只包含可编辑字段，并在视图上授权。

**Q：用户能执行存储过程吗？**  
A：默认不能。如需调用，需单独授权：

```sql
GRANT EXECUTE ON dbo.YourProc TO [sqluser];

```

---

完成以上配置后，你的 `sqluser` 账号将安全地满足业务需求！如有其他场景，欢迎继续提问。