Add soft deletes via status column
- Add status ENUM('active','disabled','deleted') to 8 tables
- Change all physical DELETE to UPDATE status='deleted'
- All SELECT queries filter by status='active'
- toggleActive now alternates between active/disabled status
- Exceptions: monitoring_history, rate_limits, sessions keep physical purge
- audit_logs remains immutable
This commit is contained in:
44
database/migrations/004_soft_deletes.sql
Normal file
44
database/migrations/004_soft_deletes.sql
Normal file
@@ -0,0 +1,44 @@
|
||||
-- ============================================================================
|
||||
-- ServerManager Soft Deletes
|
||||
-- Adds status column for soft deletes instead of physical row removal
|
||||
-- Exceptions: monitoring_history, rate_limits, sessions (physical purge OK)
|
||||
-- Exceptions: audit_logs (immutable, never deleted)
|
||||
-- ============================================================================
|
||||
|
||||
ALTER TABLE `users`
|
||||
ADD COLUMN `status` ENUM('active', 'disabled', 'deleted') NOT NULL DEFAULT 'active' AFTER `updated_at`,
|
||||
ADD INDEX `idx_users_status` (`status`);
|
||||
|
||||
ALTER TABLE `servers`
|
||||
ADD COLUMN `status` ENUM('active', 'disabled', 'deleted') NOT NULL DEFAULT 'active' AFTER `updated_at`,
|
||||
ADD INDEX `idx_servers_status` (`status`);
|
||||
|
||||
ALTER TABLE `teams`
|
||||
ADD COLUMN `status` ENUM('active', 'disabled', 'deleted') NOT NULL DEFAULT 'active' AFTER `updated_at`,
|
||||
ADD INDEX `idx_teams_status` (`status`);
|
||||
|
||||
ALTER TABLE `command_history`
|
||||
ADD COLUMN `status` ENUM('active', 'disabled', 'deleted') NOT NULL DEFAULT 'active' AFTER `executed_at`,
|
||||
ADD INDEX `idx_command_history_status` (`status`);
|
||||
|
||||
ALTER TABLE `server_user`
|
||||
ADD COLUMN `status` ENUM('active', 'disabled', 'deleted') NOT NULL DEFAULT 'active' AFTER `role`,
|
||||
ADD INDEX `idx_server_user_status` (`status`);
|
||||
|
||||
ALTER TABLE `team_user`
|
||||
ADD COLUMN `status` ENUM('active', 'disabled', 'deleted') NOT NULL DEFAULT 'active' AFTER `created_at`,
|
||||
ADD INDEX `idx_team_user_status` (`status`);
|
||||
|
||||
ALTER TABLE `team_server`
|
||||
ADD COLUMN `status` ENUM('active', 'disabled', 'deleted') NOT NULL DEFAULT 'active' AFTER `role`,
|
||||
ADD INDEX `idx_team_server_status` (`status`);
|
||||
|
||||
ALTER TABLE `api_tokens`
|
||||
ADD COLUMN `status` ENUM('active', 'disabled', 'deleted') NOT NULL DEFAULT 'active' AFTER `expires_at`,
|
||||
ADD INDEX `idx_api_tokens_status` (`status`);
|
||||
|
||||
-- ============================================================================
|
||||
-- FK constraints remain unchanged:
|
||||
-- ON DELETE CASCADE only fires on physical DELETE, which we no longer do.
|
||||
-- monitoring_history, rate_limits, sessions keep physical purge.
|
||||
-- ============================================================================
|
||||
Reference in New Issue
Block a user