Saas模式資料庫層資料架構以及資料刪除處理 (轉)
Saas 模式,所有的模式和服務可以為多個企業服務,每個企業都有自己的一套資料,在同一環境,管理相互隔離的資料,保證資料安全和可用性,是多企業資料架構解決的核心問題!
公司的產品涉及的客戶公司有幾千家,以前的資料庫設計是每個客戶獨立的一個資料庫,通過一個目錄資料庫獨立的訪問各家企業!在應用伺服器配置不同的連線池。不過問題來了,雖然不同的客戶,資料物理分離,安全性好,但是硬體成本太高,資料庫連線效率不高,因此採用了單一資料來源,利用muti-Schema,不同企業通過Schema 的不同,一一對應,這樣共享資料來源與連線池,效率上來說更高,成本更低!不過整個資料庫架構都需要從新設計,可喜的是產品架構設計獨立性,擴充套件性都兼顧了,只需要修改了資料庫層,新增新的程式碼規範,系統很好的過渡到Muti-Schema!
在整個框架過渡中,對於Muti-Schema存在的問題是資料庫的備份,匯入,刪除!資料庫的備份費時,所有的公司只能夠同時備份,不能夠單獨單個企業的處理!資料的匯入大量的應用了SSIS,產品的升級,從舊版本升級到新版本,海量資料的遷移,充分利用了SSIS,做了一個海量資料遷移工具,比起DTS,充分利用SSIS重寫一個遷移工具,針對不同的業務,充分發掘SSIS的優勢,與DTS不在一個級別!
資料庫的刪除,由於不是在單一的資料庫(單一的資料庫直接delete)!刪除資料庫比較麻煩,要刪除一個公司的資料庫,由於所有公司客戶的資料在同一資料庫,公司客戶是針對Schema 來區分的,所以一個解決方案是通過刪除對應公司的Schema 以及Shcema的所有物件!通過指令碼,寫了一個儲存過程,首先找出外來鍵,以及約束,生成指令碼插入到一個零時表,按順序的刪除外來鍵,約束,再view,proc,trigger 相關物件,從而達到刪除相關的公司客戶資料,而不影響其它的公司客戶的資料!
下面是具體的Muti-Schema資料庫刪除指令碼:
2 (
3 @SchemaName varchar(100)
4 )
5 AS
6 BEGIN
7 declare @SQL varchar(4000)
8 declare @msg varchar(500)
9
10 -- Create temp table ,insert into statement for drop all objects
11 IF OBJECT_ID('tempdb..#DropTableCode') IS NOT NULL DROP TABLE #DropTableCode
12 CREATE TABLE #DropTableCode
13 (
14 ID int identity(1,1),
15 SQLstatement varchar(1000)
16 )
17
18 -- drop all the foreign keys that reference a PK in the target schema
19 SELECT @SQL =
20 'select
21 '' ALTER TABLE ''+SCHEMA_NAME(fk.schema_id)+''.''+OBJECT_NAME(fk.parent_object_id)+'' DROP CONSTRAINT ''+ fk.name
22 FROM sys.foreign_keys fk
23 join sys.tables t on t.object_id = fk.referenced_object_id
24 where t.schema_id = schema_id(''' + @SchemaName+''')
25 and fk.schema_id <> t.schema_id
26 order by fk.name desc'
27 INSERT INTO #DropTableCode
28 EXEC (@SQL)
29
30 -- drop all default constraints, check constraints and Foreign Keys
31 SELECT @SQL =
32 'SELECT
33 '' ALTER TABLE ''+schema_name(t.schema_id)+''.''+OBJECT_NAME(fk.parent_object_id)+'' DROP CONSTRAINT ''+ fk.[Name]
34 FROM sys.objects fk
35 join sys.tables t on t.object_id = fk.parent_object_id
36 where t.schema_id = schema_id(''' + @SchemaName+''')
37 and fk.type IN (''D'', ''C'', ''F'')'
38 INSERT INTO #DropTableCode
39 EXEC (@SQL)
40
41 -- drop all other objects in order such as table,view,procedure .
42 SELECT @SQL =
43 'SELECT
44 CASE WHEN SO.type=''PK'' THEN '' ALTER TABLE ''+SCHEMA_NAME(SO.schema_id)+''.''+OBJECT_NAME(SO.parent_object_id)+'' DROP CONSTRAINT ''+ SO.name
45 WHEN SO.type=''U'' THEN '' DROP TABLE ''+SCHEMA_NAME(SO.schema_id)+''.''+ SO.[Name]
46 WHEN SO.type=''V'' THEN '' DROP VIEW ''+SCHEMA_NAME(SO.schema_id)+''.''+ SO.[Name]
47 WHEN SO.type=''P'' THEN '' DROP PROCEDURE ''+SCHEMA_NAME(SO.schema_id)+''.''+ SO.[Name]
48 WHEN SO.type=''TR'' THEN '' DROP TRIGGER ''+SCHEMA_NAME(SO.schema_id)+''.''+ SO.[Name]
49 WHEN SO.type IN (''FN'', ''TF'',''IF'',''FS'',''FT'') THEN '' DROP FUNCTION ''+SCHEMA_NAME(SO.schema_id)+''.''+ SO.[Name]
50 END
51 FROM SYS.OBJECTS SO
52 WHERE SO.schema_id = schema_id('''+ @SchemaName +''')
53 AND SO.type IN (''PK'', ''FN'', ''TF'', ''TR'', ''V'', ''U'', ''P'')
54 ORDER BY CASE WHEN type = ''PK'' THEN 1
55 WHEN type in (''FN'', ''TF'', ''P'',''IF'',''FS'',''FT'') THEN 2
56 WHEN type = ''TR'' THEN 3
57 WHEN type = ''V'' THEN 4
58 WHEN type = ''U'' THEN 5
59 ELSE 6
60 END'
61 INSERT INTO #DropTableCode
62 EXEC (@SQL)
63
64 -- drop all user-defined data types
65 SELECT @SQL=
66 'SELECT
67 '' DROP TYPE ''+'''+@SchemaName+'''+''.''+O.NAME
68 FROM sys.Types o
69 where is_user_defined=1
70 and schema_id=schema_id('''+@SchemaName+''')'
71 INSERT INTO #DropTableCode
72 EXEC(@SQL)
73
74 -- create a cursor for temp table '#DropTableCode' and fetch each statement to drop
75
76 DECLARE @statement varchar(1000)
77 DECLARE statement_cursor CURSOR
78 FOR SELECT SQLStatement
79 FROM #DropTableCode
80 ORDER BY ID ASC
81
82 OPEN statement_cursor
83 FETCH statement_cursor INTO @statement
84 WHILE (@@FETCH_STATUS = 0)
85 BEGIN
86 BEGIN
87 PRINT (@statement)
88 EXEC(@statement)
89 END
90 FETCH statement_cursor INTO @statement
91 END
92 CLOSE statement_cursor
93
94 DEALLOCATE statement_cursor
95 -- drop schema name
96 iF UPPER(@SchemaName) = 'DBO' PRINT ('DBO Will not drop')
97 ELSE
98 BEGIN
99 PRINT ('DROP SCHEMA '+@SchemaName)
100 EXEC ('DROP SCHEMA '+@SchemaName)
101 END
102 PRINT '------- ALL - DONE -------'
103 END
上面的Proc對於 Muti-Schema資料庫的設計刪除以及海量資料的遷移過程中起到了很大的作用!應為在資料遷移的工程中,遷移工具要做很多工作,比如版本比較,遷移之後的資料比較是否正確,在開發遷移工具的Test過程中,充分發揮了威力!版本比較,遷移之後資料不一致都需要刪除從做,所以上面的Proc起到了很大的幫助!
資料遷移,海量挖掘,從DTS到SSIS!不斷繼續深入著!
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/16436858/viewspace-671387/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 用SQL Server資料庫處理資料層錯誤SQLServer資料庫
- 誤刪資料庫資料檔案的處理方法資料庫
- 已為資料庫映象啟動資料庫,必須刪除資料庫映象才能刪除該資料庫資料庫
- Laravel 資料庫裡的資料刪除Laravel資料庫
- 批量刪除Oracle資料庫的資料Oracle資料庫
- docker資料卷概念以及刪除資料卷方法Docker
- 海量資料處理_刪除重複行
- 大資料架構和模式(三)——理解大資料解決方案的架構層大資料架構模式
- indexedDB 刪除資料庫Index資料庫
- EM資料庫重建 手動刪除資料庫資料庫
- 【RAC】刪除RAC資料庫節點(一)——刪除資料庫例項資料庫
- MongoDB資料庫中更新與刪除資料MongoDB資料庫
- 刪除sql server資料庫中所有資料SQLServer資料庫
- angualrJs對資料庫資料處理的增刪改查JS資料庫
- 大資料平臺之大資料處理系統的架構大資料架構
- 資料湖+資料倉儲 = 資料湖庫架構架構
- MongoDB 資料庫建立刪除、表(集合)建立刪除、資料增刪改查MongoDB資料庫
- SQL Server實戰二:建立、修改、複製、刪除資料庫表並加以資料處理SQLServer資料庫
- 2.11 刪除資料庫資料庫
- 如何刪除oracle資料庫Oracle資料庫
- 刪除資料庫指令碼資料庫指令碼
- 手工刪除oracle資料庫Oracle資料庫
- 手動刪除資料庫資料庫
- [Oracle]Oracle資料庫資料被修改或者刪除恢復資料Oracle資料庫
- 刪除資料
- Oracle資料庫意外刪除資料檔案的恢復(轉載)Oracle資料庫
- 從LinkedIn的資料處理機制學習資料架構架構
- ES資料庫架構資料庫架構
- whk我【資料刪除】你個【資料刪除】的
- java處理資料庫date型別資料Java資料庫型別
- 資料庫如何處理大資料訪問資料庫大資料
- 小程式批次刪除雲資料庫裡的資料資料庫
- 誤刪除儲存SqlServer資料庫資料恢復SQLServer資料庫資料恢復
- 海量資料處理 (轉)
- 【恢復】非歸檔模式下因誤刪除資料檔案導致資料庫無法OPEN的故障處理模式資料庫
- 造資料難,刪除資料容易
- oracle手動刪除資料庫Oracle資料庫
- [MYSQL] 資料庫建立與刪除MySql資料庫