用Embed的CSS來實現比較簡便,但缺點不是所有的的收信應用程式都有支援,像Gmail就無法正常顯示,除非改用Inline的CSS囉
像下圖這樣的隔行換色效果,看起來比較美觀,也比較專業
2013年3月10日 星期日
2013年3月5日 星期二
Security Change Snapshot2取得安全性權限的資訊
參考Nate Hughes的Security Change Snapshot這篇,可以取得SQL Server Logins, Database Permissions and Role Members的安全性資訊,還可用日期取得異動的紀錄,這想法很不錯,但少了伺服器層級的安全性資訊,於是自己加了上去,並改成SP就放上來啦,很感謝Nate Hughes的分享
2013年1月10日 星期四
DBCC CHECKDB出現2570一致性錯誤
最近升級到SQL 2008 R2 x64版,在備份資料庫前加了資料完整性檢查的排程,隔天發現完整性檢查排程執行失敗,執行的指令如下
DBCC CHECKDB (test) WITH NO_INFOMSGS, ALL_ERRORMSGS, DATA_PURITY
在SQL Server記錄檔裡也可以看到傾印檔案的位置,如下圖
2012年10月14日 星期日
連結伺服器 "linked_server_name" 的 OLE DB 提供者 "IBMDADB2.DB2COPY2" 提供了不一致的資料行中繼資料。
最近透過Linked Server以SELECT 使用 4 部分名稱去查詢DB2的資料,如下範例
結果出現下列錯誤:
連結伺服器 "DB2" 的 OLE DB 提供者 "IBMDADB2.DB2COPY2" 提供了不一致的資料行中繼資料。回報物件""TEST"."SCHEMA1"."TABLE1"" 的資料行 "Column1" (編譯時間序數 7) 在編譯時間有 14 的 "DBTYPE",而在執行時間有 131。
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紀錄有出現錯誤訊息,如下圖
一開始我先用簡單的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,我原本就做了以下前三項的設定
- 應用程式帳號權限最小化
- 限制中繼資料的可見性
- 稽核軌跡
- 資料表(行)命名的考量
2012年7月24日 星期二
FN_TRACE_GETTABLE函數配上WHERE發生的怪事
最近在某台SQL 2005的機器上啟用Server Side Trace,打算自動分析Trace檔來稽核軌跡紀錄,因為FN_TRACE_GETTABLE函數本身可以以表格式格式傳回Trace檔的內容,我就偷懶直接拿來過濾欄位使用,沒有先匯入資料表後再過濾,結果發生同樣的指令有時候有回傳資料,有時候又沒有資料的情況
同樣讀取4個Trace檔案,假設共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月7日 星期六
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年4月25日 星期三
連結伺服器"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" 取得資料行資訊。
連結伺服器"linked server
訊息7350,層級16,狀態2,行1
無法從連結伺服器"DB2TEST" 的OLE DB 提供者"IBMDADB2.DB2COPY1" 取得資料行資訊。
2012年4月19日 星期四
[T-SQL]分組排名(SUBSQERY、CTE及用TOP))
如何從銷售訂單資訊[SalesOrderHeader]資料表中,找出每個顧客[CustomerID]其應付總額[TotalDue]前三高的訂單[SalesOrderID],並顯示名次?呈現結果如下
注意應付總額一樣的也要列喔
2012年3月6日 星期二
如何取出某段期間內的每個周日?
MSDN上有網友在問,已經有高手利用CTE去解囉,小弟剛好在練習水平思考的技巧,在此提供另一種解法,就是利用SPT_VALUES提取列表去解
小弟認為使用SPT_VALUES比CTE更直覺的去解這個問題,效能也許第一次不比CTE快,但第二次將SPT_VALUES載入記憶體後,就不輸CTE囉,而且重點是此方法從SQL 2000到SQL 2012 (RC0)都適用
小弟認為使用SPT_VALUES比CTE更直覺的去解這個問題,效能也許第一次不比CTE快,但第二次將SPT_VALUES載入記憶體後,就不輸CTE囉,而且重點是此方法從SQL 2000到SQL 2012 (RC0)都適用
2012年2月6日 星期一
2012年1月8日 星期日
[查詢優化]影響執行計畫的因素3-Cardinality(基數)
基數是用來量測滿足某個條件下的資料列數目,想像一下,如果一個員工資料表總共有500筆資料,這個資料表有單位、姓名及ID等欄位,有一個查詢的條件是"WHERE 單位 = '資訊處' ",那查詢最佳化工具就會找[單位]的統計資料,結果發現直方圖為[資訊處]有50筆,這50筆就是所謂的基數
有沒有覺得這個基數很熟悉,沒錯,在執行計畫裡,我們可以把每個運算子的估計的資料列數目當作是基數喔
有時查詢最佳化工具沒法正確的預估基數,使得執行計畫的成本估計不正確,會導致選擇次佳的執行計畫呢
有沒有覺得這個基數很熟悉,沒錯,在執行計畫裡,我們可以把每個運算子的估計的資料列數目當作是基數喔
有時查詢最佳化工具沒法正確的預估基數,使得執行計畫的成本估計不正確,會導致選擇次佳的執行計畫呢
2011年10月3日 星期一
SQL 2008 R2的SSMS工具竟不能連SQL 2005的Reporting Services
今天心血來潮用SQL 2008 R2的SSMS工具去連SQL 2005的Reporting Services時,出現如下錯誤訊息,心想我跟這工具有哪麼不熟啊,竟然會出錯
其他資訊:試了幾遍,都一樣,怎麼我連工具也不會用了,可是明明SQL 2008的SSMS可以連SQL 2008的RS,SQL 2005的SSMS也可以連SQL 2005的RS啊,偏偏SQL 2008的SSMS就是不給我連SQL 2005的RS
報表伺服器 WMI 提供者錯誤:
無效的名稱區 (Microsoft.SqlServer.Management.UI.RSClient)
------------------------------
無效的名稱區 (System.Management)
------------------------------
2011年9月21日 星期三
利用EPM Framework來延伸「以原則為基礎的管理」功能到SQL Server 2005及SQL Server 2000
這次參加Tech.Day 2011聽到陳俊宇老師提到EPM Framework,這EPM可以把SQL 2008的PBM「以原則為基礎的管理」功能向下套用到SQL 2000及SQL 2000呢,於是在測試環境試了一下,發現還真不錯用,雖只是在SQL Agent Job裡面利用PowerShell把評估的原則套用到舊版的SQL Server上,並把評估的結果寫到中央管理伺服器(CMS)裡,讓你之後可以查閱相關評估結果,但它並不只是如此而已,還利用SQL Server 2008 Reporting Services讓你有漂亮的報表可以看喔,像下圖的報表的例子,我測試環境的狀況是一台是SQL 2005,另一台是SQL 2000的
2011年9月15日 星期四
列出目前資料庫裡,欄位定序與資料庫定序不同的所有欄位
訊息468,層級16,狀態9,行1
無法解析equal to 作業中"Chinese_Taiwan_Stroke_CI_AS" 與"Chinese_Taiwan_Stroke_90_CI_AS" 之間的定序衝突。
近一個月內就讓我遇到兩次上面這個錯誤,上一次是跨Server的,這一次則是發生在同一個DB內的,想說寫一個簡單的語法來找出定序不同的地方囉
2011年9月4日 星期日
[DBA必備工具推薦]Adam Machanic設計的who is active
我一直在找一個可用來監視目前SQL Server活動的好工具,因為2008 SSMS的活動監視器讓我用的很不習慣,sp_who?顯示的資訊又過多,不過現在終於讓我找到替代工具啦,就是Adam Machanic設計的who is active啦,不推薦一下不行
1.Who is Active: The License,只要不是用在商業目的,幾乎是免費使用的
2.一個who_is_active,抵過sp_who2、sp_who3、sp_who4、sp_who5、sp_who6及活動監視器喔
3.它只顯示適當的資訊,不像第二點提到的那些工具都顯示一大堆沒用的資訊
4.可自訂成你想呈現的欄位,不想看的就不要看
5.蒐集的資訊來自15 個DMV喔,第一版發布於2007/12/31號,目前已出到
Who is Active v11.00了,這可是Adam Machanic的心血結晶啊
6.預設可以不用下參數,使用簡單,但實際上參數很多,為了讓你了解參數的使用方法,Adam Machanic還很好心的寫了一連30篇的教學呢,還有回家作業讓你挑戰,還附上解答,建議從頭看到尾,可以讓你懂得更多
推薦一定要試試看喔
1.Who is Active: The License,只要不是用在商業目的,幾乎是免費使用的
2.一個who_is_active,抵過sp_who2、sp_who3、sp_who4、sp_who5、sp_who6及活動監視器喔
3.它只顯示適當的資訊,不像第二點提到的那些工具都顯示一大堆沒用的資訊
4.可自訂成你想呈現的欄位,不想看的就不要看
5.蒐集的資訊來自15 個DMV喔,第一版發布於2007/12/31號,目前已出到
Who is Active v11.00了,這可是Adam Machanic的心血結晶啊
6.預設可以不用下參數,使用簡單,但實際上參數很多,為了讓你了解參數的使用方法,Adam Machanic還很好心的寫了一連30篇的教學呢,還有回家作業讓你挑戰,還附上解答,建議從頭看到尾,可以讓你懂得更多
推薦一定要試試看喔
2011年8月8日 星期一
你知道作業步驟T-SQL指令碼裡可以使用Token與逸出巨集嗎?
最近看到一行有著看不懂字串的T-SQL,類似像下面這行
EXEC usp_StoredProcdure $(ESCAPE_NONE(JOBID))
從$符號開始都很奇怪,ESCAPE_NONE也不像是函數,JOBID也不是字串,這兩個也不像是關鍵字,更怪的是直接拿到SSMS上執行更會告訴我什麼語法不正確,看來別人似乎用的很高興,但我卻不知怎麼用...
EXEC usp_StoredProcdure $(ESCAPE_NONE(JOBID))
從$符號開始都很奇怪,ESCAPE_NONE也不像是函數,JOBID也不是字串,這兩個也不像是關鍵字,更怪的是直接拿到SSMS上執行更會告訴我什麼語法不正確,看來別人似乎用的很高興,但我卻不知怎麼用...
訂閱:
文章 (Atom)