Migrations SQL Supabase sécurisées pour le projet Gestion Gîte Calvignac. Utiliser pour : créer une nouvelle table, ajouter une colonne, modifier le schéma, configurer RLS, créer une RPC/fonction, nettoyer les fichiers SQL exécutés, débloquer une erreur de migration. Workflow écrire → valider → déployer → nettoyer.
Base de données en production. Toute migration mal écrite peut corrompre des données clients réels.
Avant d'écrire du SQL :
docs/ARCHITECTURE.md → section "Base de Données" pour le schéma actuelConvention stricte :
sql/MIGRATION_[DESCRIPTION]_[YYYY-MM-DD].sql
Exemples :
sql/MIGRATION_ADD_STATUT_RESERVATIONS_2026-03-28.sql
sql/MIGRATION_CREATE_TABLE_KM_LOGS_2026-03-28.sql
sql/FIX_RLS_GITES_2026-03-28.sql
Toujours écrire en mode idempotent (peut être rejoué sans erreur) :
-- ✅ Idempotent — ne plante pas si la colonne existe déjà
ALTER TABLE reservations
ADD COLUMN IF NOT EXISTS statut VARCHAR(50) DEFAULT 'confirmee';
-- ✅ Idempotent pour les tables
CREATE TABLE IF NOT EXISTS km_logs (
id BIGSERIAL PRIMARY KEY,
user_id UUID REFERENCES auth.users(id) ON DELETE CASCADE,
distance_km DECIMAL(8,2) NOT NULL,
created_at TIMESTAMPTZ DEFAULT NOW()
);
-- ✅ Idempotent pour les indexes
CREATE INDEX IF NOT EXISTS idx_km_logs_user_id ON km_logs(user_id);
Toute nouvelle table doit avoir RLS activé et des politiques définies :
-- Activer RLS
ALTER TABLE km_logs ENABLE ROW LEVEL SECURITY;
-- Politique : les utilisateurs ne voient que leurs propres lignes
CREATE POLICY "Users see own km_logs"
ON km_logs FOR SELECT
USING (auth.uid() = user_id);
CREATE POLICY "Users insert own km_logs"
ON km_logs FOR INSERT
WITH CHECK (auth.uid() = user_id);
Tables accessibles aux admins via service_role uniquement → pas de politique SELECT public.
# Via psql
psql "$DATABASE_URL" -f sql/MIGRATION_XXX.sql
# Ou coller directement dans l'éditeur SQL Supabase Dashboard
Après exécution :
Ces mises à jour sont non négociables après chaque migration exécutée en production :
docs/ARCHITECTURE.md — section "Base de Données" :
**Version :**) et la **Dernière MAJ :**docs/architecture/database-uml.md — diagramme Mermaid :
||--o{ entre les entités concernéesdocs/architecture/ERREURS_CRITIQUES.md (si applicable) :
Une fois la migration exécutée et validée en production :
sql/ → _archives/sql/MIGRATION_XXX.sql
Garder uniquement les fichiers SQL de référence et les scripts de rebuild dans sql/.
ALTER TABLE gites ADD COLUMN IF NOT EXISTS couleur VARCHAR(7) DEFAULT '#3B82F6';
CREATE OR REPLACE FUNCTION get_reservations_count(p_gite_id UUID)
RETURNS INTEGER AS $$
SELECT COUNT(*)::INTEGER FROM reservations WHERE gite_id = p_gite_id;
$$ LANGUAGE sql SECURITY DEFINER;
CREATE INDEX IF NOT EXISTS idx_reservations_gite_dates
ON reservations(gite_id, date_debut, date_fin);
archived_at à un DELETE| Erreur | Cause | Solution |
|---|---|---|
column already exists | Migration non idempotente | Ajouter IF NOT EXISTS |
relation does not exist | Mauvais ordre de création | Créer les tables dans l'ordre des dépendances FK |
permission denied | RLS trop restrictif | Vérifier les politiques ou utiliser service_role |
violates foreign key constraint | Données orphelines | Nettoyer les données avant d'ajouter la FK |