MySQL動態資料來源的實現

2022-01-12 18:12:54 字數 1706 閱讀 7619

在做報表統計和bi分析時,需要從業務系統資料取數,在從saas系統和類似用友u8產品資料來源中取數時,

由於其資料庫的儲存結構比較特殊,分兩種情況:

1.saas產品:每個使用者的資料儲存在獨立的資料庫當中,多個資料庫的結構相同。有一張綜合管理表管理各使用者對應的資料來源資訊。

2.u8:每年為乙個賬套,每個賬套為乙個獨立的資料庫,資料庫結構相同。有一張使用者表維護使用者資訊。

如果使用oracle或者sql server作為資料庫,則直接可以通過類似:

sqlserver:[資料庫名].[模式].[表名或者檢視名]

或者oracle:[使用者名稱].[表名]的方式實現。

而如果使用mysql作為資料庫,由於mysql動態sql支援的侷限性,無法直接使用以上方式實現,則需要進行特殊處理,需要使用prepare+execute對動態sql進行預處理,來實現動態資料來源的查詢。

例如,有乙個saas產品,有乙個綜合使用者管理表,儲存在dbuser資料庫;兩個業務庫:bi和bi2.分別儲存aaa和ccc的兩個客戶的業務資料。均有test表。

現在需要實現,當使用者aaa登入時,檢視的是aaa的資料;使用者ccc登入時,檢視的是ccc的資料。

dbuser庫的user表:id,使用者名稱 name,資料庫名 dbinfo

sql偽**:select * from (select dbname from dbuser where name='aaa').test

1.在資料庫建立儲存過程,用於實現根據不使用者查詢不同的資料來源;

/*建立儲存過程,設定入參 para_user,用於接收使用者資訊引數*/

create procedure proc_dynamic(in para_user nvarchar(20))

begin

declare stmt nvarchar(200);

declare sqlstr nvarchar(200);

declare dbname nvarchar(20);

/*獲取該使用者的資料來源名稱*/

select dbinfo into dbname from user where name = para_user;

set sqlstr=concat("select * from ",dbname,".test");

set @sql=sqlstr;

/*prepare預處理*/

prepare stmt from @sql;

execute stmt;

/*釋放預處理*/

deallocate prepare stmt;

end;

2.使用user表所在的dbuser資料庫建立資料來源。

3.建立報表,在報表中建立內嵌資料集。

3.1 執行儲存過程:

call proc_dynamic('aaa')

給定固定值呼叫儲存過程,用於獲取結果集的資料結構。

3.2 將呼叫語句改為動態sql。

="call proc_dynamic('" & usercontext.getvalue("name") & "')"

其中:usercontext.getvalue("name")為wyn reports內建函式,用於獲取當前登入使用者的使用者賬號。  

3.3 設計報表

3.4 測試

分別使用aaa和ccc賬號的使用者登入系統,即可發現,不同使用者登入進來檢視到的是自己對應的資料庫的資料。

動態資料來源 mysql

前言 最近開發時遇到這樣乙個場景 在一段定時任務中需要將a資料庫中查詢的結果處理後,然後插入b資料庫,這是就考慮到用動態資料來源,在這裡記錄一下配置過程,僅供參考 一 在spring.xml新增配置 二 新增相應的工具類 public inte ce datasourceentry 資料來源切換實現...

spring 動態資料來源

spring 可以設定動態資料來源,這樣可以對程式來透明的支援切換操作不同的資料庫。這篇文章寫得非常不錯。測試通過,並準備在專案中使用這個方法。還有幾個問題希望大家給點意見 首先說一下我的需求 資料庫結構都是一樣,但具體有多少個資料庫不確定 視具體使用者而定 使用者操作那個資料庫要根據登入的時候進行...

birt 動態資料來源

有兩種方法 1.date set編輯器中有property binging的屬性,的query text輸入 var query select d.u.name from deal d,user u server s where s.id u.server id and u.id d.user id...