Scert/backend/internal/database/sqlite_dns_account_constraints.go
xuans 02e039984a 保存 DNS 多账户数据层与实库故障夹具修复前检查点
基础模型和迁移已完成;增量竞态暴露 MySQL 审计故障注入权限问题,后续修复,不代表完整功能或验收通过。
2026-10-04 04:42:39 +08:00

35 lines
1.6 KiB
Go

package database
import (
"context"
"database/sql"
"fmt"
)
// 与已有资源约束一致,不依赖连接的外键开关,不修改用户的连接参数。
func installSQLiteDNSAccountConstraints(ctx context.Context, tx *sql.Tx) error {
statements := []string{
`CREATE TRIGGER scert_dns_accounts_project_insert BEFORE INSERT ON dns_accounts
WHEN NOT EXISTS (SELECT 1 FROM projects WHERE id = NEW.project_id)
BEGIN SELECT RAISE(ABORT, 'DNS 账户所属项目不存在'); END`,
`CREATE TRIGGER scert_dns_accounts_project_update BEFORE UPDATE OF project_id ON dns_accounts
WHEN NOT EXISTS (SELECT 1 FROM projects WHERE id = NEW.project_id)
BEGIN SELECT RAISE(ABORT, 'DNS 账户所属项目不存在'); END`,
`CREATE TRIGGER scert_dns_accounts_project_delete BEFORE DELETE ON projects
WHEN EXISTS (SELECT 1 FROM dns_accounts WHERE project_id = OLD.id)
BEGIN SELECT RAISE(ABORT, '项目仍有 DNS 账户,不能删除'); END`,
`CREATE TRIGGER scert_dns_accounts_project_rekey BEFORE UPDATE OF id ON projects
WHEN NEW.id <> OLD.id AND EXISTS (SELECT 1 FROM dns_accounts WHERE project_id = OLD.id)
BEGIN SELECT RAISE(ABORT, '项目仍有 DNS 账户,不能更换标识'); END`,
`CREATE TRIGGER scert_dns_accounts_project_replace BEFORE INSERT ON projects
WHEN EXISTS (SELECT 1 FROM dns_accounts WHERE project_id = NEW.id)
BEGIN SELECT RAISE(ABORT, '项目仍有 DNS 账户,不能替换'); END`,
}
for _, statement := range statements {
if _, err := tx.ExecContext(ctx, statement); err != nil {
return fmt.Errorf("安装 DNS 账户项目保护失败:%w", err)
}
}
return nil
}