2009年10月31日 星期六

SQL資料庫容量檢查(How to check Database reference size?)

這是一段常在開發專案的時候使用的TSQL,用來檢測目前資料庫的資料表中所佔據的容量大約多少,可以用來評估是否執行壓縮,這是亞當斯一位在南亞工務部的朋友所寫的,小弟覺得某些情境下非常實用,在此借花獻佛跟各位分享。

語法如下:

DECLARE @tblname varchar(50)            --資料表名稱(使用者資料表名稱變數)
if exists (select * from dbo.sysobjects
            where id = object_id(N'dbo.#tmpStatics')
              and OBJECTPROPERTY(id, N'IsUserTable') = 1)
DROP TABLE #tmpStatics   --暫存資料表

CREATE TABLE #tmpStatics (        --建立暫存資料表
  name       varchar(50)  NULL ,  --資料表名稱
  rows       varchar(50)  NULL ,  --資料表現有的資料列數
  reserved   varchar(50)  NULL ,  --資料庫中的物件所配置的空間大小
  data       varchar(50)  NULL ,  --資料所用的空間大小
  index_size varchar(50)  NULL ,  --索引所用的空間大小
  unused     varchar(50)  NULL )  --保留給資料庫中之物件但尚未使用的空間大小
DECLARE cur_TableStatics CURSOR FORWARD_ONLY FOR
    SELECT name FROM sysobjects
     WHERE xtype='U' ORDER BY name               --取得使用者資料表名稱
OPEN cur_TableStatics
FETCH NEXT FROM cur_TableStatics
INTO @tblname
  WHILE @@FETCH_STATUS = 0
  BEGIN 
    INSERT #tmpStatics
      EXEC sp_spaceused @tblname,@updateusage = N'TRUE'    --顯示資料表的相關磁碟空間資訊
    FETCH NEXT FROM cur_TableStatics
    INTO @tblname
  END
CLOSE cur_TableStatics
DEALLOCATE cur_TableStatics

SELECT name,rows,
       CONVERT(NUMERIC(18,2),SUBSTRING(reserved,1,LEN(reserved)-2))/1024 AS Reserved, -- MB
       CONVERT(NUMERIC(18,2),SUBSTRING(data,1,LEN(data)-2))/1024 AS Data,
       CONVERT(NUMERIC(18,2),SUBSTRING(index_size,1,LEN(index_size)-2))/1024 AS Index_Siz,
       CONVERT(NUMERIC(18,2),SUBSTRING(unused,1,LEN(unused)-2))/1024 AS Unused
  FROM #tmpStatics
WHERE rows <> '0'
ORDER BY Data
DROP TABLE #tmpStatics                              

以Pubs資料庫為例,執行完成的結果如下:

image

2009年10月24日 星期六

ASP.NET外部組態檔小密技

規劃開發網站時,通常會將共用的設定或是系統上線之後可以變更的共通值,置放在web.config組態檔中的設定,以方便將來網站系統真正上線之後,可以依照不同的需求來做設定。然而,當網站開發完成,實際上線之後會發現,在以下幾種情況之下都會重新啟動網站應用程式,進而造成使用者的狀態維護失效:

  • 改、新增、刪除Bin目錄下的組件。
  • 修改、新增、刪除App_GlobalResources或App_LocalResources目錄下的資源檔。
  • 修改、新增、刪除Global.asax。
  • 修改、新增、刪除App_Code目錄下的原始程式碼檔。
  • 修改、新增、刪除Profile設定。
  • 修改、新增、刪除App_WebReferences目錄下的Web參考。
  • 修改、新增、刪除web.config。

其中,在正式上線環境中,以修改Web.config算是最常見的需求,那麼該如何設計讓管理者修改web.config設定檔時,不會影響到網站應用程式的運作?

答案就是:使用外部組態檔。

首先,先建立一份組態檔,例如命名為:external.config,把將來可能會隨時異動的設定資料,寫在這個組態檔中,譬如將來會隨時異動的是log的監控層級,是設定在appSettings項目中:

<?xml version="1.0"?>

<appSettings>

<add key="LogLevel" value="information" />

</appSettings>

ASP.NET V2.0以後的版本有提供新的項目屬性configSource,外部組態檔的引用可以透過configSource屬性值定所要引用的組態檔是哪一個外部檔案。使用外部組態檔有以下幾個優點:

  1. 可針對不同的項目設定,來規劃模組化的結構
  2. 因為是使用另一個設定檔,所以可以加強安全性控管
  3. 隨時改變外部組態檔,並不會重新啟動應用程式

web.config中項目的設定,加上configSource範例如下:

<appSettings configSource="external.config" />

有了這樣的設定區段,隨時都能改變系統功能的設定,而不會造成目前網站上的使用者發生狀態遺失等問題,這算是相當不錯的項目屬性;當然ASP.NET V2.0以後版本才有支援這個設定。

2009年10月15日 星期四

從DB取出欄位屬性的TSQL語法 for SQL2005

這幾天整理NB準備備份一些資料,因此就在NB上把要備份的資料夾裡面的東西先慢慢Review一遍,發現以往在開發專案有用到一些很不錯的小技巧,為了被這些技巧被遺忘了,還是快點寄下來,以備不時之需的好!

以下這個語法是在SQL2005上將所有的欄位屬性資料列出的TSQL,基本上是一個非常好用的語法:

SELECT
表名       = CASE WHEN A.COLORDER=1 THEN D.NAME ELSE '' END,
表說明     = CASE WHEN A.COLORDER=1 THEN ISNULL(F.VALUE,'') ELSE '' END,
欄位序號   = A.COLORDER,
欄位名     = A.NAME,
標識       = CASE WHEN COLUMNPROPERTY( A.ID,A.NAME,'ISIDENTITY')=1 THEN '√'ELSE '' END,
主鍵       = CASE WHEN EXISTS(SELECT 1 FROM SYSOBJECTS WHERE XTYPE='PK' AND PARENT_OBJ=A.ID AND NAME IN (
SELECT NAME FROM SYSINDEXES WHERE INDID IN(
SELECT INDID FROM SYSINDEXKEYS WHERE ID = A.ID AND COLID=A.COLID))) THEN '√' ELSE '' END,
類型       = B.NAME,
佔用位元組數 = A.LENGTH,
長度       = COLUMNPROPERTY(A.ID,A.NAME,'PRECISION'),
小數位數   = ISNULL(COLUMNPROPERTY(A.ID,A.NAME,'SCALE'),0),
允許空     = CASE WHEN A.ISNULLABLE=1 THEN '√'ELSE '' END,
預設值     = ISNULL(E.TEXT,''),
欄位說明   = ISNULL(G.[VALUE],'')
FROM
SYSCOLUMNS A
LEFT JOIN
SYSTYPES B
ON
A.XUSERTYPE=B.XUSERTYPE
INNER JOIN
SYSOBJECTS D
ON
A.ID=D.ID  AND D.XTYPE='U' AND  D.NAME<>'DTPROPERTIES'
LEFT JOIN
SYSCOMMENTS E
ON
A.CDEFAULT=E.ID
LEFT JOIN
sys.extended_properties G
ON
A.ID=G.major_id AND A.COLID=G.minor_id 
LEFT JOIN
sys.extended_properties F
ON
D.ID=F.major_id AND F.minor_id=0
ORDER BY
A.ID,A.COLORDER

2009年10月13日 星期二

Synchronization Services 與其他技術比較表

Synchronization Services有兩大最主要的功能,分別為:

  • 遠端資料存取 (Remote Data Access,RDA)。它通常是用來同步 SQL Server Compact 3.5 資料與另一個版本的 SQL Server 上的資料庫。
  • 合併式複寫。它是用來同步不同版本的 SQL Server,其中包括 SQL Server Compact 3.5。

因此在作一些同步資料或是合併資料時,還得按照不同的情境下來考量,才能得到最大的效用。亞當斯從MSDN上找到Synchronization Services 與其他技術比較列表,如下:

主要功能

RDA

合併式複寫

Synchronization Services

使用服務進行同步

支援異質性資料庫

累加變更追蹤

1

衝突偵測與解析

輕鬆地在用戶端上建立資料檢視

自動初始化結構描述與資料

支援大型資料集

在本機上可使用查詢處理器

自動傳播結構描述變更

自動重新分割資料

可在裝置上使用

此版本不支援