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" 的資料轉換傳回狀態值和狀態文字"文字已截斷,或者一個或多個字元在目標字碼頁裡沒有相符者。"