mermaid
graph TB
subgraph βHANDBOOKβ
HB[βπ RBAC_Framework_Handbook.md
- Architecture Overview
- Table Definitions
- Stored Procedures
- Usage Examplesβ]
end
subgraph "DATABASE LAYER"
META["ποΈ adw_rbac_metadata<br/>---<br/>Stores permission<br/>mappings between<br/>tables and roles"]
AUDIT["π adw_rbac_audit_log<br/>---<br/>Logs all RBAC<br/>operations with<br/>success/failure status"]
VIEWS["ποΈ VIEWS<br/>---<br/>vw_active_rbac<br/>vw_successful_ops<br/>vw_failed_ops<br/>vw_ops_summary"]
end
subgraph "UI LAYER"
STREAMLIT["π― Streamlit App<br/>main.py<br/>---<br/>Interactive dashboard<br/>for RBAC management"]
end
subgraph "PAGES"
PAGE1["π Dashboard<br/>- Overview stats<br/>- Permission charts"]
PAGE2["π Metadata Mgmt<br/>- View permissions<br/>- Edit entries"]
PAGE3["π Add Permission<br/>- New role grants<br/>- Bulk operations"]
PAGE4["π Audit Log<br/>- Operation history<br/>- Error tracking"]
end
subgraph "DDL SCRIPTS"
DDL1["adw_rbac_metadata.ddl<br/>- Table creation<br/>- 5 indexes<br/>- 1 view"]
DDL2["adw_rbac_audit_log.ddl<br/>- Table creation<br/>- 5 indexes<br/>- 3 views"]
DDL3["INSTALL_RBAC_METADATA.ddl<br/>- Master installer<br/>- Complete setup<br/>- Sample data"]
end
HB -->|Defines| META
HB -->|Defines| AUDIT
HB -->|Guides| DDL3
DDL1 -->|Creates| META
DDL2 -->|Creates| AUDIT
DDL3 -->|Orchestrates| DDL1
DDL3 -->|Orchestrates| DDL2
META -->|Powers| VIEWS
AUDIT -->|Powers| VIEWS
VIEWS -->|Data Source| STREAMLIT
META -->|CRUD Operations| STREAMLIT
AUDIT -->|Read Operations| STREAMLIT
STREAMLIT --> PAGE1
STREAMLIT --> PAGE2
STREAMLIT --> PAGE3
STREAMLIT --> PAGE4
PAGE2 -->|Updates| META
PAGE3 -->|Creates| META
PAGE4 -->|Reads| AUDIT
audit.adw_rbac_metadata: Configuration table
audit.adw_rbac_audit_log: Audit table
audit.adw_rbac_metadata for permission managementaudit.adw_rbac_audit_log for audit trails| Page | Purpose | Data Source |
|---|---|---|
| Dashboard | Overview & statistics | Both tables |
| Metadata Management | View/edit permissions | adw_rbac_metadata |
| Add Permission | Create new grants | Insert to adw_rbac_metadata |
| Audit Log | Operation history | adw_rbac_audit_log |
βββββββββββββββββββ
β Streamlit App β
ββββββββββ¬βββββββββ
β SELECT
βΌ
βββββββββββββββββββ ββββββββββββββββββββ
β Views (active) ββββββββ€ vw_active_rbac β
βββββββββββββββββββ ββββββββββββββββββββ
β
βββββββΊ Dashboard Visualizations
βββββββΊ Permission Tables
βββββββΊ Audit History
ββββββββββββββββββββ
β User Input (UI) β
ββββββββββ¬ββββββββββ
β
βΌ
ββββββββββββββββββββ
β Streamlit App β
ββββββββββ¬ββββββββββ
β INSERT/UPDATE
βΌ
ββββββββββββββββββββββββββββββββ
β audit.adw_rbac_metadata β
β - New permissions added β
β - Status tracked β
β - Timestamps recorded β
ββββββββββββββββββββββββββββββββ
User β Streamlit "Add Permission" Page
β
User enters: Database, Schema, Table, Role, Permission
β
INSERT INTO audit.adw_rbac_metadata
ββ database_name, schema_name, table_name
ββ role_name, permission_type
ββ effective_start_date, record_created_by
ββ record_create_ts (current time)
β
View refreshes showing new permission in Dashboard
β
Permission ready for USP_GRANT_RBAC execution
User β Streamlit "Audit Log" Page
β
SELECT * FROM audit.vw_successful_rbac_operations
ββ operation_type (GRANT, REVOKE, DRY_RUN)
ββ execution_status (SUCCESS, FAILED)
ββ sql_statement (actual SQL executed)
ββ error_message (if failed)
ββ record_create_ts (when it happened)
β
Dashboard shows historical operations with filters
β
User can drill down into specific operations
User β Streamlit "Metadata Management" Page
β
SELECT * FROM audit.vw_active_rbac_metadata
ββ Filters by current date (effective_start_date β€ today)
ββ Excludes expired permissions (effective_end_date > today)
ββ Shows only active records (record_status_cd = 'A')
β
Dashboard displays active permission matrix
Document what tables and columns are needed in the RBAC framework.
Create matching table structures in Snowflake:
-- INSTALL_RBAC_METADATA.ddl
CREATE TABLE audit.adw_rbac_metadata ( ... )
CREATE TABLE audit.adw_rbac_audit_log ( ... )
Update Streamlit to reference handbook tables:
# main.py
st.session_state.metadata = pd.DataFrame({
'rbac_id': [...],
'database_name': [...],
'schema_name': [...],
# All columns from audit.adw_rbac_metadata
})
All three layers now work together:
| Handbook Table | DDL File | Database Object | Streamlit Page |
|---|---|---|---|
| adw_rbac_metadata | adw_rbac_metadata.ddl | Table + View | Metadata Management |
| adw_rbac_audit_log | adw_rbac_audit_log.ddl | Table + 3 Views | Audit Log |
| β | β | vw_active_rbac_metadata | Dashboard |
| β | β | vw_successful_rbac_operations | Audit Log |
| β | β | vw_failed_rbac_operations | Audit Log |
| β | β | vw_rbac_operations_summary | Dashboard Stats |
After running DDL scripts, verify the complete chain:
-- 1. Verify tables exist and have correct structure
DESC TABLE audit.adw_rbac_metadata;
DESC TABLE audit.adw_rbac_audit_log;
-- 2. Verify views exist
SHOW VIEWS IN SCHEMA audit;
-- 3. Verify indexes exist
SHOW INDEXES ON TABLE audit.adw_rbac_metadata;
-- 4. Test views work
SELECT * FROM audit.vw_active_rbac_metadata;
SELECT * FROM audit.vw_successful_rbac_operations;
Then start Streamlit and verify the UI connects successfully:
streamlit run app/main.py
Complete Integration β All layers are now aligned and ready for deployment!