pub struct SchemaPerTenantStrategy { /* private fields */ }Expand description
Schema-per-tenant tenancy strategy implementation.
This strategy uses PostgreSQL schemas to isolate tenant data.
Each tenant has its own schema, and the connection’s search_path
is set to include the tenant’s schema.
§Schema Naming
Tenant IDs are converted to valid PostgreSQL schema names:
- Prefixed with the configured prefix (default:
tenant_) - Converted to lowercase
- Hierarchical separators (
/) replaced with underscores - Invalid characters removed
§Search Path
For each request, the search_path is set to:
SET search_path TO tenant_acme, shared, public;This allows:
- Tenant-specific tables in the tenant schema
- Shared resources (CodeSystems, etc.) in the shared schema
- Extension functions in public
§Schema Creation
Schemas can be created:
- Automatically on first access (if
auto_create_schemais true) - From a template schema (copying structure)
- Manually via migrations
Implementations§
Source§impl SchemaPerTenantStrategy
impl SchemaPerTenantStrategy
Sourcepub fn new(config: SchemaPerTenantConfig) -> Result<Self, Error>
pub fn new(config: SchemaPerTenantConfig) -> Result<Self, Error>
Creates a new schema-per-tenant strategy with the given configuration.
Sourcepub fn config(&self) -> &SchemaPerTenantConfig
pub fn config(&self) -> &SchemaPerTenantConfig
Returns the configuration.
Returns the shared schema name.
Sourcepub fn tenant_to_schema(&self, tenant_id: &TenantId) -> String
pub fn tenant_to_schema(&self, tenant_id: &TenantId) -> String
Converts a tenant ID to a schema name.
Sourcepub fn set_search_path_sql(&self, tenant_id: &TenantId) -> String
pub fn set_search_path_sql(&self, tenant_id: &TenantId) -> String
Generates SQL to set the search_path for a tenant.
Sourcepub fn set_system_search_path_sql(&self) -> String
pub fn set_system_search_path_sql(&self) -> String
Generates SQL to set the search_path for the system tenant.
Sourcepub fn reset_search_path_sql(&self) -> String
pub fn reset_search_path_sql(&self) -> String
Generates SQL to reset the search_path.
Sourcepub fn create_schema_sql(&self, tenant_id: &TenantId) -> String
pub fn create_schema_sql(&self, tenant_id: &TenantId) -> String
Generates SQL to create a schema for a tenant.
Sourcepub fn drop_schema_sql(&self, tenant_id: &TenantId, cascade: bool) -> String
pub fn drop_schema_sql(&self, tenant_id: &TenantId, cascade: bool) -> String
Generates SQL to drop a schema for a tenant.
Sourcepub fn schema_exists_sql(&self, tenant_id: &TenantId) -> String
pub fn schema_exists_sql(&self, tenant_id: &TenantId) -> String
Generates SQL to check if a schema exists.
Sourcepub fn list_tenant_schemas_sql(&self) -> String
pub fn list_tenant_schemas_sql(&self) -> String
Generates SQL to list all tenant schemas.
Trait Implementations§
Source§impl Clone for SchemaPerTenantStrategy
impl Clone for SchemaPerTenantStrategy
Source§fn clone(&self) -> SchemaPerTenantStrategy
fn clone(&self) -> SchemaPerTenantStrategy
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl Debug for SchemaPerTenantStrategy
impl Debug for SchemaPerTenantStrategy
Source§impl TenantResolver for SchemaPerTenantStrategy
impl TenantResolver for SchemaPerTenantStrategy
Source§fn resolve(&self, tenant_id: &TenantId) -> TenantResolution
fn resolve(&self, tenant_id: &TenantId) -> TenantResolution
Source§fn validate(&self, tenant_id: &TenantId) -> Result<(), TenantValidationError>
fn validate(&self, tenant_id: &TenantId) -> Result<(), TenantValidationError>
Source§fn system_tenant(&self) -> TenantResolution
fn system_tenant(&self) -> TenantResolution
Auto Trait Implementations§
impl Freeze for SchemaPerTenantStrategy
impl RefUnwindSafe for SchemaPerTenantStrategy
impl Send for SchemaPerTenantStrategy
impl Sync for SchemaPerTenantStrategy
impl Unpin for SchemaPerTenantStrategy
impl UnsafeUnpin for SchemaPerTenantStrategy
impl UnwindSafe for SchemaPerTenantStrategy
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> FmtForward for T
impl<T> FmtForward for T
Source§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
self to use its Binary implementation when Debug-formatted.Source§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
self to use its Display implementation when
Debug-formatted.Source§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
self to use its LowerExp implementation when
Debug-formatted.Source§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
self to use its LowerHex implementation when
Debug-formatted.Source§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
self to use its Octal implementation when Debug-formatted.Source§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
self to use its Pointer implementation when
Debug-formatted.Source§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
self to use its UpperExp implementation when
Debug-formatted.Source§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
self to use its UpperHex implementation when
Debug-formatted.Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
Source§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
Source§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read moreSource§fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read moreSource§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
Source§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R,
) -> R
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
Source§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
self, then passes self.as_ref() into the pipe function.Source§fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
self, then passes self.as_mut() into the pipe
function.Source§fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
self, then passes self.deref() into the pipe function.Source§impl<T> Pointable for T
impl<T> Pointable for T
Source§impl<T> PolicyExt for Twhere
T: ?Sized,
impl<T> PolicyExt for Twhere
T: ?Sized,
Source§impl<'p, T> Seq<'p, T> for Twhere
T: Clone,
impl<'p, T> Seq<'p, T> for Twhere
T: Clone,
Source§impl<T> Tap for T
impl<T> Tap for T
Source§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
Borrow<B> of a value. Read moreSource§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
BorrowMut<B> of a value. Read moreSource§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
AsRef<R> view of a value. Read moreSource§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
AsMut<R> view of a value. Read moreSource§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
Deref::Target of a value. Read moreSource§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
Deref::Target of a value. Read moreSource§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap() only in debug builds, and is erased in release builds.Source§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut() only in debug builds, and is erased in release
builds.Source§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
.tap_borrow() only in debug builds, and is erased in release
builds.Source§fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
.tap_borrow_mut() only in debug builds, and is erased in release
builds.Source§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
.tap_ref() only in debug builds, and is erased in release
builds.Source§fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
.tap_ref_mut() only in debug builds, and is erased in release
builds.Source§fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
.tap_deref() only in debug builds, and is erased in release
builds.