顯示具有 資料庫系統管理與設計 標籤的文章。 顯示所有文章
顯示具有 資料庫系統管理與設計 標籤的文章。 顯示所有文章
就是愛分享
在SQL Server中,我們可以使用二種方法來設定自動化的資料處理規則:

1.條件約束(Constraint)可以直接設定於資料表內,通常不需另外撰寫程式。但此方法只能進行比較單純的運作,包括自動填入預設值(DEFAULT),確保欄位資料不得重複(PRIMARY KEY/UNIQUE KEY)、限制輸入值在某個範圍內(CHECK)、維護資料表間的參考完整性(FOREIGN KEY)...等。

2.觸發程序(Trigger)是針對單一資料表所撰寫的特殊預存程序,當該資料表發生INSERT、UPDATE或DELETE時會自動被觸發(執行),以進行各項必要的處理工作。由於是撰寫程式,因此無論是單純或複雜的工作都可一手包辦。

當然,如果只是單純的自動化工作,我們應儘量利用條件約束來完成,因為這樣做一方面容易設定及維護,另一方面執行效率也會比較好。只有當條件約束無法滿足實際需求時,才應考慮使用觸發程序來處理。

那麼,觸發程序到底有什麼特異功能呢?底下來看幾個例子:

檢查所做的更改是否允許:
雖然我們可以用資料表的條件約束來維護資料完整性,例如CHECK、PRIMARY KEY/UNIQUE KEY、FOREIGN KEY等,但觸發程序可以做更多樣、更複雜的檢查。例如同時檢查許多個資料表,或使用IF...ELSE等來做更有彈性的檢查。

‧進行其他相關資料的更改動作:
例如當某筆訂單被取消時,我們可以利用觸發程序去自動刪除相關的送貨單資料,並將業務員的獎金扣一半;或是在更改員工的薪資時,將更改的日期及原薪資存入另一個薪資異動資料表中。

‧發出更改或預警的通知:
例如當有新進員工的資料被輸入時,觸發程序可以自動發Mail通知該部門的所有人員;或是當庫存量小於安全量時,即發Mail通知倉庫管理員要趕快進貨。

‧自訂錯誤訊息:
當操作不符合條件約束時,所回應給前端應用程式的錯誤訊息都是固定的內容。利用觸發程序,則可以回應我們自訂的錯誤訊息。

‧更改原來所要進行的資料操作:
利用SQL Server 2005的INSTEAD OF觸發程序,我們可以撰寫程式來取代原本應該進行的資料操作。例如當新增一筆記錄時,我們可以將該記錄的資料另做處理,而不存入資料表中。

‧檢視表也可以有觸發程序:
檢視表中的計算欄位通常是不允許更改的,但同樣是利用INSTEAD OF觸發程序,我們可以打破這個限制,將預備要更改的資料欄截出來另外處理。例如可將使用者輸入的地址先分解成縣市與街道二部份,再分別存入縣市與街道欄位。

其實觸發程序就像是倉庫的管理員一樣,當有貨物要進出時,管理員即會出面做查核或協調,以維護整個倉庫的正常運作。因此,如果您是資料庫的管理者(DBA,DataBase Administrator),那麼就應該好好利用觸發程序的功能,為每個重要的資料表都設計一個最佳的倉庫管理員,這樣就不用擔心使用者胡作非為,或是不按照牌理出牌了。

觸發程序的種類與觸發時機

觸發程序可分為2種:
‧AFTER觸發程序:這類的觸發程序要在資料已變動完成之後(AFTER),才會被啟動並進行必要的善後處理或檢查。若發現有錯誤,則可用ROLLBACK TRANSATION敘述將此次操作所更動的資料全部回復。

‧INSTEAD OF觸發程序:INSTEAD OF是"取代"的意思,就是這類觸發程序會取代原本要進行的操作(例如新增或更改資料的動作),因此會在資料變動之前就發生,而且資料要如何變動也完全取決於觸發程序。

INSTEAD OF觸發程序能夠適用於資料表及檢視表(View)上;而AFTER觸發程序則只能使用於資料表。

另外,當我們在建立觸發程序時,還必須指定程序要被觸發的操作時機:INSERT、UPDATE或DELETE,至少要指定一種,當然一個觸發程序也可同時指定二種或三種時機。在同一個資料表中,我們可以建立許多的AFTER觸發程序,但INSTEAD OF觸發程序針對每種操作(INSERT、UPDATE、DELETE)最多只能各有一個。

如果針對某操作同時設定了INSTEAD OF及AFTER觸發程序,那麼只有前者會被觸發,後者未必會被觸發。

觸發程序的建立與修改
用SQL建立觸發程序的簡易語法如下:

CREATE TRIGGER trigger_name
ON {table | view}
[WITH ENCRYPTION]
{FOR | AFTER | INSTEAD OF} { [DELETE] [,] [INSERT] [,] [UPDATE]}
AS
sql_statements


閱讀全文...
就是愛分享
當我們在撰寫SQL程式時,多少都會用到一些系統內建的函數,例如GETDATE()、CAST(...)等。而SQL Server 2005的「使用者自訂函數」功能,則讓我們也可以自己來建立函數,然後直接應用於SQL敘述或運算式中。

自訂函數其實和預存程序是很類似的,都是由多行T-SQL敘述所組成的程式單元。不過它們之間還是有一些明顯的差異:

1.預存程序只能傳回一個整數值;而自訂函數則可傳回各種資料型別的值(但text、ntext、image、timestamp、cursor及rowversion除外),甚至包括了sql_variant及table型別。

2.預存程序可以經由參數來傳資料(將參數設為OUTPUT);但自訂函數則只能接收參數,不可由參數傳回資料。

3.在預存程序中可以做任何的資料異動,例如新增或修改資料、更改資料庫的設定...等;但自訂函數則不允許更改資料庫的狀態或內容。

4.預存程序必須以EXECUTE來執行,因此不能使用在運算式之中,例如myProc會傳回2,那麼「SET @var=myProc」或「SELECT * FROM myProc」都會造成錯誤。而自訂函數則除了可用EXECUTE來執行外,也可用於運算式中,並以傳回值來取代其名稱,例如假設myFun(3)會傳回"Good",則「SET @var=myFun(3)+'!'」就相當於「SET @var='Good'+'!'」。

一般來說,預存程序比較適合做一些對資料庫的操作或設定,其執行結果通常不必傳回,或將結果傳回到執行該程序的應用程式中(例如將SELECT敘述的結果傳回到SQL查詢或前端應用程式中);而自訂函數則適用於計算或擷取資料,然後將結果傳回給呼叫它的運算式或SQL敘述(例如SELECT或FROM子句)中使用。

自訂函數的建立

您可以在SQL Server Management Studio中建立自訂函數,其操作方法也和預存程序差不多,只是SQL語法有所不同而已:



自訂函數依傳回值及函數內容可分為兩大類:

1.純量值函數(Scalar-valued function):這類函數會傳回單一的資料值,而資料值的型別可以是除了text、ntext、image、cursor及rowversion(timestamp)之外的任何型別。若是傳回table型別的資料,則歸屬於下列二類函數。

2.傳回資料集(Rowset)的自訂函數:這類函數可傳回一個table型別的資料集,依其定義語法的不同,又分為2小類:

‧嵌入資料表值函數(Inline table-valued function):或稱為「行內資料集函數」。函數的內容僅有一個SELECT敘述,而傳回值即是該SELECT的查詢結果。

‧多重陳述式資料表值函數(Multistatement table-valued function):或稱為「多敘述資料集函數」。函數內容包含許多的敘述,而最後也會傳回一個table型別的資料集。

閱讀全文...
就是愛分享
在預存程序中使用敘述時,需注意以下的限制:

1.在預存程序中,有些敘述不可使用,包括:


而除了上表以外的其他敘述則可以使用,甚至我們可以在預存程序中建立物件(例如CREATE TABLE)並進行存取;也就是說,在編譯預存程序時,其內所參照到的物件可以不存在,只要在該敘述實際執行時,所參照的物件已經存在即可。

2.在同一個資料庫中,只要使用不同的結構描述,便可以建立相同名稱的物件。因此不管執行者是誰,只要預存程序中未指明物件的結構描述,都會先找以預存程序所屬的結構描述來尋找物件,找不到的話再換用"dbo.物件",若都找不到則產生錯誤訊息。

3.有些指令在執行時若未指定結構描述,會固定以目前使用者的預存結構描述來尋找或建立物件,這些指令包括:

因此在預存程序中使用這些敘述時,最好要同時指明結構描述,以免其他使用者在執行時發生預期之外的結果。

參數傳遞的技巧

當我們執行預存程序時,若未指明參數名稱,則必須依照預存程序所需的參數依序傳過去;而且除非該參數有指定預存程序並且是在最後面,否則不可以省略。

預存程序的3種傳回值
1.在程序中以"RETURN n"傳回整數值。
2.在參數中指定OUTPUT選項的參數。
3.預存程序中執行敘述(例如SELECT)所傳回的資料集(RecordSet)及通知訊息。

閱讀全文...
就是愛分享
「預存程序」(Stored Procedure)就是將常用的或很複雜的工作,預先以SQL程式寫好,然後指定一個程序名稱儲存起來,那麼以後只要使用EXECUTE敘述來執行這個程序,即可自動完成該項工作。

預存程序的優點

預存程序中可以包含資料存取敘述、流程控制敘述、錯誤處理敘述...等在使用上非常有彈性。其優點有:

執行效率高:SQL Server會預先將預存程序編譯成一個執行計劃並儲存起來,因此每次執行預存程序時都不需要再重新編譯,如此可以加快執行速度。由此可知,我們應該將經常使用的一些操作寫成預存程序,來提高SQL Server的運作效率。

統一的操作流程:我們可以將複雜的工作製做成預存程序,如此除了節省人力操作的時間外,對於一般使用者來說,也可以維持一致的資料操作流程,並避免使用者不小心的操作錯誤。例如當某項資料變更時,必須更動到5個資料表的內容,那麼將更新步驟寫成預存程序來執行,不但省事,而且也不怕漏掉任何一個資料表。

重複使用:預存程序還可模組化(將大的程序分解成許多較小而且可以獨立運作的程序),以方便除錯、維護、或重複使用於不同的地方。例如當我們要將「地址」資料分解成「市、街、號、樓」4個字串時,可寫一個預存程序來處理,那麼以後在任何地方只要執行此預存程序,即可完成分解地址的工作。

安全性:當資料表需要保密時,我們可以利用預存程序來作為資料存取的管道。例如當使用者沒有某資料表的存取權限時,我們可以設計一個預存程序供其執行,以存取該資料表中的某些資料,或進行特定的資料處理工作。此外,預存程序的內容還可以加密編碼,這樣別人就看不到預存程序中的程式了。

預存程序的種類

預存程序可分為3類:

系統預存程序(System stored procedures)
系統預存程序一律以sp_開頭,例如"sp_dboption"。此類預存程序為SQL Server內建的預存程序,通常是用來進行系統的各項設定、取得資訊或相關管理工作。

延伸預存程序(Extended stored procedures)
延伸預存程序通常是以xp_開頭,例如"xp_logininfo"。此類程序大多是以傳統的程式語言(例如C++)撰寫而成,其內容並不是儲存在SQL Server中,而是以DLL的形式單獨存在。

我們可以把延伸預存程序看成是SQL Server的外掛程式,它可以擴充SQL Server的功能,例如SQL Server沒有從網頁中萃取資料的能力,則我們可以撰寫一個DLL的延伸預存程序,以供SQL Server將之載入並執行。

使用者自訂的預存程序(User-defined stored procedures)
就是我們自己設計的預存程序,其名稱可以任意取,但最好不要以sp_或xp_開頭,以免造成混淆。自訂的預存程序會被加入所屬資料庫的預存程序項目中,並以物件的形式儲存。

用SQL語言建立預存程序
建立預存程序是使用CREATE PROCEDURE敘述,其語法如下:

CREATE PROC[EDURE] procedure_name [;number]
[@parameter data_type [VARYING] [= default] [OUTPUT]]
[,...n]
[WITH {RECOMPILE | ENCRYPTION | RECOMPILE, ENCRYPTION }]
[FOR REPLICATION]
AS sql_statement [...n]


閱讀全文...
就是愛分享
在存取資料庫時,我們所下的SQL敘述不一定要一個一個地執行,也可以利用批次(Batch)的方式,將一個或多個SQL敘述打包,一起送到SQL Server去處理。SQL Server會將一個批次中所包含的數個SQL敘述當做一個執行單元(Unit),一起編譯成為執行計畫(Execution plan),然後再加以執行。

不過請注意,並非所有SQL敘述皆可放在同一個批次內執行,例如CREATE VIEW、CREATE DEFAULT、CREATE RULE、CREATE PROCESURE及CREATE TRIGGER敘述只能單獨放在一個批次中執行,不能與其他敘述合併執行。

用GO分隔不同的批次

因為不是所有SQL敘述都可以放再同一個批次,或是有些情況下,您可以會希望讓某些敘述分開執行。假設您有三個敘述需要執行,如果三個敘述全部放再同一批次,則當第1個敘述失敗時,批次就會停止,而不會繼續執行第2、3個敘述,若是能夠將第1與第2、3個敘述隔開,就可以確保後面敘述可以順利執行。

所以SQL Server提供了一個GO指令,讓您可以隔開SQL敘述,將之分為多個批次。下面是一個簡單的範例:

USE 練習02 <-------第1個批次
GO
SELECT * -----
FROM 客戶 |
SELECT * |---第2個批次
FROM 訂單 ----|
GO

當SQL Server遇到GO指令時,會將GO當作傳送批次的訊號,例如遇到第1個GO的時候,會將GO前面的敘述傳送給伺服器進行處理(編譯成執行計劃並加以執行)。而遇到第2個GO指令時,再將兩個SELECT敘述傳送給伺服器處理,如此就產生兩個批次。

請注意,GO只有SQL Server Management Studio提供的工具程式才能辦識並處理。意即GO指令只能使用在SQL Server Management Studio中執行,若是您撰寫應用程式(例如用Visual Basic撰寫)時使用GO指令,那麼SQL Server將會因不認得而產生錯誤訊息。

閱讀全文...
就是愛分享
資料庫定義到char類型的欄位時,不知道大家是否會猶豫一下,到底選char、nchar、varchar、nvarchar、text、ntext中哪一種呢?結果很可能是兩種,一種是節儉人士的選擇:最好是用定長的,感覺比變長能省些空間,而且處理起來會快些,無法定長只好選用定長,並且將長度設置盡可能地小;另一種是則是覺得無所謂,儘量用可變類型的,長度儘量放大些。

鑒於現在硬體像蘿蔔一樣便宜的大好形勢,糾纏這樣的小問題實在是沒多大意義,不過如果不弄清它,總覺得對不起勞累過度的CPU和硬碟。

下面開始了(以下說明只針對SqlServer有效):

1、當使用非unicode時慎用以下這種查詢:
select f from t where f = N'xx'

原因:無法利用到索引,因為資料庫會將f先轉換到unicode再和N'xx'比較

2、char 和相同長度的varchar處理速度差不多(後面還有說明)

3、varchar的長度不會影響處理速度!!!(看後面解釋)

4、索引中列總長度最多支援總為900位元組,所以長度大於900的varchar、char和大於450的nvarchar,nchar將無法創建索引。

5、text、ntext上是無法創建索引的。

6、O/R Mapping中對應實體的屬性類型一般是以string居多,用char[]的非常少,所以如果按mapping的合理性來說,可變長度的類型更加吻合。

7、一般基礎資料表中的name在實際查詢中基本上全部是使用like '%xx%'這種方式,而這種方式是無法利用索引的,所以如果對於此種欄位,索引建了也白建。

8、其他一些像remark的欄位則是根本不需要查詢的,所以不需要索引。

9、varchar的存放和string是一樣原理的,即length {block}這種方式,所以varchar的長度和它實際佔用空間是無關的。

10、對於固定長度的欄位,是需要額外空間來存放NULL標識的,所以如果一個char欄位中出現非常多的NULL,那麼很不幸,你的佔用空間比沒有NULL的大(但這個大並不是大太多,因為NULL標識是用bit存放的,可是如果你一行中只有你一個NULL需要標識,那麼你就白白浪費1byte空間了,罪過罪過!),這時候,你可以使用特殊標識來存放,如:'NV'。

11、同上,所以對於這種NULL查詢,索引是無法生效的,假如你使用了NULL標識替代的話,那麼恭喜你,你可以利用到索引了。

12、char和varchar的比較成本是一樣的,現在關鍵就看它們的索引查找的成本了,因為查找策略都一樣,因此應該比較誰佔用空間小。在存放相同數量的字元情況下,如果數量小,那麼char佔用長度是小於varchar的,但如果數量稍大,則varchar完全可能小於char,而且要看實際填充數值的充實度,比如說varchar(3)和char(3),那麼理論上應該是char快了,但如果是char(10)和varchar(10),充實度只有30%的情況下,理論上就應該是varchar快了。因為varchar需要額外空間存放塊長度,所以只要length(1-fillfactor)大於這個存放空間(好像是2位元組),那麼它就會比相同長度的char快了。

13、nvarchar比varchar要慢上一些,而且對於非unicode字元它會佔用雙倍的空間,那麼這麼一種類型推出來是為什麼呢?對,就是為了國際化,對於unicode類型的資料,排序規則對它們是不起作用的,而非unicode字元在處理不同語言的資料時,必須指定排序規則才能正常工作,所以n類型就這麼一點好處。

總結陳詞:
1、如果資料量非常大,又能100%確定長度且保存只是ansi字元,那麼char。
2、能確定長度又不一定是ansi字元或者,那麼用nchar;
3、不確定長度,要查詢且希望利用索引的話,用nvarchar類型吧,將它們設到400;
4、不查詢的話沒什麼好說的,用nvarchar(4000)。
5、性格豪爽的可以只用3和4,偶爾用用1,畢竟這是一種額外說明,等於告訴別人說,我一定需要長度為X位元的數據。

閱讀全文...
就是愛分享
SQL Server的安全管理可分為兩階段:
驗證(Authentication):驗證使用者是否有權利登入SQL Server伺服器,使用SQL Server提供的服務。

授權(Authorization):也就是設定使用者登入後,可對伺服器做哪些動作、使用哪些資料庫、存取哪些資料表等存取權限。

登入帳戶
在SQL Server中,將用來驗證使用者身份的帳戶稱為登入(Login)。SQL Server提供兩種驗證方式:Windows驗證 - 在SQL Server中建立對應到現有Windows 2000/2003本機或網域帳戶的「登入」,當使用者已用合法的帳戶登入Windows後,要存取SQL Server時,只要他目前所用的Windows帳戶已在SQL Server中有對應的登入,SQL Server就會允許他連線。

SQL Server驗證 - 指由SQL Server自己負責驗證使用者的身份,因此使用這種驗證方式時,管理員需事先y在SQL Server中建好所需的登入及密碼,使用者在連線伺服器時,則必須輸入登入名稱及密碼。通過驗證後才能連上伺服器,使用其資源。

存取權限
在SQL Server中,可被設定存取權限給使用者的物件或動作稱為安全性實體(Securable),安全性實體的種類相當多,可概分為三個層次:
伺服器層級 - 例如登入、資料庫、連結伺服器、端點(Endpoint)等屬於整個SQL Server執行個體的安全性實體都是屬於這個層級,這類安全性實體的存取權限,也都要以登入為授與對象,而一般為方便設定,都是直接透過內建的伺服器腳色(Server Role)來設定登入對伺服器安全性實體的存取權限;當然SQL Server也允許不透過伺服器角色,而個別設定某安全性實體的存取權限。

資料庫層級 - 舉凡屬於某資料庫本身的安全性實體都屬此類,像是資料庫使用者、資料庫角色、結構描述、全文檢索目錄等,原則上,這類安全性實體都需授與給資料庫使用者。

結構描述層級 - 這類安全性實體包括資料表、檢視表、預存程序、函數等等,這個層級的存取權限自然也是以資料庫使用者為主要授與對象。

使用者
使用者(user)這個資料庫物件,就是用來設定登入帳戶對資料庫是否有存取權。由於每個資料庫所允許使用的人都不同,所以每個資料庫都有它自己的使用者物件,假設我們想使用SQL Server中所有的資料庫,那麼在每個資料庫中,都要有以我們的登入帳戶所建立的使用者物件才行。

角色
角色(role)是用來指定存取權限的資料庫物件,而且每個資料庫都有它自己的角色物件,每個角色也都有其獨立的存取權限設定。例如我們可指定某些角色只可查詢資料表資料、有些角色則可更改或刪除資料。設定好角色之後,我們只需再指定每一個使用者可以扮演哪些角色,就可讓使用者取得與角色相同的存取權限。

閱讀全文...
就是愛分享
SQL Server的資料庫可分為系統資料庫和使用者資料庫兩種,其中系統資料庫就是SQL Server自己所使用的資料庫,至於使用者資料庫就是由我們自己建立的資料庫。

系統資料庫是在SQL Server安裝好時就會被建立的,分別有master、msdb、model、tempdb這四個基本的系統資料庫,而且不能刪除這些資料庫。除此之外,還有一個隱藏的Resource資料庫,但在Management Studio中看不到它。以下簡單說明這幾個系統資料庫的用途:

master
master資料庫記錄的是有關SQL Server的資訊,包括所有的登入帳戶、系統的組態、各資料的初始資訊等各類重要資料。SQL Server 2005基於安全性的考量,已不再讓我們直接瀏覽、修改各資料庫中的系統資料表,而是必須透過系統檢視(system view)來瀏覽。我們可用"select * from sysobjects where type ='S'"來查看master資料庫中有多少隱藏起來的資料表。

由於master資料庫的內容對整個資料庫系統的關係重大,因此最好要定時備份此資料庫的內容。

msdb
msdb是另一個供系統使用的資料庫,其主要用途是供SQL Server Agent做各類排程作業(job)所用的資料庫。除了SQL Server Agent的資料外,有關備份和還原的記錄、複寫和資料維護計劃等資訊也都是放在這個資料庫中。

model
model是個較特殊的系統資料庫,或許應稱它為「樣板」資料庫。當我們在SQL Server中建立新的資料庫時,SQL Server會以model資料庫為藍本,將其內容複製到我們的新資料庫,因此在所有新建的資料庫中,都會有和model資料庫內容一樣的系統資料表和檢視表等資料庫物件。

tempdb
由名稱就可看出,tempdb是用來存放暫時性資料用的,像是使用者在進行各種查詢或排序時,SQL Server就會在此建立這些暫時性的工作資料表。由於是"暫時性"的,所以tempdb中的資料沒有什麼保存的價值,因此每次SQL Server重新啟動時,都會重建一份新的tempdb資料庫。

Resource
雖然在Management Studio中根本看不到這個資料庫,但只要用檔案總管進入SQL Server的資料庫檔資料夾(例如Program Files\Microsoft SQL Server\MSSQL.l\MSSQL\Data),就可以看到Resource資料庫的資料檔及交易記錄檔mssqlsystemresource.mdf、mssqlsystemresource.ldf,此資料庫檔還不算小,因為它存放了許多與SQL Server 2005本身相關的系統物件,使用者物件都不會存放Resource資料庫中。

SQL Server 2005採用Resource資料庫的目的之ㄧ,就是讓系統資源集中存放管理,日後將可透過升級Resource資料庫的方式,即可升級SQL Server 2005的功能。

以上簡單介紹了SQl Server中內建的系統資料庫,除了這些系統資料庫外,在每個使用者資料庫中,也會有一些系統內建的物件,其中最重要的就是系統資料表和檢視表。

閱讀全文...
就是愛分享
電腦科技日益進步,但經過數十年的發展,電腦軟硬體的穩定性仍未達多數人能滿意的水準,電腦中的資料還是有喪失或毀損的情況發生,若再加上天災人禍等意外狀況,存於電腦中的資料實在是不太安全了。就算使用的是具有容錯能力的RAID磁碟陣列,也是難以保證資料庫是百分之百的安全。

雖然電腦軟硬體設備的費用可能不便宜,但大多數的人都認同經過長時間所累積的電腦資料才是更珍貴的資產,因此為了防止在各種意外發生時,仍能保有資料庫的完整性,管理者就必需花額外的時間和資源來備份SQL Server中的資料庫。SQL Server本身當然也提供了不少備份的功能:

資料庫備份
也就是備份整個資料庫內容。如果要將SQL Server中所有資料庫都備份下來,可能需要相當龐大的儲存空間來存放備份資料。但其好處是在還原資料庫時,也只需將整個資料庫從一份資料庫備份還原到SQL Server就可以了。另外,就算要是使用下述的差異式備份或交易紀錄備份,也必須是在做過完整的資料庫備份後才能進行。

差異式(Differential)備份
只備份從上一次執行完整資料庫備份後有更動過的資料,因此所需的備份時間和儲存空間,通常會比資料庫備份少很多,所以適合還原,然後再用最近一次所做的差異式備份還原到SQL Server,就可讀資料庫的內容回復到最近一次差異式備份時的同樣內容。

交易記錄(Transaction Log)備份
只備份交易記錄檔的內容,由於交易記錄檔只會紀錄我們在前一次資料庫備份或交易記錄備份之後,對資料庫所做的異動過程,也就是只記錄某一段時間的資料庫異動情形,因此在做交易記錄備份之前,一定需做過一次完整的資料庫備份才行。交易記錄備份所需的時間和儲存空間應該不多,不過在做還原時,除了要先將資料庫備份還原外,還需再依序還原各個交易記錄備份中的內容。

檔案及檔案群組備份
如果資料庫的內容分散存於多個檔案或檔案群組,而且資料庫已非常龐大,大到進行一次完整的資料庫備份會有時間和儲存空間上的問題,就可使用這種方式來備份資料庫中部分檔案或檔案群組。由於每次只備份部分的檔案或檔案群組,因此需做數次不同的備份才能完成整個資料庫的備份,但資料庫大到不方便做完整備份時也只好如此。而且檔案及檔案群組備份也也另一個好處,就是當損毀的資料只是資料庫中的某個檔案或檔案群組時,也只要還原毀損的檔案或檔案群組備份就可以了,比起只有整個資料庫的備份時,要還原整個資料庫方便許多。

由於資料庫的備份有多種不同的方法,很自然地,還原資料庫時也需依照當初備份資料庫的方式,及還原作業的時間點,以對應的步驟將備份下來的資料還原到伺服器中,以使資料庫的內容能回復到您所希望的時間點(通常是越接近資料庫出問題的時間越好)。以下介紹各種備份的還原方式:

資料庫備份的還原
不管之前只進行完整的資料庫備份,或是資料庫備份、差異式、和交易記錄備份交錯使用,遇到需要還原資料庫時,都需先還原完整的資料庫備份。

若是只做完整的資料庫備份,只需還原最新的備份資料,就算是完成還原的工作了。但若是搭配差異式或交易記錄備份的話,則此處的還原完整的資料庫備份,應該就只是整個還原作業中的第一個動作而已,在將最近一次的資料庫備份還原到伺服器後,可能還得繼續還原後續的差異式或交易記錄備份資料。

差異式備份的還原
還原差異式備份,其步驟並不複雜,只需先還原最近一次的完整資料庫備份,然後再還原最近一次差異式備份即可。例如採取每週六做一次資料庫備份,每天清晨做一次差異式備份者,在星期三遇到要做還原的情況時,需先還原上週六的資料庫備份,然後再還原當天清晨所做的差異式備份,即可完成整個還原的工作。

如果在做完這兩個還原動作後,您還有後續的交易記錄備份,則可再取出這些備份資料,依序以稍後介紹的方法將它們還原。

交易記錄備份的還原
還原交易記錄備份會比較麻煩,但由於通常我們都會以較頻繁的頻率進行交易記錄備份,所以使用交易記錄備份時,也意味著我們能將資料庫的內容回復到較接近目前的狀態。

閱讀全文...
就是愛分享
在探討資料庫安全之前,必須嘹解「資訊安全」(Information Security)所包括的範圍,或許在一般對安全的認知為資料的保密,但這僅僅是資訊安全的其中一項,以下列出資訊安全的六項基本認識。

保密性或私密性(Confidentiality):保密性或稱之為私密性,主要目的在確保資料不外洩,也就是不讓未被授權之使用者獲得該資料。

完整性或真確性(Integrity):完整性或稱為真確性,主要的目的在確保資料的完整性和原始性,也就是保證資料在傳送的過程中不被竄改。所謂的「原始性」是指資料保有資料來源的最原始狀態,不會因為傳遞過程而被他人竄改資料。

鑑別性或認證性(Authenticity):鑑別性是指鑑別使用者的真正身份,避免被他人冒用或偽裝身份而進行交易。

不可否認性(Non-repudiation):所謂的不可否認性,主要是針對使用者所進行過的任何操作(operation)和行為(action),在事後不可否認自己未曾做過這些操作和行為。

可用性(Availability):所謂的可用性是讓合法使用者,得以正常使用。

存取控制(Access Control):用以管理與控制使用者對資源的存取範圍,避免未被授權的使用者濫用資源。

對於一般的資料庫系統的使用,必須先經過身份的「鑑別性」(Authenticity)驗證,當驗證通過之後,會依據不同的存取規則訂定該使用者可存取得範圍和權限(讀取、寫入),並且必須紀錄使用者登入後的所有交易行為,可以確保該使用者在交易後不可否認自己的所有操作,也就是不可否認性(Non-repudiation),而所有進行的操作必須建構在一個安全通道(Secure Tunnel)中,也就是經過加密處理,不被竊取的通道,不被竊取的通道,以達到保密性(Confidentiality)。

閱讀全文...
就是愛分享
資料庫管理系統必須能保證和保障使用者進行的每一筆交易都能達到完整性,尤其是要能符合前述的單元性(Atomicity)、一致性的保留(Consistency Preservation)、獨立性(Isolation)以及永久性(Durability or Permanency)等ACID四個交易特性,若要達成此四個交易特性所需要的技術各不相同。

單元性(Atomicity):所講究的是一筆交易在開始進行之後,倘若發生任何不可預期的意外而未能完成,便要能恢復到最原始狀況,也就是「完全做完或是完全不做」(All-or-Nothing Change),要能達成這個特性就必須具備「可回復性」(Recoverability),也就是當此交易在進行之中,發生任何情形之下,此交易都必須能依據「系統日誌」(System Log)內的完整操作資訊,將所有的異動取消。

一致性的保留(Consistency Preservation):資料庫在一開始由系統分析師與客戶之間的需求分析,再藉由塑模(Modeling)的過程,產生出概念式實體關聯圖(Conceptual Entity Relationship Diagram),以及轉換成程式設計人員所看的實際實體關聯圖(Physical Entity Relationship Diagram),在此時就必須要注意到資料庫內的一致性限制(Consistency Constraint)的設計,使得使用者在異動資料時能受到完整性的限制(Integrity Constraint),讓資料庫內的資料彼此之間都能保持一致性,但因為某種情形下,可能無法藉由資料庫管理系統來限制使用者異動資料的一致性,而需藉由應用程式來檢查交易的一致性,此時必須藉由「單元性」(Atomicity)來達到多資料表更新時的一致性,或是藉由回復技術將所有異動回復到原始狀態。

獨立性(Isolation):此項特性來自於資料庫管理系統對於多個並行交易的排程,雖然多個交易並行處理,但每一個交易的執行應該不能互相影響彼此執行的結果,也就是要具備可序列化的特性,方能保證交易的執行結果是正確的,在前面已探討過數種技術來保證交易之間達到獨立性的技術,諸如「衝突可序列化性的排程技術」(Scheduling)、「兩階段鎖定協定」(Two-Phase Lock Protocol,2PL)、「時戳」(Timestamp)以及「多版本技術」(Multiversion)來保證交易的可序列化性,亦就是保證了交易之間的獨立性(Isolation),讓並行的交易在交錯執行的情形下所得的結果,彷彿序列性(Serial)的依序一一執行交易。

永久性(Durability or Permanency):一個交易成功完成之後,該筆所異動的資料應該是永久有效,不可因為任何因素導致該交易的資料所有改變,除非下一個交易硬體設備並不能永久地儲存於資料庫內。但是,資料庫管理系統所在的硬體設備並不能永久保證不損壞,而可能發生硬體損壞、停電或其他外力導致資料庫系統無法正確運作,所以要如何達到資料「永久性」(Durability or Permanency),就必須透過不同的回復技術。

由此可見,資料庫管理系統要能保持交易的ACID四個特性,回復技術是一種相當重要的議題。

閱讀全文...
就是愛分享
交易在進行中,同一時間會有很多交易並行處理(Concurrency),也由於並行且交錯處理結果,有可能導致交易之間彼此影響的執行結果,所以採用交錯式排程的方式,並透過測試該排程是否符合可序列化的排程原則,讓該排程可以合理且具有等價序列排程的結果。在並行控制的技術,除了可以利用控制排程的「序列性」(Serializzbility)之外,還有另一種普遍被使用的鎖定協定(Lock Protocol)來達到排程的序列性,也就是達到並行控制的一種技術,其他還包括時戳(Timestamp)、多版本(Multiversion)和樂觀/悲觀(Optimistic/Pessimistic)之技術來達成並行控制之相關技術之探討。

首先要介紹何謂「鎖定協定」(Lock Protocol),一個基本鎖定協定(Lock Protocol)的操作至少有兩個,一個為「鎖定」(Lock),一個為「解除鎖定」(Unlock);例如,當一個交易要對資料項目X進行讀取或寫入操作之前,必須要使用「鎖定」操作(Lock Operation),如同將該資源鎖住後,此資源就僅會提供給這一個交易使用,其他交易的操作就不可以再同時使用該資料項目X,換言之,其他未取得此資源使用權的交易必須要「等待」,直到該資源被釋放;反之,在進行操作之後,可以將該資料項目X立即或延遲釋放讓其他交易可以順利取得該資源進行操作,此釋放動作即稱之為「解除鎖定」(Unlock),得以讓其他交易的操作能順利往下執行交易。

以類別而言,鎖定可以區分為「獨佔模式」和「分享模式」兩種類型,獨佔模式的鎖定有如「二元鎖定」(Binary Locks),分享模式則為「共享/互斥鎖定」(Shared/Exclusive Locks)或稱為「獨/寫鎖定」(Read/Write Locks)。鎖定與解除鎖定的時機,例如兩階段鎖定協定(Two-Phase Locking Protocol,2PL)。

所謂的「兩階段鎖定協定」,也就是在一個交易的進行中,不論任何的鎖定,包括讀取鎖定或寫入鎖定,都必須在第一個解除鎖定之前執行,即稱為遵循「兩階段鎖定協定」。也就是將所有的鎖定(Locks)和所有的解除鎖定(unlocks)完全分為兩階段,第一階段為鎖定階段,稱為「擴增階段」(Expanding Phase)或「成長階段」(Growing Phase),在此階段只能執行鎖定指令,不可有任何解除鎖定穿插其中;第二階段為解除鎖定階段,稱為「削滅階段」(Shrinking Phase),在此階段只能有解除鎖定指令,不可有任何的鎖定指令穿插其中。

閱讀全文...
就是愛分享
今天"資料庫系統管理與設計"沒上啥內容
主要是在討論專題製作的事情
大致上各組的專題製作題目如下:

第1組:[里長]
1.內部組織圖細項-先討論-定義作多大
定義好要做多少東西.
現在需求是自己提的.這樣的開發方式.你是可以天馬行空的思考你有哪些功能做.
再做出一個基礎架構圖出來.
------------------------------------------
第2組:[寵物交友][泛舟]兩個方向
◎泛舟-偏向靜態網站.介紹.教學.注意事項.影片.照片.網路購物.偏向內容管理
缺點:現有的免費網站軟體.套一套出來.

◎寵物交友-日記功能.微網誌140個字.結合地圖功能.揪團功能.強的點是原創性夠.
------------------------------------------
第3組:媒合[洗衣店]
收送服務-線上預約-簡訊服務-呈現出地圖樣子-
------------------------------------------
第4組:媒合[裝潢] 在上面找客戶.設計師.分享與討論.
→ 統一送貨.統一收穫.
→ 負責他一切電子物流機制.電子市集.(真正運作)物流費用太高
------------------------------------------
第5組:[藥局藥裝]
線上購物-藥品-藥品的資料庫.網路藥點.
缺點跟第2組一樣沒有原創性:現有的免費網站軟體.套一套出來.
------------------------------------------
第6組:[立體紙雕]-下載賀年卡-可以上網下載紙板-

希望今年一樣有很不錯的成績表現!!

閱讀全文...
就是愛分享
一個交易的基本定義,必須是將交易內的所有操作一次全部執行完畢,或是全部都不執行;而且在電腦系統中,所有的交易又都是交錯地執行,在執行中總會有互相影響的問題,並藉由「遺失更新問題」(Lost Update Problem),「不正確讀取」(Dirty Read Problem)或稱為「暫時更新問題」(The Temporary Update Problem)以及「不正確的總和問題」(The Incorrect Summary Problem)三個問題點出了交錯執行上必須注意的並行控制問題,所以對一個交易很明顯的定義出,必須具備四個基本特性 ACID,也就是單元性(Atomicity)、一致性的保留(Consistency Preservation)、獨立性(Isolation)以及永久性(Durability or Permanency)四個特性。

當交易正在進行期間,電腦系統有可能遇到非預期的各種類型失敗,所以交易必須具備有回復(Recovery)的功能,此功能可透過系統日誌(System Log)的全程記錄方式來追蹤所有交易進行的情形,並且在適當時機可將失敗且未完成的交易恢復到最原始的情形。

另外電腦排程可分為「序列的」(Serial)和「非序列的」(Non-Serial)排程,以序列的排程執行結果是最理想和最正確的排程,但在實際的電腦系統下是不太可能存在的,但是對於「非序列的」排程卻有可能會出現正常和不正常的執行結果,必須透過衝突且可序列化的測試演算法來判斷出該排程是否能正確執行出結果。

閱讀全文...
就是愛分享
「關聯式代數」與「關聯式計算」為關聯式資料庫系統操作的基礎概念;兩者之間的最大差異在於一個著重於如何取得,一個著重於取得什麼。關聯式代數就是著重於如何取得資料的過程,也就是重視「How」;而關聯式計算則著重於要取得什麼資料,也就是重視「What」,而不是在於過程要如何取得。

關聯式代數可依性質分類為四種:

1.一元關聯操作- 針對一個關聯的操作,主要都是針對關聯的屬性與職組的篩選動作,例如「選取操作」、「投影操作」、「更名操作」。

2.二元關聯操作- 針對兩個關聯進行的操作,主要重點則是在於關聯與關聯之間的合併(Join)動作。

3.集合論操作- 利用集合理論來對關聯進行不同的操作,這些操作包括交集操作、聯集操作以及差集操作等三種基本操作。

4.聚合函數計算- 針對關聯中某些屬性進行群組之後的計算,包括計算加總的Sum()函數'計算平均的Average()函數、計算筆數之Count()函數。選擇最大值的Max()函數和最小值的Min()函數...等等皆為聚合函數。

閱讀全文...
就是愛分享
安裝MS SQL Server 2005時,如果選擇安裝全部的「服務」時,在成功安裝之後,以Windows Server 2003為例,選取「開始」功能表的 系統管理工具\服務\SQL Server(MSSQLSERVER),將此服務啟動。

接着,選取 程式集\Microsoft SQL Server 2005\SQL Server Management Studio 啟動MS SQL Server 2005的管理程式(SQL Server Management Studio)。然後選取要連接的伺服器,伺服器類型(T)可分為以下幾種

Database Engine:此一伺服器是MS SQL Server 2005的主要服務,也就是主要的伺服器引擎,要登入此引擎必須先啟動「SQL Server」服務。

Analysis Services:此一伺服主要是負責「線上分析服務」服務(Online Analytical Processing,OLAP),要登入此服務前必須要先啟動「SQL Server Analysis Services」服務。

Reporting Services:此一伺服主要是負責「報表」服務(Reporting Services),要登入此服務前必須要先啟動「SQL Server Reporting Services」服務。

SQL Server Mobile:此一伺服主要是負責「SQL Server行動資料庫」服務(SQL Server Mobile),要登入此服務前必須要先啟動「SQL Server Mobile版本」的服務。

Integration Services:此一伺服主要是負責「整合」服務(Integration Services),要登入此服務前必須要先啟動「SQL Server Integration Services」服務。

在伺服器的對話中,只要填入所要連線遠端伺服器的FQDN(Full Quality Doman Name)、IP Address或是填入localhost連至本機服務。

在驗證(A)的部份可分為兩種,其一為「Windows驗證」,也就是由Windows作業系統來負責帳號的管理和驗證,亦可整合Windows的Active Directory Service,也就是帳號的單一簽入(Single Sign On,SSO)。另一由SQL Server本身所管理的「SQL Server驗證」,此一帳號資料庫與Windows不同,是由SQL Server本身建立與管理。

當連線成功之後會出現Microsoft SQL Seerver Management Studio的管理畫面。在畫面中可以看到已經存在有多個資料庫,我們區分為系統資料庫與其他資料庫。

系統資料庫

master:這個master資料庫是屬於系統層級的資料庫,也就是一個核心資料庫。其中所記錄的包括登入帳號、被管理的端點伺服器(endpoints)、分散式處理中被鏈結的伺服器(linked server)以及SQL Server系統的所有設定項目。除此之外,master資料庫中也記錄了在SQL Server中的所有資料庫資訊,包括這些資料庫的實體檔案位置和SQL Server的初始資訊。

model:這個model資料庫的目的是當成所有新建資料庫所參考的一個樣版資料庫,也就是在新增一個資料庫時,系統會參考此model資料庫來新增出新的資料庫。

msdb:這個msdb資料庫是讓「SQL Server Agent」服務所使用的,讓此代理程式(Agent)紀錄排程警告、排程作業和其他相關作業之用。

rempdb:tempdb是一個全域性的資料庫,可以提供給使用者暫時儲存資料的一個資料庫,或是使用者在經過龐大資料計算時暫存的一個資源,不過要注意的,存於此資料庫內的資料都是短暫的,如果系統重新啟動之後,將會全部被清除掉。

其他資料庫

AdventureWorks:此資料庫是MS SQL Server 2005所提供的一個範例資料庫,提供使用者方便練習使用。

AdventureWorksDW:此資料庫是MS SQL Server 2005所提供的一個倉儲(Sata Warehouse)範例資料庫,提供使用者方便練習使用。

閱讀全文...
就是愛分享
MS SQL Server 2005是由微軟公司所開發的資料庫管理系統,此套資料庫管理系統主要是基於網路協定之上的資料庫管理系統,所以使用者或是管理者可以透過不同的網路協定,例如網際網路的TCP/IP之通訊協定與MS SQL Server 2005進行連線使用或管理。

由微軟公司所開發的MS SQL Server 2005資料平台,其中所包括的基本元件如下:



Relational Database(關聯式資料庫)-是儲存基本資料的所在,也就是未經計算或處理過的原始資料(raw data)。

Replication Services(複寫服務)-使用在分散式系統或是行動資料處理,可將企業內資料庫進行同步或非同步複寫至其他資料庫,而被複寫的資料庫稱之為複製品(Replica),亦可支援異質資料庫系統,例如甲骨文之資料庫管理系統(Oracle Databases)。

Notification Services(通知服務)-可經過個人化及定時地對不同連線中或行動裝置進行資料更新通知。

Integration Services(整合服務)-提供對資料倉儲(data warehousing)和企業資料整合(data integration)之資料萃取(Extraction)、轉換(Transformation)以及載入(Loading)能力,合稱為ETL。

Analysis Services(分析服務)-使用多維度資料庫,對大型且複雜的資料集進行「線上分析處理」(Online Analytical Processing,OLAP)功能之服務。

Reporting Services(報表服務)-提出使用者建立、管理和遞交傳統的紙本導向之報表或以網頁為基礎的報表功能。

Management Tools(管理工具)-一個整合型的管理工具,可進行資料庫的基本和進階管理與效能的調校等等,也就是指「Microsoft SQL Server Management Studio」。

閱讀全文...
就是愛分享
SQL合併查詢(Join)是使用在多個資料表的查詢,其主要的目的是將關聯式資料庫正規化分析分割的資料表,還原成使用者所需的資訊。因為正規化的目的是避免異動(新增、刪除及修改)操作中易發生異常現象,也可以避免不必要的人工資料操作和不小心將重要資料刪除,但關聯被分割之後所產生的問題在於查詢上的不便性會發生,所以才會有合併理論。

在合併理論中,首先介紹「卡氏積」(Cartesian Product),也稱之為「交叉乘積」(Cross Product)或稱為「交叉合併」(Cross Join),卡氏積是將兩個關聯做相乘,所得結果是來自所有可能性的對應(Mapping)關係所呈現出來,再將各自的屬性全部列出。

但產生如此的卡氏積之後,或許會發現此新的關聯中的資料,甚多不合情理的值組,所以再加上兩關聯之間的「條件限制」或稱為「對應」(Mapping)關係,稱為內部合併(Inner Join)又稱為條件式合併(Condition Join)。

不過在內部合併的過程中,有些值組會因為彼此無法互相對應而消失不見,如果使用者認為不合理,就可以利用外部合併(Outer Join),而合併之後對應不到的關聯值組,會在屬性填入空值(Null Value)。主要可分為三種:
左邊外部合併(Left Outer Join)-左邊的資料表擁有優先權,左邊所有的資料都會被包含,而右邊只有符合的資料才會被包含。
右邊外部合併(Right Outer Join)-右邊的資料表擁有優先權,右邊所有的資料都會被包含,而左邊只有符合的資料才會被包含。
完全外部合併(Full Outer Join)-左邊外部合併與右邊外部合併的聯集。



(a)所表示的是「內部合併」,兩個關聯之間,具有某些(一個或多個)屬性值彼此「對應」所合併出來的結果。
(b)所表示的是在左邊關聯中的某些(一個或多個)屬性值,無法對應到右邊相對應的屬性值的值組,所合併出的結果在右邊的屬性值將會是空值(Null Value)。
(c)所表示的是在右邊關聯中的某些(一個或多個)屬性值,無法對應到左邊相對應的屬性值的值組,所合併出的結果在左邊的屬性值將會是空值(Null Value)。
(d)所表示的是在左、右兩邊關聯的某些(一個或多個)相對應的屬性值彼此無法「對應」的部份,但是在合併後的左、右兩邊屬性皆會有值存在。
(a)+(b)所表示的即是「左邊外部合併」。
(a)+(c)所表示的即是「右邊外部合併」。
(a)+(b)+(c)所表示的即是「完全外部合併」。
(a)+(d)所表示的是「卡氏積」或稱「交叉乘積」或「交叉合併」。

閱讀全文...
就是愛分享


也就是說在檔案系統是以檔案(File)為最基本的邏輯單位,相關的資料將被彙集在一個檔案中,以關聯式資料模型則稱之為關聯(Relation),關聯式資料庫管理系統(RDMS)則是以資料表(Table)稱之,物件導向則以類別(Class)來當成基本邏輯單位。

以關聯式資料庫管理系統(Relational Database Managements System,RDBMS)進行探討和說明。在每一個資料庫內,會因為所包含的物件類型或物件數量過多,所以會以不同的「綱要」(Schema)來做為分隔,不同的綱要會有不同的綱要名稱,方便不同系統或不同用途所使用,其中包括資料表(Tables)、檢視表(Views)、預存程序(Stored Procedures)、函數(Functions)、觸發器(Triggers)、定義域(Domains)、限制(Constraints)...等等的不同物件類型。

結構化查詢語言是一種關聯查詢語言,一般在資料庫管理系統的實作上,可分為三種:
1.資料定義語言(DDL,Data Definition Language ) - 定義資料庫物件使用的語法
Create:建立資料庫的物件。
Alter:變更資料庫的物件。
Drop:刪除資料庫的物件。

2.資料操作語言(DCL,Data Control Language ) - 控制資料庫物件使用狀況的語法
Grant:賦予使用者使用物件的權限。
Revoke:取消使用者使用物件的權限。
Commit:Transaction 正常作業完成。
Rollback:Transaction 作業異常,異動的資料回復到 Transaction 開始的狀態。

3.資料控制語言(DML,Data Manipulation Language ) - 維護資料庫資料內容的語法
Insert:新增資料到 Table 中。
Update:更改 Table 中的資料。
Delete:刪除 Table 中的資料。
Select:選取資料庫中的資料。

閱讀全文...
就是愛分享
今天呂老師的資料庫設計課將Access作詳細的實務操作
所以來整理一下Access的重點

Access可說是第一個引進物件導向的資料庫軟體
「物件導向」只是設計時,Access提供的大原則
對開發人員的另一關鍵是「物件」之定義
可使用的物件都是系統所定義
例如在表單及報表設計視窗中,「可被選取者,皆是物件」
而物件就是編輯、程式處理的基本單位

Access由2000版起,可製作兩種資料庫
分別是一般(mdb)及專案資料庫(adp)
後者就是在主從架構中之前端應用程式
而可與Access密切整合的資料庫伺服器是SQL Server
同時Access亦內建與SQL Server有關的工具
可將一般資料庫的資料表上傳至SQL Server內

Access由2000版起,加入製作資料頁的功能
可快速製作與資料庫結合的網頁
原理是在網頁中加入XML標記結合至資料庫
開發人員也可使用VBScript語法,處理網頁取得的紀錄集

Access的缺點是無法編譯為可單獨執行的檔案(exe)
所以資料庫的保全及部署(使用MOD)較為麻煩
另外Access被微軟定位為桌上型的前端資料庫
如果在網路上同時多人(七、八人以上)使用資料庫的話
Access不如SQL Server來得穩定

閱讀全文...