Aller au contenu

Tables de la base de la passerelle

Les tables du schéma, leurs colonnes, leurs contraintes, leurs index et leurs déclencheurs.

Interne, peut changer sans préavis. Ce que décrit cette page relève de l’exploitation d’un déploiement, pas du contrat que la passerelle offre à un programme tiers. L’éditeur ne s’y engage pas : ces noms peuvent changer d’une version à l’autre, sans étape de dépréciation. Un changement se manifeste alors au démarrage ou à la mise à jour, par un message qui nomme ce qui manque.

La partie sur laquelle l’éditeur s’engage est le relais.

La passerelle et la console d’administration lisent la même base. Cette page décrit son schéma tel que le fichier d’installation le crée, plus la table de registre que le script de migration ajoute pour son propre compte.

Le schéma ne porte presque aucun commentaire lisible par une machine. Cette page liste donc les colonnes, leur type, leur caractère obligatoire et leur valeur par défaut, sans expliquer à quoi chacune sert. Le jour où le schéma sera annoté, les descriptions apparaîtront ici sans que personne n’ait à réécrire cette page.

Une base neuve ne contient aucun fournisseur, aucun modèle, aucun point d’appel et aucun compte : l’exploitant les déclare depuis la console d’administration.

Un responsable de la protection des données cherche d’abord celles-ci. Le classement est fait sur le nom de la colonne, ce qui le rend vrai pour les colonnes qui seront ajoutées plus tard sans que personne y pense.

ColonneNature
users.usernamedonnée personnelle
access_keys.key_hashsecret
access_keys.key_hintsecret
authorization_decisions.subjectdonnée personnelle
identity_sessions.subjectdonnée personnelle
subject_roles.subjectdonnée personnelle
subject_roles.granted_bydonnée personnelle
authorization_policies.installed_bydonnée personnelle
subject_revocations.subjectdonnée personnelle
subject_revocations.revoked_bydonnée personnelle
subject_revocations.lifted_bydonnée personnelle
administration_actions.actordonnée personnelle
administration_actions.targetdonnée personnelle
agent_acts.subjectdonnée personnelle
agent_acts.targetdonnée personnelle
agent_acts.decided_bydonnée personnelle
agent_session_revocations.revoked_bydonnée personnelle
organization_policies.installed_bydonnée personnelle
organization_policy_journal.actordonnée personnelle
relay_usage.subjectdonnée personnelle

Aucune clé d’API n’est stockée en clair : la base garde un condensat et le fragment que la console affiche pour reconnaître une clé sans la relire.

ColonneTypeObligatoireDéfaut
idSERIALouiaucunclé primaire
nameTEXTouiaucununique
max_cost_euroNUMERIC(10,4)nonaucun
ColonneTypeObligatoireDéfaut
idSERIALouiaucunclé primaire
usernameTEXTouiaucununique, donnée personnelle
activeBOOLEANouiTRUE
created_atTIMESTAMPTZouiNOW()
plan_idINTEGERnonaucunréférence plans(id)
ColonneTypeObligatoireDéfaut
idBIGSERIALouiaucunclé primaire
user_idINTEGERouiaucunréférence users(id)
key_hashTEXTouiaucununique, secret
key_hintTEXTouiaucunsecret
nameTEXTouiaucun
created_atTIMESTAMPTZouiNOW()
last_used_atTIMESTAMPTZnonaucun
revoked_atTIMESTAMPTZnonaucun

Contraintes

NomRègle
access_keys_name_not_blankCHECK (btrim(name) <> '')

Index

NomUniqueColonnesRestreint à
access_keys_by_accountnonuser_idaucune restriction
ColonneTypeObligatoireDéfaut
idSERIALouiaucunclé primaire
slugTEXTouiaucununique
nameTEXTouiaucun
base_urlTEXTouiaucun
api_key_envTEXTnonaucun
api_key_headerTEXTnonaucun
ColonneTypeObligatoireDéfaut
idSERIALouiaucunclé primaire
slugTEXTouiaucununique
nameTEXTouiaucun
provider_idINTEGERouiaucunréférence providers(id)
input_token_price_nano_euroBIGINToui0
output_token_price_nano_euroBIGINToui0
ColonneTypeObligatoireDéfaut
idSERIALouiaucunclé primaire
nameTEXTouiaucununique
model_idINTEGERouiaucunréférence models(id)
enabledBOOLEANouiTRUE
ColonneTypeObligatoireDéfaut
idSERIALouiaucunclé primaire
timestampTIMESTAMPTZouiNOW()
user_idINTEGERnonaucunréférence users(id)
endpoint_idINTEGERnonaucunréférence endpoints(id)
modelTEXTouiaucun
latency_msINTEGERouiaucun
input_tokensINTEGERnonaucun
output_tokensINTEGERnonaucun
request_idUUIDnonaucun

Index

NomUniqueColonnesRestreint à
request_logs_request_id_uniqueouirequest_idrequest_id IS NOT NULL
ColonneTypeObligatoireDéfaut
idBIGSERIALouiaucunclé primaire
decided_atTIMESTAMPTZouiclock_timestamp()
subjectTEXTnonaucundonnée personnelle
identity_sourceTEXTouiaucun
resourceTEXTouiaucun
decisionTEXTouiaucun
reasonTEXTnonaucun
request_idTEXTnonaucun

Contraintes

NomRègle
authorization_decisions_decision_connueCHECK (decision IN ('accordee', 'refusee'))
authorization_decisions_source_connueCHECK (identity_source IN ('annuaire', 'locale', 'inconnue'))
authorization_decisions_accord_nomme_son_sujetCHECK (decision <> 'accordee' OR subject IS NOT NULL)

Index

NomUniqueColonnesRestreint à
authorization_decisions_sujet_instantnonsubject, decided_at DESCaucune restriction
ColonneTypeObligatoireDéfaut
idTEXTouiaucunclé primaire
subjectTEXTouiaucundonnée personnelle
identity_sourceTEXTouiaucun
opened_atTIMESTAMPTZouiclock_timestamp()
expires_atTIMESTAMPTZouiaucun
ended_atTIMESTAMPTZnonaucun
ended_reasonTEXTnonaucun

Contraintes

NomRègle
identity_sessions_source_connueCHECK (identity_source IN ('annuaire', 'locale'))
identity_sessions_fin_motiveeCHECK ((ended_at IS NULL) = (ended_reason IS NULL))

Index

NomUniqueColonnesRestreint à
identity_sessions_sujet_vivantesnonsubjectended_at IS NULL
ColonneTypeObligatoireDéfaut
credits_per_eurINTEGERouiaucun
ColonneTypeObligatoireDéfaut
idSERIALouiaucunclé primaire
subjectTEXTouiaucundonnée personnelle
roleTEXTouiaucun
scopeTEXTnonaucun
poleTEXTnonaucuncalculée
granted_atTIMESTAMPTZouiNOW()
granted_byTEXTouiaucundonnée personnelle

Contraintes

NomRègle
subject_roles_known_roleCHECK ( role IN ( 'utilisateur-standard', 'administrateur-de-projet', 'administrateur-d-instance', 'auditeur' ) )
subject_roles_scope_iff_projectCHECK ( (role = 'administrateur-de-projet') = (scope IS NOT NULL) )
subject_roles_attribution_uniqueUNIQUE NULLS NOT DISTINCT (subject, role, scope)

Index

NomUniqueColonnesRestreint à
subject_roles_by_subjectnonsubjectaucune restriction

Déclencheurs

NomQuandEffet
subject_roles_cumul_interditBEFORE INSERT OR UPDATEFOR EACH ROW EXECUTE FUNCTION refuse_administration_audit_overlap()
ColonneTypeObligatoireDéfaut
idBIGSERIALouiaucunclé primaire
installed_atTIMESTAMPTZouiclock_timestamp()
installed_byTEXTouiaucundonnée personnelle
documentJSONBouiaucun
nameTEXTnonaucuncalculée

Contraintes

NomRègle
authorization_policies_document_est_un_objetCHECK (jsonb_typeof(document) = 'object')
authorization_policies_auteur_non_videCHECK (btrim(installed_by) <> '')
ColonneTypeObligatoireDéfaut
idBIGSERIALouiaucunclé primaire
subjectTEXTouiaucundonnée personnelle
revoked_atTIMESTAMPTZouiclock_timestamp()
revoked_byTEXTouiaucundonnée personnelle
reasonTEXTouiaucun
lifted_atTIMESTAMPTZnonaucun
lifted_byTEXTnonaucundonnée personnelle

Contraintes

NomRègle
subject_revocations_auteur_non_videCHECK (btrim(revoked_by) <> '')
subject_revocations_motif_non_videCHECK (btrim(reason) <> '')
subject_revocations_sujet_non_videCHECK (btrim(subject) <> '')
subject_revocations_levee_endosseeCHECK ((lifted_at IS NULL) = (lifted_by IS NULL))
subject_revocations_leveur_non_videCHECK (lifted_by IS NULL OR btrim(lifted_by) <> '')

Index

NomUniqueColonnesRestreint à
subject_revocations_une_seule_en_vigueurouisubjectlifted_at IS NULL
ColonneTypeObligatoireDéfaut
idBIGSERIALouiaucunclé primaire
performed_atTIMESTAMPTZouiclock_timestamp()
actionTEXTouiaucun
actorTEXTouiaucundonnée personnelle
actor_assuranceTEXTouiaucun
targetTEXTnonaucundonnée personnelle
roleTEXTnonaucun
scopeTEXTnonaucun
outcomeTEXTouiaucun
refusal_reasonTEXTnonaucun
policy_idBIGINTnonaucun

Contraintes

NomRègle
administration_actions_acte_connuCHECK (action IN ( 'attribution-de-role', 'retrait-de-role', 'revocation-de-sujet', 'levee-de-revocation', 'installation-de-politique', 'installation-de-politique-d-organisation', 'revocation-de-session-d-agent' ))
administration_actions_issue_connueCHECK (outcome IN ('effectue', 'sans-effet', 'refuse'))
administration_actions_assurance_connueCHECK (actor_assurance IN ('declaree', 'etablie'))
administration_actions_acteur_non_videCHECK (btrim(actor) <> '')
administration_actions_cible_nommeeCHECK ( action NOT IN ( 'attribution-de-role', 'retrait-de-role', 'revocation-de-sujet', 'levee-de-revocation', 'revocation-de-session-d-agent' ) OR (target IS NOT NULL AND btrim(target) <> '') )
administration_actions_role_ssi_acte_de_roleCHECK ( (action IN ('attribution-de-role', 'retrait-de-role')) = (role IS NOT NULL) )
administration_actions_perimetre_suppose_un_roleCHECK (scope IS NULL OR role IS NOT NULL)
administration_actions_politique_ssi_installationCHECK ( ( policy_id IS NULL OR action IN ( 'installation-de-politique', 'installation-de-politique-d-organisation' ) ) AND ( action NOT IN ( 'installation-de-politique', 'installation-de-politique-d-organisation' ) OR outcome <> 'effectue' OR policy_id IS NOT NULL ) )
administration_actions_refus_motiveCHECK ((outcome = 'refuse') = (refusal_reason IS NOT NULL))

Index

NomUniqueColonnesRestreint à
administration_actions_cible_instantnontarget, performed_at DESCaucune restriction
administration_actions_acteur_instantnonactor, performed_at DESCaucune restriction
ColonneTypeObligatoireDéfaut
idBIGSERIALouiaucunclé primaire
announced_atTIMESTAMPTZouiclock_timestamp()
launcherTEXTnonaucun
guarantee_heldBOOLEANouiaucun
reservationsJSONBouiaucun

Contraintes

NomRègle
agent_execution_announcements_reserves_ssi_non_tenueCHECK (guarantee_held = (jsonb_array_length(reservations) = 0))
agent_execution_announcements_reserves_en_tableauCHECK (jsonb_typeof(reservations) = 'array')
agent_execution_announcements_sans_lanceur_sans_garantieCHECK (launcher IS NOT NULL OR guarantee_held = FALSE)

Index

NomUniqueColonnesRestreint à
agent_execution_announcements_instantnonannounced_at DESCaucune restriction
ColonneTypeObligatoireDéfaut
idBIGSERIALouiaucunclé primaire
received_atTIMESTAMPTZouiclock_timestamp()
sessionTEXTouiaucun
workstationTEXTnonaucun
subjectTEXTnonaucundonnée personnelle
subject_assuranceTEXToui'declaree'
surfaceTEXTouiaucun
agentTEXTouiaucun
atTIMESTAMPTZouiaucun
rankINTEGERouiaucun
kindTEXTouiaucun
toolTEXTnonaucun
targetTEXTnonaucundonnée personnelle
decisionTEXTnonaucun
decided_byTEXTnonaucundonnée personnelle
outcomeTEXTnonaucun
reasonTEXTnonaucun
duration_msINTEGERnonaucun
modeTEXTnonaucun
rule_countINTEGERnonaucun
toolsJSONBnonaucun

Contraintes

NomRègle
agent_acts_assurance_connueCHECK (subject_assurance IN ('declaree', 'etablie'))
agent_acts_surface_connueCHECK (surface IN ('cli', 'ide'))
agent_acts_rang_positifCHECK (rank >= 1)
agent_acts_genre_connuCHECK (kind IN ('tool-call', 'session-frame'))
agent_acts_decision_connueCHECK (decision IS NULL OR decision IN ('allowed', 'refused'))
agent_acts_decideur_connuCHECK (decided_by IS NULL OR decided_by IN ('human', 'automation'))
agent_acts_issue_connueCHECK (outcome IS NULL OR outcome IN ('succeeded', 'failed', 'not-executed'))
agent_acts_motif_borneCHECK (reason IS NULL OR char_length(reason) <= 300)
agent_acts_outils_en_tableauCHECK (tools IS NULL OR jsonb_typeof(tools) = 'array')
agent_acts_appel_completCHECK (kind <> 'tool-call' OR (tool IS NOT NULL AND decision IS NOT NULL AND decided_by IS NOT NULL AND outcome IS NOT NULL))
agent_acts_cadre_completCHECK (kind <> 'session-frame' OR mode IS NOT NULL)
agent_acts_un_rang_par_sessionUNIQUE (session, rank)

Index

NomUniqueColonnesRestreint à
agent_acts_session_rangnonsession, rankaucune restriction
agent_acts_instantnonreceived_at DESCaucune restriction
ColonneTypeObligatoireDéfaut
idBIGSERIALouiaucunclé primaire
sessionTEXTouiaucun
revoked_atTIMESTAMPTZouiclock_timestamp()
revoked_byTEXTouiaucundonnée personnelle
revoked_by_assuranceTEXTouiaucun
reasonTEXTouiaucun

Contraintes

NomRègle
agent_session_revocations_session_non_videCHECK (btrim(session) <> '')
agent_session_revocations_auteur_non_videCHECK (btrim(revoked_by) <> '')
agent_session_revocations_assurance_connueCHECK (revoked_by_assurance IN ('declaree', 'etablie'))
agent_session_revocations_motif_non_videCHECK (btrim(reason) <> '')
agent_session_revocations_une_par_sessionUNIQUE (session)
ColonneTypeObligatoireDéfaut
idBIGSERIALouiaucunclé primaire
slugTEXTouiaucununique
nameTEXTouiaucun
created_atTIMESTAMPTZouinow()
ColonneTypeObligatoireDéfaut
idBIGSERIALouiaucunclé primaire
organization_idBIGINTouiaucunréférence organizations(id)
revisionTEXTouiaucun
documentJSONBouiaucun
validity_secondsINTEGERouiaucun
installed_atTIMESTAMPTZouinow()
installed_byTEXTouiaucundonnée personnelle

Contraintes

NomRègle
“UNIQUE (organization_id, revision)

Index

NomUniqueColonnesRestreint à
organization_policies_in_forcenonorganization_id, id DESCaucune restriction
ColonneTypeObligatoireDéfaut
idBIGSERIALouiaucunclé primaire
organization_idBIGINTnonaucunréférence organizations(id)
atTIMESTAMPTZouinow()
actorTEXTouiaucundonnée personnelle
actor_assuranceTEXTouiaucun
outcomeTEXTouiaucun
revisionTEXTnonaucun
refusal_reasonTEXTnonaucun
documentJSONBnonaucun
ColonneTypeObligatoireDéfaut
idBIGSERIALouiaucunclé primaire
announced_atTIMESTAMPTZouiclock_timestamp()
served_organizationTEXTouiaucun
ColonneTypeObligatoireDéfaut
idBIGSERIALouiaucunclé primaire
recorded_atTIMESTAMPTZouiclock_timestamp()
subjectTEXTouiaucundonnée personnelle
identity_sourceTEXTouiaucun
modelTEXTouiaucun
input_tokensINTEGERnonaucun
output_tokensINTEGERnonaucun
latency_msINTEGERnonaucun
request_idTEXTnonaucun

Index

NomUniqueColonnesRestreint à
relay_usage_sujet_instantnonsubject, recorded_at DESCaucune restriction

Créée par gateway-db/migrate.sh, et non par le fichier d’installation.

ColonneTypeObligatoireDéfaut
versionTEXTouiaucunclé primaire
applied_atTIMESTAMPTZouiNOW()

Les migrations elles-mêmes, l’ordre dans lequel elles s’appliquent, la sauvegarde et la restauration ne sont pas décrites ici. Ce qui est décrit est l’état du schéma, pas le chemin par lequel une base y arrive.