HaniBlindBox/server/scripts/validate_user_tables.sql
2026-01-02 05:18:05 +08:00

126 lines
3.8 KiB
Transact-SQL

-- ============================================================
-- 用户系统表结构验证脚本
-- Feature: database-migration, Property 1: 表结构完整性
-- Validates: Requirements 1.1, 1.2, 1.3, 1.4
-- ============================================================
USE honey_box;
GO
PRINT '========================================';
PRINT '用户系统表结构验证报告';
PRINT '========================================';
PRINT '';
-- 1. 验证所有用户系统表是否存在
PRINT '1. 表存在性验证';
PRINT '----------------------------------------';
DECLARE @expected_tables TABLE (table_name NVARCHAR(50));
INSERT INTO @expected_tables VALUES ('users'), ('user_accounts'), ('user_login_logs'), ('user_addresses');
SELECT
e.table_name AS [预期表名],
CASE WHEN t.TABLE_NAME IS NOT NULL THEN '✓ 存在' ELSE '✗ 不存在' END AS [状态]
FROM @expected_tables e
LEFT JOIN INFORMATION_SCHEMA.TABLES t
ON t.TABLE_NAME = e.table_name
AND t.TABLE_TYPE = 'BASE TABLE';
-- 2. 验证每个表的字段数量
PRINT '';
PRINT '2. 字段数量验证';
PRINT '----------------------------------------';
SELECT
TABLE_NAME AS [表名],
COUNT(*) AS [字段数量]
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME IN ('users', 'user_accounts', 'user_login_logs', 'user_addresses')
GROUP BY TABLE_NAME
ORDER BY TABLE_NAME;
-- 3. 验证主键约束
PRINT '';
PRINT '3. 主键约束验证';
PRINT '----------------------------------------';
SELECT
tc.TABLE_NAME AS [表名],
tc.CONSTRAINT_NAME AS [约束名称],
'✓ 已创建' AS [状态]
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc
WHERE tc.TABLE_NAME IN ('users', 'user_accounts', 'user_login_logs', 'user_addresses')
AND tc.CONSTRAINT_TYPE = 'PRIMARY KEY';
-- 4. 验证唯一约束 (users表)
PRINT '';
PRINT '4. 唯一约束验证 (users表)';
PRINT '----------------------------------------';
SELECT
tc.TABLE_NAME AS [表名],
tc.CONSTRAINT_NAME AS [约束名称],
'✓ 已创建' AS [状态]
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc
WHERE tc.TABLE_NAME = 'users'
AND tc.CONSTRAINT_TYPE = 'UNIQUE';
-- 5. 验证索引
PRINT '';
PRINT '5. 索引验证';
PRINT '----------------------------------------';
SELECT
t.name AS [表名],
i.name AS [索引名称],
i.type_desc AS [索引类型]
FROM sys.indexes i
INNER JOIN sys.tables t ON i.object_id = t.object_id
WHERE t.name IN ('users', 'user_accounts', 'user_login_logs', 'user_addresses')
AND i.name IS NOT NULL
ORDER BY t.name, i.name;
-- 6. 验证表注释
PRINT '';
PRINT '6. 表注释验证';
PRINT '----------------------------------------';
SELECT
t.name AS [表名],
CAST(ep.value AS NVARCHAR(200)) AS [表描述],
CASE WHEN ep.value IS NOT NULL THEN '✓ 已添加' ELSE '✗ 未添加' END AS [状态]
FROM sys.tables t
LEFT JOIN sys.extended_properties ep
ON ep.major_id = t.object_id
AND ep.minor_id = 0
AND ep.name = 'MS_Description'
WHERE t.name IN ('users', 'user_accounts', 'user_login_logs', 'user_addresses')
ORDER BY t.name;
-- 7. 验证字段注释数量
PRINT '';
PRINT '7. 字段注释验证';
PRINT '----------------------------------------';
SELECT
t.name AS [表名],
COUNT(c.column_id) AS [总字段数],
COUNT(ep.value) AS [已注释字段数],
CASE WHEN COUNT(c.column_id) = COUNT(ep.value) THEN '✓ 完整' ELSE '⚠ 部分缺失' END AS [状态]
FROM sys.tables t
INNER JOIN sys.columns c ON t.object_id = c.object_id
LEFT JOIN sys.extended_properties ep
ON ep.major_id = c.object_id
AND ep.minor_id = c.column_id
AND ep.name = 'MS_Description'
WHERE t.name IN ('users', 'user_accounts', 'user_login_logs', 'user_addresses')
GROUP BY t.name
ORDER BY t.name;
PRINT '';
PRINT '========================================';
PRINT '验证完成';
PRINT '========================================';
GO