2012年11月29日 星期四

[SQL2008R2]非sysadmin如何以最小權限執行舊版DTS?

        在SQL 2008之前的版本,像是SQL 2000,由於系統預設就把DTS 系統預存程序的「執行」權限授與 PUBLIC,所以只要有SQL登入帳號,就可以取得DTS封裝的清單;到了SQL 2005,用SSMS至管理/舊版/展開Data Transformation Services,會檢查是否有sysdtspackages的查詢權限,預設是沒有所以就看不到;SQL 2008更為了增加DTS封裝的安全性,已經撤銷 PUBLIC 對於 DTS 系統預存程序的「執行」權限呢!可參考保護儲存在 SQL Server 中的 DTS 封裝安全此篇的說明

2012年10月14日 星期日

連結伺服器 "linked_server_name" 的 OLE DB 提供者 "IBMDADB2.DB2COPY2" 提供了不一致的資料行中繼資料。

        最近透過Linked Server以SELECT 使用 4 部分名稱去查詢DB2的資料,如下範例

SELECT * FROM DB2.TEST.SCHEMA1.TABLE1

        結果出現下列錯誤:

連結伺服器 "DB2" 的 OLE DB 提供者 "IBMDADB2.DB2COPY2" 提供了不一致的資料行中繼資料。回報物件""TEST"."SCHEMA1"."TABLE1"" 的資料行 "Column1" (編譯時間序數 7) 在編譯時間有 14 的 "DBTYPE",而在執行時間有 131。

2012年10月7日 星期日

Database Mail的錯誤:5.5.1 SMTP AUTH is required.

        有天一早到公司竟發現我所有SQL Server上的作業幾乎都失敗了,真是嚇到我了,查看作業的歷程紀錄,發現都是失敗在發送信件的元件那裏,印象中公司用的Exchange前一陣子有升級,但怎麼會突然無法發送郵件呢?

        一開始我先用簡單的VBS在Server上發測試信看看,結果可以成功寄信!接著我測試SSIS封裝裡用VB.NET寫的發信程式,結果會拋錯,再接著我用Database Mail試試,結果收不到信,Database Mail紀錄有出現錯誤訊息,如下圖


2012年9月1日 星期六

面對SQL Injection,DBA可以做甚麼呢!

        難得公司請廠商做滲透測試,模擬駭客攻擊,我很好奇廠商會怎麼測試,所以同時間我也監控網站與資料庫的LOG,看看能從LOG裡讓我學到甚麼,當然最基本的SQL Injection與XSS一定會測試,身為DBA我當然最在意SQL Injection囉,而針對SQL Injection,我原本就做了以下前三項的設定
  1. 應用程式帳號權限最小化
  2. 限制中繼資料的可見性
  3. 稽核軌跡 
  4. 資料表(行)命名的考量

2012年7月24日 星期二

FN_TRACE_GETTABLE函數配上WHERE發生的怪事


        最近在某台SQL 2005的機器上啟用Server Side Trace,打算自動分析Trace檔來稽核軌跡紀錄,因為FN_TRACE_GETTABLE函數本身可以以表格式格式傳回Trace檔的內容,我就偷懶直接拿來過濾欄位使用,沒有先匯入資料表後再過濾,結果發生同樣的指令有時候有回傳資料,有時候又沒有資料的情況

        同樣讀取4Trace檔案,假設20萬筆紀錄,同樣的過濾條件,第一次得花2秒執行完,第二次以後只要花0.5秒就執行完了,第二次比第一次快是因為資料都載入記憶體,可以理解會加快速度,問題是第一次執行回傳16筆資料,第二次之後竟回傳0筆資料,我是見鬼了嗎?如下圖,我用Profiler錄製的內容,總共執行6次


2012年7月17日 星期二

無法使用指定的憑證進行解密或加密,可能是因為其中沒有私密金鑰,或是所提供的私密金鑰密碼不正確。


原本我有個預存程序使用憑證簽署過,後來為了加註說明文字得修改預存程序的內容,可是我僅僅只是加上備註而已,預存程序卻不能執行了,好像簽章失效了一般,後來我嘗試再簽署一次卻出現如標題之錯誤,經研究終於找到較佳的解決辦法,說明如下供各位參考,至於我為何會使用憑證簽署可參考如何用預存程序以最小權限原則呼叫遠端SSIS這篇

當你使用簽章簽署預存程序後,使用以下指令,可確認到所有已簽署簽章的模組資訊,此例預存程序為usp_Exectest1,憑證名稱為certTest

SELECT object_name(cp.major_id) '已簽署簽章的模組' ,
   cp.crypt_property ,
   cp.crypt_type ,
   cp.crypt_type_desc ,
   cer.name ,
   cer.pvt_key_encryption_type ,
   cer.pvt_key_encryption_type_desc ,
   cer.subject ,
   cer.expiry_date
    FROM sys.crypt_properties AS cp
    right outer JOIN sys.certificates AS cer
        ON cp.thumbprint = cer.thumbprint

2012年7月12日 星期四

原來定序也會影響轉換函數啊!

        CAST 和 CONVERT (Transact-SQL)裡面明明提到nvarchar可以轉varchar,但我不知為什中文字卻全轉成問號,後來再另外一台SQL Server上試,結果卻正常!

        後來比較了兩邊差異,原來是定序不同造成的,以下寫了個簡單例子供各位參考(用Cast也可)

declare @var nvarchar(32)
set @var = N'傳說中的6頭牛-牛牪犇'
select @var 'nvarchar',
   convert(varchar(32),@var) COLLATE SQL_Latin1_General_CP1_CI_AS '轉成varchar(Latin定序)',
   convert(varchar(32),@var) COLLATE Chinese_Taiwan_Stroke_CI_AS '轉成varchar(Chinese定序)'



        基本上,nvarchar轉varchar,英數字不會有問題,但中文裡若是有Unicode字元的會轉成?喔


        至於我為什會需要將nvarchar轉varchar呢!因為在作SQL與DB2的轉換,DB2那邊都是varchar的囉!

2012年7月7日 星期六

[SSIS]跳出SQLDUMPER.EXE視窗,然後封裝就停止了


        最近在設計SSIS 2005封裝的時候,原本執行都還正常的,突然間不知為什流程就卡在[資料流程工作],一直呈現黃色狀態,不會結束,如下圖那樣


2012年7月5日 星期四

[SSIS]使用者'User_Name' 的登入失敗


        原本設計的SSIS封裝可手動執行無誤,但是為了讓前端應用程式可呼叫該封裝,我用如何用預存程序以最小權限原則呼叫遠端SSIS的方式來做,結果我手動執行該作業卻出現如下錯誤:

以下列使用者的身分執行: srv001t\test。...32 位元版本 9.00.4035.00  Copyright (C) Microsoft Corp 1984-2005. All rights reserved.    
已啟動:  上午 10:46:26  
錯誤: 2012-07-05 10:46:30.89     
代碼: 0xC0202009     
來源: IS封裝測試 連接管理員 "SRV001_cm"     
描述: SSIS 錯誤碼 DTS_E_OLEDBERROR。發生 OLE DB 錯誤。
錯誤碼: 0x80040E4D。  有 OLE DB 記錄可用。
來源: "Microsoft SQL Native Client"  
Hresult: 0x80040E4D  
描述: "使用者'SRV001T\test' 的登入失敗。"。  錯誤結束  
錯誤: 2012-07-05 10:46:30.91     
代碼: 0xC020801C     
來源: 資料流程工作 OLE DB來源 [8263]     
描述: SSIS 錯誤碼 DTS_E_CANNOTACQUIRECONNECTIONFROMCONNECTIONMANAGER。對 "SRV001_cm" 連接管理員呼叫 AcquireConnection 方法失敗,錯誤碼為 0xC0202009。在此之前可能已公佈過錯誤訊息,說明 AcquireConnection 方法呼叫為何失敗的詳細資訊。  錯誤結束 ...

2012年7月2日 星期一

[SSIS]文字檔裡因換行字元不同所造成的錯誤



        上圖左右各是兩個文字檔,都只有一個長度為10的欄位,左右皆用雙引號包夾,乍看之下真的看不出什分別,但是用同樣的SSIS封裝將文字檔載入資料表,右邊的成功載入,但左邊的卻載入失敗,出現如下錯誤訊息

        [一般檔案來源[253]] 錯誤資料轉換失敗。資料行"資料行0" 的資料轉換傳回狀態值和狀態文字"文字已截斷,或者一個或多個字元在目標字碼頁裡沒有相符者。"

2012年6月20日 星期三

利用IPSec建立內部防火牆以提升資料庫安全3

        原本管的DB與AP Server都是Windows作業系統,要啟用IPSec還算容易,但是因為某個需求,得讓核心系統的AIX也能連SQL Server,問題是我要啟用IPSec啊!我原是使用交涉的方式,需要在Server端與Client端皆設定對應的IPSec才行,可是AIX上怎麼設!短時間要我們管AIX的同仁測試IPSec有點困難,只好想想有沒有只要在Server端設定IPSec的方法?後來發現除了用交涉外,還可以用允許,用允許就可以解決我的問題啦,允許只要在Server端設定即可,超方便

2012年4月25日 星期三

如何刪除IBM DB2 ODBC DRIVER裡設定的別名?

        滿奇怪的設計,竟然不能直接刪,得下指令呢!

1.開啟DB2的指令視窗

2.輸入 db2

3.再輸入 UNCATALOG DATABASE TESTDB


連結伺服器"linked server"的OLE DB 提供者"IBMDADB2.DB2COPY1" 報告了錯誤。拒絕存取。

        當我建立好DB2的連結伺服器後,我試著使用SELECT語法去查詢連結伺服器的資料,結果出現如下錯誤

        訊息7399,層級16,狀態1,行1
        連結伺服器"linked server"的OLE DB 提供者"IBMDADB2.DB2COPY1" 報告了錯誤。拒絕存取。
        訊息7350,層級16,狀態2,行1
        無法從連結伺服器"DB2TEST" 的OLE DB 提供者"IBMDADB2.DB2COPY1" 取得資料行資訊。

2012年4月23日 星期一

使用IBM DB2 ODBC DRIVER,來建立DB2的連結伺服器

        如果想利用SQL Server來連結DB2,強烈不建議使用Microsoft OLE DB Provider for DB2喔!

        因為光是搞HostCCSID與PC code page這兩個編碼屬性我就快瘋了,弄了兩天我還是搞不定,不是中文顯示問號,就是變亂碼,再不然就是出錯,從1.0試到3.0,中英文版都試了也一樣

         後來使用Microsoft OLE DB Provider for DB2的資料存取工具去試試看到底支援哪些編碼,明明有950的啊,但偏偏設了就會出錯

錯誤一
         無法連接至資料來源 'DB2TEST':
        發生內部網路程式庫錯誤。要求命令包含了目標系統無法辨識,或不支援的參數值。         SQLSTATE: HY000, SQLCODE: -385
錯誤二
        無法連接至資料來源 'DB2TEST':
        處理命令時,發生一或多個錯誤。

        就在我要放棄的時候,我改用IBM DB2 ODBC DRIVER看看,結果上面那兩個屬性我根本不用設就OK了,中文顯示都很正常喔,真是白白浪費我兩天時間啊

2012年4月19日 星期四

[T-SQL]分組排名(SUBSQERY、CTE及用TOP))


        如何從銷售訂單資訊[SalesOrderHeader]資料表中,找出每個顧客[CustomerID]其應付總額[TotalDue]前三高的訂單[SalesOrderID],並顯示名次?呈現結果如下

        注意應付總額一樣的也要列喔

2012年4月14日 星期六

[DIY]RJ45轉RJ11

        最近很忙,都在維護公司客服的系統,連類比電話線都要自己DIY,我不是DBA嗎!怎麼愈來愈不像啦

        兩端都是RJ45網路線頭的,怎麼弄成一端是RJ45,另一端卻轉成四線的RJ11電話線頭呢?這用到的機會很少,現在交換機到IVR還在用類比內線的情況應該不多吧

 

2012年3月10日 星期六

利用IPSec建立內部防火牆以提升資料庫安全2

        上一篇介紹IPSECCMD的使用範例,本篇介紹可以用在Windows Server 2008上的Netsh IPsec命令吧,詳細使用方法請參見Netsh Commands for Internet Protocol Security (IPsec)
 
        Netsh IPsec比起IPSECCMD更好的優點有以下兩點(缺點是指令比較多行):
  1. IPSECCMD對篩選器清單的篩選器只會整個取代,而Netsh IPsec對篩選器清單的篩選器是可以一筆一筆附加的
  2. IPSECCMD對原則的每次變更都要先停用再啟用,變更的部分才會生效,而Netsh IPsec只要是對已經指派的原則所作的變更都是立刻生效 
       對了,忘了提使用IPsec不僅可當內部防火牆,還可順便對網路連線作加密!像你如果用Wireshark這類的封包分析軟體來擷取網路封包,未加密前是可以從封包中查出使用的T-SQL指令,但如果用IPsec加密後是看不出來的喔!

2012年3月6日 星期二

如何取出某段期間內的每個周日?

         MSDN上有網友在問,已經有高手利用CTE去解囉,小弟剛好在練習水平思考的技巧,在此提供另一種解法,就是利用SPT_VALUES提取列表去解

        小弟認為使用SPT_VALUES比CTE更直覺的去解這個問題,效能也許第一次不比CTE快,但第二次將SPT_VALUES載入記憶體後,就不輸CTE囉,而且重點是此方法從SQL 2000到SQL 2012 (RC0)都適用

2012年3月2日 星期五

[查詢優化]影響執行計畫的因素4-Selectivity(選擇性)


        選擇性是一種獨特性的衡量,大多用來描述述詞,如果要計算的話就是符合資料列/總資料列的比率

        假設有個員工資料表,總共100位員工,男女各半,資料表上有ID(身分證或護照)及性別欄位,如果述詞為" ID= '某個員工ID' ",可以預期只會回傳一個員工,選擇性為1/100=0.01,表示有較高的獨特性,所以ID欄位有高選擇性,如果述詞為" 性別 = '男生' ",可以預期將會回傳50位員工,選擇性為50/100=0.5,有較低的獨特性,所以性別欄位的是低選擇性

        大資料裡找小資料,使用索引是很有效率的,所以通常述詞裡有高選擇性欄位,就很適合拿來做選索引欄位囉,像前述所提的ID欄位,很適合拿來做索引欄位,性別欄位就較不適合囉

2012年2月15日 星期三

WEVTUTIL-管理事件檢視器的工具


WEVTUTIL 是一個很強大的管理事件檢視器的工具,參數有夠多的,適用於Windows 7、 Windows Server 2008、Windows Server 2008 R2及Windows Vista,拿來清事件檢視器的紀錄超方便,舉幾個我用到的例子吧

1.列出所有log名稱
WEVTUTIL EL

2012年2月6日 星期一

TCP 提供者: 一次只能用一個通訊端位址 (通訊協定/網路位址/連接埠)。


   公司不過一千多人,為何年底那天內網IIS瞬間可看到一萬多個Requests呢?


2012年1月20日 星期五

在Windows Server 2008 R2上將Tomcat安裝成服務的方法


  在Windows Server 2008 R2要把Tomcat安裝成服務時,不知為什遭遇到很多問題,可我花了好一番功夫才解決呢,特將安裝步驟與遭遇的問題整理如下囉,供大家參考

  除OS外的相關軟體
  • Tomcat使用免安裝版(apache-tomcat-5.5.33)
  • Jdk也請裝x64(jdk-1_5_0_15-windows-amd64)

2012年1月15日 星期日

查看Windows版本-Winver

簡單到不能簡單的問題,但花了我好一番功夫才找到!所以記錄一下以免忘記。 

  同事裝了一台Windows Server 2008 R2的VM給我測試,但我覺得不像是R2,可是我從[我的電腦]按右鍵選[內容]卻看不出是什版本,如下圖,Windows Server Stansard是什版本啊?

   因為上圖跟我自己裝的Windows Server 2008 x32的看起來幾乎一樣啊,只是同事裝的是x64沒錯,想說有什指令可以查呢?後來上網搜尋了好一會,才找個Winver這指令啊!直接在命令列下執行即可!查看版本很方便。

2012年1月8日 星期日

[查詢優化]影響執行計畫的因素3-Cardinality(基數)

   基數是用來量測滿足某個條件下的資料列數目,想像一下,如果一個員工資料表總共有500筆資料,這個資料表有單位、姓名及ID等欄位,有一個查詢的條件是"WHERE 單位 = '資訊處' ",那查詢最佳化工具就會找[單位]的統計資料,結果發現直方圖為[資訊處]有50筆,這50筆就是所謂的基數

  有沒有覺得這個基數很熟悉,沒錯,在執行計畫裡,我們可以把每個運算子的估計的資料列數目當作是基數喔

  有時查詢最佳化工具沒法正確的預估基數,使得執行計畫的成本估計不正確,會導致選擇次佳的執行計畫呢