搜尋本站文章

顯示具有 SQL Server 2008 Admin 標籤的文章。 顯示所有文章
顯示具有 SQL Server 2008 Admin 標籤的文章。 顯示所有文章

2016-02-04

效能調教:鎖定記憶體分頁(Lock Pages in Memory, LPIM) - 檢查是否有啟用此 Windows 原則

若要檢查是否有啟用 鎖定記憶體分頁(Lock Pages in Memory, LPIM)

請參考以下的方式:

(1) DBCC MEMORYSTATUS

-- 01_未啟用_鎖定記憶體分頁_DBCC MEMORYSTATUS



-- 02_已啟用_鎖定記憶體分頁_DBCC MEMORYSTATUS



(2) SQL Server error log

-- 03_未啟用_鎖定記憶體分頁_SQL Server error log



在 SQL Server error log 顯示:


Using conventional memory in the memory manager.


-- 04_已啟用_鎖定記憶體分頁_SQL Server error log



在 SQL Server error log 顯示:

Using locked pages in the memory manager


(3) T-SQL 陳述式 - sys.dm_os_memory_nodes

select osn.node_id, osn.memory_node_id, osn.node_state_desc, omn.locked_page_allocations_kb
from sys.dm_os_memory_nodes omn inner join sys.dm_os_nodes osn 
on (omn.memory_node_id = osn.memory_node_id)
where osn.node_state_desc <> 'ONLINE DAC'


-- 05_未啟用_鎖定記憶體分頁_sys.dm_os_memory_nodes


-- 06_已啟用_鎖定記憶體分頁_sys.dm_os_memory_nodes





請參考以下方式來啟用 鎖定記憶體分頁(Lock Pages in Memory, LPIM):

效能調教:鎖定記憶體分頁(Lock Pages in Memory, LPIM)
http://sharedderrick.blogspot.tw/2016/02/lock-pages-in-memory-lpim.html



參考資料

How to enable the "locked pages" feature in SQL Server 2012
https://support.microsoft.com/en-us/kb/2659143

Clarification about the two LPIM upgrade rules that did not FAIL
https://blogs.msdn.microsoft.com/psssql/2012/04/30/clarification-about-the-two-lpim-upgrade-rules-that-did-not-fail/

FIX: Locked page allocations are enabled without any warning after you upgrade to SQL Server 2012
https://support.microsoft.com/en-us/kb/2708594

效能調教:鎖定記憶體分頁(Lock Pages in Memory, LPIM)
http://sharedderrick.blogspot.tw/2016/02/lock-pages-in-memory-lpim.html

伺服器記憶體伺服器組態選項
https://msdn.microsoft.com/zh-tw/library/ms178067(v=sql.120).aspx

針對 4 GB 以上的實體記憶體啟用記憶體支援
https://technet.microsoft.com/zh-tw/library/ms179301(v=sql.105).aspx

如何使用 DBCC MEMORYSTATUS 命令,來監視 SQL Server 2005 上的記憶體使用量
https://support.microsoft.com/zh-tw/kb/907877

INF: 使用 DBCC MEMORYSTATUS 」 來監視 SQL Server 記憶體使用量
https://support.microsoft.com/zh-tw/kb/271624

sys.dm_os_memory_nodes (Transact-SQL)
https://msdn.microsoft.com/zh-tw/library/bb510622(v=sql.120).aspx

效能調教:鎖定記憶體分頁(Lock Pages in Memory, LPIM)

雖然非必要,不過我們建議在使用 64 位元作業系統時在記憶體中鎖定分頁。
對於 32 位元作業系統,您必須先授與 Lock pages in memory(LPIM) 權限,再針對 SQL Server 設定 AWE。

說明:

此安全性設定決定哪些使用者能使用處理程序來保留實體記憶體中的資料,阻止系統將資料分頁到磁碟上的虛擬記憶體。

履行此特殊權限會降低可用的隨機存取記憶體 (RAM) 數量,而對系統效能造成顯著影響。
預設值: 無。



此 Windows 原則 - 鎖定記憶體分頁(Lock Pages in Memory):
決定哪些帳戶可以使用處理序將資料保留在實體記憶體中,以防止系統將資料傳送到磁碟上的虛擬記憶體。

在 SQL Server 2005, 2008, 2008 R2 (32-bit) 版本中,設定 32 位元 SQL Server 執行個體的 [鎖定分頁] 選項時,需要具有 sqlservr.exe 執行權限的帳戶具有 LPIM 使用者權限,而且 'awe_enabled' 組態選項設定為 ON。

若要停用 SQL Server 的 [鎖定記憶體中的分頁] 選項,請移除 SQL Server 啟動帳戶的 [已鎖定記憶體中的分頁] 使用者權限。

-- SQL Server版本與鎖定記憶體分頁





停用鎖定記憶體中的分頁

1. 在 [開始] 功能表上,按一下 [執行]。在 [開啟舊檔] 方塊中,輸入 gpedit.msc。此時會開啟 [群組原則] 對話方塊。

2. 在 [群組原則] 主控台中,依序展開 [電腦設定] 和 [Windows 設定]。

3. 展開 [安全性設定],然後展開 [本機原則]。

4. 選取 [使用者權限指派] 資料夾。這些原則會顯示在詳細資料窗格中。

5.在窗格中按兩下 [鎖定記憶體中的分頁]。

6. 在 [本機安全性原則設定] 對話方塊中,選取具有 sqlservr.exe 執行權限的帳戶,然後按一下 [移除]。

-- 01_鎖定記憶體中的分頁



-- 02_鎖定記憶體中的分頁_本機安全性設定



-- 03_鎖定記憶體中的分頁_解說



-- 04_設定SQL Server服務啟動帳戶具備鎖定記憶體分頁的權利






參考資料

伺服器記憶體伺服器組態選項
https://msdn.microsoft.com/zh-tw/library/ms178067(v=sql.120).aspx

How to enable the "locked pages" feature in SQL Server 2012
https://support.microsoft.com/en-us/kb/2659143

針對 4 GB 以上的實體記憶體啟用記憶體支援
https://technet.microsoft.com/zh-tw/library/ms179301(v=sql.105).aspx

2015-12-24

執行個體的服務啟動帳戶(NT SERVICE\MSSQLSERVER),應該具備「執行磁碟區維護工作(Perform volume maintenance tasks)」安全性原則的權限

示範環境:
1. SQL Server 2014
2. 作業系統:Windows 10 與 Windows Server 2012 R2

以存取磁碟的效能來考量

執行個體的服務啟動帳戶,預設是使用「虛擬帳戶」:NT SERVICE\MSSQLSERVER,應該具備「執行磁碟區維護工作(Perform volume maintenance tasks)」安全性原則的權限。

依據預設值,是沒有具備「執行磁碟區維護工作(Perform volume maintenance tasks)」安全性原則的權限,請參考以下的示範:

建立資料庫:Instant01,資料檔案的初始值大小是:512 MB。

-- 01_建立範例資料庫


-- 02_未具備-執行磁碟區維護工作



建立此資料庫,需要費時:9,869 ms。




若服務啟動帳戶具備「執行磁碟區維護工作(Perform volume maintenance tasks)」安全性原則的權限,請參考以下的範例:

-- 03_已具備-執行磁碟區維護工作



建立資料庫,需要費時:778 ms。



測試結果

9,869 ms(預設值) 比上 778 ms(調整後),兩者差距:9,091 ms。



設定具備「執行磁碟區維護工作(Perform volume maintenance tasks)」安全性原則的權限

-- 04_使用 Local Security Policy



-- 05_設定具備「執行磁碟區維護工作(Perform volume maintenance tasks)」安全性原則的權限



-- 06_檢視_Perform volume maintenance tasks



中文版本

-- 07__使用-本機安全性原則



-- 08_找到多個相符合名稱



-- 09_設定具備-磁碟區維護工作



-- 10_檢視_磁碟區維護工作





立即檔案初始化(Instant File Initialization)

在 SQL Server 2005 及更新的版本中,可將資料檔立即初始化,以便快速執行資料庫或檔案群組的還原作業。

立即檔案初始化會回收使用過的磁碟空間,但不以零填滿該空間。而是在將新資料寫入檔案時,覆寫磁碟內容。

雖然記錄檔初始化仍然需要歸零,不過這項作業可以跟備份的資料傳輸作業平行進行。還原的向前復原步驟則要等到所有資料都已經傳輸而且整個記錄都已經初始化才會啟動。

附註附
立即檔案初始化僅適用於 Microsoft Windows XP、Windows Server 2003 或更新版本的系統。

若要使用立即檔案初始化,您必須在 Windows 帳戶之下執行 MSSQLSERVER 服務帳戶,並指派 Windows SE_MANAGE_VOLUME_NAME 特殊權限給該 Windows 帳戶。

此權限依預設會指定給 Windows Administrators 群組。

若您有系統管理員權限,即可將 Windows 帳戶新增至「執行磁碟區維護工作」安全性原則,藉以指派此權限。



Windows 7 和 Windows Server 2008 R2 中提供的新帳戶類型

Windows 7 和 Windows Server 2008 R2 有兩種新的服務帳戶類型,分別稱為「受管理的服務帳戶」(Managed Service Account,MSA) 和「虛擬帳戶」(Virtual Account)。

受管理的服務帳戶和虛擬帳戶的設計在於提供重要的應用程式 (例如 SQL Server) 並與自己的帳戶隔離,同時不需系統管理員手動管理服務主要名稱 (SPN) 和這些帳戶的認證。

這些帳戶可讓長期管理服務帳戶使用者、密碼和 SPN 的工作更輕鬆。

虛擬帳戶(Virtual Accounts)

Windows Server 2008 R2 和 Windows 7 中的虛擬帳戶是「受管理的本機帳戶」(Managed Local Account),會提供下列功能來簡化服務管理工作。

虛擬帳戶是自動管理的,而且虛擬帳戶可以在網域環境中存取網路。

如果在 Windows Server 2008 R2 或 Windows 7 上安裝 SQL Server 的期間針對服務帳戶使用預設值,則會使用以執行個體名稱做為服務名稱的虛擬帳戶,其格式為 NT SERVICE\。 

以虛擬帳戶執行的服務,會利用電腦帳戶的認證存取網路資源,其格式為 \$。 

指定虛擬帳戶啟動 SQL Server 時,請讓密碼空白。 如果虛擬帳戶無法註冊服務主要名稱 (SPN),請手動註冊 SPN。

注意事項

虛擬帳戶無法用於 SQL Server 容錯移轉叢集執行個體,因為虛擬帳戶在叢集的每一個節點上不會有相同的 SID。



執行磁碟區維護工作(Perform volume maintenance tasks)

此安全性原則設定會決定哪些使用者可以執行磁碟區或磁碟管理工作,例如重組現有的磁碟區、 建立或移除磁碟區,以及執行磁碟清理工具。

指派此使用者權限時請特別小心。
這個使用者權限的使用者可以瀏覽磁碟並擴充匯入包含其他資料的記憶體。

擴充的檔案開啟時,使用者可能可以讀取和修改取得的資料。




參考資料

執行磁碟區維護工作
https://technet.microsoft.com/zh-tw/library/dn221971.aspx

最佳化 SQL Server 中的備份和還原效能
https://technet.microsoft.com/zh-tw/library/ms190954(v=sql.105).aspx

設定 Windows 服務帳戶與權限
https://msdn.microsoft.com/zh-tw/library/ms143504(v=sql.120).aspx

執行磁碟區維護工作
https://technet.microsoft.com/zh-tw/library/dn221971.aspx

2013-08-29

查詢目前資料庫內有哪些 DML 觸發程序(Trigger)

查詢目前資料庫內有哪些 DML 觸發程序(Trigger)

示範版本:SQL Server 2012

可以參考以下的範例程式碼:


-- 查詢:現行資料庫內,有哪些 DML 觸發程序
SELECT SCHEMA_NAME(tb.schema_id) N'結構描述', OBJECT_NAME(t.parent_id) N'資料表', t.name N'觸發程序名稱', parent_class_desc N'觸發程序父類別的描述', 
 t.type_desc N'物件類型的描述',  tEV.type_desc '引發觸發程序的每個事件', is_instead_of_trigger N'是否為 INSTEAD OF 觸發程序'
FROM sys.triggers t INNER JOIN sys.trigger_events tEV ON t.object_id = tEV.object_id 
 INNER JOIN sys.tables tb ON t.parent_id = tb.object_id
GO

-- 01_DML觸發程序



-- 02_DML觸發程序






參考資料

sys.triggers (Transact-SQL)
http://technet.microsoft.com/zh-tw/library/ms188746.aspx

sys.trigger_events (Transact-SQL)
http://technet.microsoft.com/zh-tw/library/ms187322.aspx

2013-03-26

組態「操作員」來傳送給多個 Email 帳戶;Configuration operator to send to multiple Email


示範版本:SQL Server 2012。

若是要組態「操作員」來傳送給多個 Email 帳戶,可能使用的方法,例如:

1. 在 Mail 伺服器上,建立群組帳戶。

2. 在建立「操作員」時,利用「分號(semicolon)」來分隔多個電子郵件地址。




建立「操作員」,利用「分號(semicolon)」來分隔多個電子郵件地址

請參考以下的範例程式碼:

/*
sp_add_operator (Transact-SQL)

引數
[ @email_address= ] 'email_address'

操作員的電子郵件地址。這個字串會直接傳遞至電子郵件系統。 

email_address 是 nvarchar(100),預設值是 NULL。

您可以指定 email_address 的實體電子郵件地址或別名。
例如:'jdoe' 或 'jdoe@xyz.com'
*/

USE [msdb]
GO
EXEC msdb.dbo.sp_add_operator @name=N'MISGroup', 
  @enabled=1, 
  @pager_days=0, 
  @email_address=N'u99@mydba.com;u30@mydba.com'
GO


-- 圖01_組態「操作員」來傳送給多個 Email 帳戶







參考資料

sp_add_operator (Transact-SQL)
http://msdn.microsoft.com/zh-tw/library/ms186747.aspx

建立與組態 Database Mail,使用Transact-SQL為例 -- SQL Server 2012 版本
http://sharedderrick.blogspot.tw/2012/05/database-mailtransact-sql.html

實作練習:建立 Database Mail 與 SQL Agent Mail,以 SQL Server 2008 為例
http://sharedderrick.blogspot.tw/2011/01/database-mail-sql-agent-mail-sql-server.html

2013-03-25

SQL Server 預設可同時連接的使用者(user connections)數目上限是:32,767


示範版本:SQL Server 2012 版本。

在 SQL Server 執行個體上,可同時連接的使用者數目上限是:32,767



SQL Server 伺服器組態選項

user connections 選項會指定 SQL Server 執行個體上可同時連接的使用者數目上限。

實際允許的使用者連接數也取決於您所使用的 SQL Server 版本,以及應用程式的限制或應用程式和硬體的限制而定。

SQL Server 最多允許 32,767 個使用者連接。

因為 user connections 是動態的 (自我設定的) 選項,所以 SQL Server 會視需要自動調整最大使用者連接數,最多調整到允許的最大值。

例如,如果只有 10 個使用者登入,就配置 10 個使用者連線物件。

在大部分情況下,不需要變更這個選項的值。

預設值為 0,表示允許無限制的使用者連接。




EX1. 查詢 SQL Server  執行個體,可同時連接的使用者數目上限



-- EX1. 查詢 SQL Server  執行個體,可同時連接的使用者數目上限

-- 01_使用 sys.configurations
SELECT * FROM sys.configurations
WHERE name =N'user connections'
GO

-- 02_使用 sys.sp_configure
USE master;
GO
EXEC sp_configure 'show advanced option', '1';
GO
RECONFIGURE 
GO
EXEC sys.sp_configure N'user connections'
GO


-- 圖01_查詢 SQL Server 執行個體,可同時連接的使用者數目上限






EX2. 變更 SQL Server 執行個體,可同時連接的使用者數目上限

-- EX2. 變更 SQL Server  執行個體上可同時連接的使用者數目上限
-- 組態為可以接受:32,767 使用者數目

-- 01_先使用 sys.sp_configure 
USE master;
GO
EXEC sp_configure 'show advanced option', '1';
GO
RECONFIGURE 
GO
EXEC sys.sp_configure N'user connections', N'32767'
GO
RECONFIGURE WITH OVERRIDE
GO


-- 02_重新啟動此執行個體

執行個體必須重新啟動之後,設定才能生效。


-- 圖02_變更 SQL Server  執行個體,可同時連接的使用者數目上限



-- 圖03_SSMS2012_組態同時連接的使用者數目上限






刻意輸入超過同時連接的使用者數目之上限


/*
訊息 15129,層級 16,狀態 1,程序 sp_configure,行 161
'50000' 不是設定選項 'user connections' 的有效值。

Msg 15129, Level 16, State 1, Procedure sp_configure, Line 161
'50000' is not a valid value for configuration option 'user connections'.
*/


-- 圖04_刻意輸入超過同時連接的使用者數目之上限



經過測試:

SSMS 2012 管理工具,提供了防呆功能,無法輸入超過 32,767 的數值。




參考資料

SQL Server 2012 的產品規格
http://msdn.microsoft.com/zh-tw/library/ms143287.aspx

sp_configure (Transact-SQL)
http://msdn.microsoft.com/zh-tw/library/ms188787.aspx

伺服器組態選項
http://msdn.microsoft.com/zh-tw/library/ms189631.aspx

設定 user connections 伺服器組態選項
http://msdn.microsoft.com/zh-tw/library/ms187030.aspx

sys.configurations (Transact-SQL)
http://msdn.microsoft.com/zh-tw/library/ms188345.aspx

--


忘記 sa 密碼,也無法使用 Windows 認證的 Administrator 帳戶來登入 SQL Server。I forgot my SA password and cannot login as administrator using windows authentication.
http://sharedderrick.blogspot.tw/2009/11/sa-windows-administrator-sql-serveri.html


--

如何:利用 SQL Server Management Studio 使用專用管理員連接
http://msdn.microsoft.com/zh-tw/library/ms178068(v=sql.105).aspx

資料庫管理員的診斷連接
http://msdn.microsoft.com/zh-tw/library/ms189595.aspx

2013-03-21

如何移除「透明資料加密(Transparent Data Encryption,TDE)


示範版本:SQL Server 2012

如何移除「透明資料加密(Transparent Data Encryption,TDE)

(1) 如果資料庫經過加密,您必須先使用 ALTER DATABASE ... SET ENCRYPTION OFF 陳述式,先從資料庫移除加密。

(2) 等候解密完成,然後再使用 DROP DATABASE ENCRYPTION KEY  移除資料庫加密金鑰。




移除「透明資料加密(Transparent Data Encryption,TDE)

請參考以下的範例程式碼


-- 01_檢視關於資料庫加密狀態的資訊
/*
sys.dm_database_encryption_keys 
傳回關於資料庫加密狀態及其相關聯之資料庫加密金鑰的資訊。

--
資料行名稱:encryption_state 

指出資料庫已加密或未加密。

0 = 沒有資料庫加密金鑰存在,未加密
1 = 未加密
2 = 加密進行中
3 = 已加密
4 = 金鑰變更進行中
5 = 解密進行中
6 = 保護變更進行中 (正在變更用於加密資料庫加密金鑰的憑證或非對稱金鑰)。

資料行名稱:percent_complete
資料庫加密狀態變更的完成百分比。如果沒有狀態變更,這將會是 0。
*/
USE master
GO
SELECT DB_NAME(database_id) N'資料庫',encryption_state N'加密狀態',percent_complete N'完成百分比',
 key_algorithm N'演算法', key_length N'金鑰長度', encryptor_type N'加密程式的類型', encryptor_thumbprint N'加密程式的指模',create_date N'建立加密金鑰的日期'
FROM sys.dm_database_encryption_keys
GO


-- 圖01_檢視關於資料庫加密狀態的資訊



-- 02_先設定此資料庫移除加密功能
/*
如果資料庫經過加密,您必須使用 ALTER DATABASE 陳述式,先從資料庫移除加密。
等候解密完成,然後再移除資料庫加密金鑰。

ALTER DATABASE SET 選項

ENCRYPTION {ON | OFF}
設定資料庫要加密 (ON) 或是不要加密 (OFF)。 
在資料庫層級啟用加密時,所有的檔案群組都會加密。 任何新的檔案群組都會繼承加密的屬性。 如果資料庫內有任何檔案群組設定為 READ ONLY,則資料庫加密作業將會失敗。
*/

ALTER DATABASE Northwind_TDE 
SET ENCRYPTION OFF
GO

-- 03_移除資料庫加密功能後,檢視關於資料庫加密狀態的資訊
USE master
GO
SELECT DB_NAME(database_id) N'資料庫',encryption_state N'加密狀態',percent_complete N'完成百分比',
 key_algorithm N'演算法', key_length N'金鑰長度', encryptor_type N'加密程式的類型', encryptor_thumbprint N'加密程式的指模',create_date N'建立加密金鑰的日期'
FROM sys.dm_database_encryption_keys
GO


-- 圖02_移除資料庫加密功能後,檢視關於資料庫加密狀態的資訊




雖然資料庫 Northwind_TDE 的加密狀態是:1 (未加密)。

但此資料庫仍未完成解密,必須要再使用 DROP DATABASE ENCRYPTION KEY  移除資料庫加密金鑰。



-- 04_卸除資料庫透明加密中所使用的資料庫加密金鑰
/*
DROP DATABASE ENCRYPTION KEY 

卸除資料庫透明加密中所使用的資料庫加密金鑰。
如果資料庫經過加密,您必須使用 ALTER DATABASE 陳述式,先從資料庫移除加密。 等候解密完成,然後再移除資料庫加密金鑰。
*/
USE Northwind_TDE
GO
DROP DATABASE ENCRYPTION KEY;
GO

-- 05_卸除資料庫透明加密中所使用的資料庫加密金鑰後,檢視關於資料庫加密狀態的資訊
USE master
GO
SELECT DB_NAME(database_id) N'資料庫',encryption_state N'加密狀態',percent_complete N'完成百分比',
 key_algorithm N'演算法', key_length N'金鑰長度', encryptor_type N'加密程式的類型', encryptor_thumbprint N'加密程式的指模',create_date N'建立加密金鑰的日期'
FROM sys.dm_database_encryption_keys
GO



-- 圖03_卸除資料庫透明加密中所使用的資料庫加密金鑰後,檢視關於資料庫加密狀態的資訊





系統資料庫 tempdb 要等到下次重新啟動後,將自動移除資料庫透明加密功能。




參考資料

ALTER DATABASE SET 選項 (Transact-SQL)
http://technet.microsoft.com/zh-tw/library/bb522682.aspx

DROP DATABASE ENCRYPTION KEY (Transact-SQL)
http://msdn.microsoft.com/zh-tw/library/bb630256.aspx

新手學SQL Server 2008「透明資料加密(Transparent Data Encryption,TDE)」(1) : 技術文章
http://sharedderrick.blogspot.com/2008/10/1.html

新手學SQL Server 2008「透明資料加密(Transparent Data Encryption,TDE)」(2) : 技術文章
http://sharedderrick.blogspot.tw/2008/10/2.html


2013-03-01

刪除所有連線(Kill All Connection),資料庫層級、執行個體層級。以 Cursors(資料指標) 與資料列集(Rowsets) 方式為例。


分成為刪除指定資料庫,以及刪除執行個體上的全部連線兩個部分來說明。

以下整理了 Cursors(資料指標) 版本,以及資料列集(Rowsets)方式來處理。



EX1. 刪除指定資料庫上的所有連線

若是要刪除指定資料庫上的所有連線,可以使用以下方式:

ALTER DATABASE 語法的部分引數:

1. SINGLE_USER 引數

指定每次只能有一位使用者存取資料庫。

如果指定了 SINGLE_USER,且沒有其他使用者連接到資料庫,就會封鎖 ALTER DATABASE 陳述式,直到所有使用者都中斷指定的資料庫為止。

資料庫會保留在 SINGLE_USER 模式中,即使是將選項記錄設為關閉的使用者也是如此。
此時其他使用者可以連接到這個資料庫,但只能有一位。

2. WITH ROLLBACK IMMEDIATE 引數

使用終止選項。所有未完成的交易都會回復,與指定資料庫的所有連接都會立即中斷。

若是要刪除指定資料庫上的所有連線,請參考以下的範例:



-- 01_刪除指定資料庫上的所有連線,並變更為單一使用者連線模式
USE master
GO
ALTER DATABASE [資料庫名稱]
SET SINGLE_USER
WITH ROLLBACK IMMEDIATE;
GO

-- 02_切換回多人使用者連線模式
ALTER DATABASE [資料庫名稱]
SET MULTI_USER;
GO





EX2. CURSOR 版本,刪除 SQL Server 上全部的連線,但保留本身這條連線不會刪除

-- EX1. CURSOR 版本,刪除 SQL Server 上全部的連線,但保留本身這條連線不會刪除

-- 01_適用 SQL Server 2005、2008、2008 R2、2012 等版本

USE master
GO
CREATE PROC KillUserConnections
AS
DECLARE @spid int, @SQLstr nvarchar(128)
 
DECLARE spids_cr CURSOR FOR
SELECT session_id FROM sys.dm_exec_connections
WHERE session_id<>@@SPID
FOR READ ONLY
 
OPEN spids_cr
 
FETCH spids_cr INTO @spid
 
WHILE (@@FETCH_STATUS=0)
BEGIN
SET @SQLstr = 'KILL ' + CAST(@spid AS varchar)
EXEC sp_executesql @SQLstr
FETCH spids_cr INTO @spid
END
 
CLOSE spids_cr
DEALLOCATE spids_cr
GO
 
-- 檢視 SQL Server 目前所有的連線 session ;所有目前的處理序
SELECT * FROM sys.dm_exec_connections
 
-- 刪除所有的處理序、連線、session
EXEC KillUserConnections
 
-- 再度檢視 SQL Server 目前所有的連線 session ;所有目前的處理序
SELECT * FROM sys.dm_exec_connections
GO


-- 02_以下是 SQL Server 2000 與 2005 通用的版本

USE master
GO
CREATE PROC KillUserConnections
AS
DECLARE @spid int, @SQLstr nvarchar(128)
 
DECLARE spids_cr CURSOR FOR
SELECT spid
FROM master..sysprocesses
WHERE spid<>@@SPID AND net_address<>''
FOR READ ONLY
 
OPEN spids_cr
 
FETCH spids_cr INTO @spid
 
WHILE (@@FETCH_STATUS=0)
BEGIN
SET @SQLstr = 'KILL ' + CAST(@spid AS varchar)
EXEC sp_executesql @SQLstr
FETCH spids_cr INTO @spid
END
 
CLOSE spids_cr
DEALLOCATE spids_cr
 
GO
 
-- 檢視 SQL Server 目前所有的連線 session ;所有目前的處理序
EXEC sp_who2
 
-- 刪除所有的處理序、連線、session
EXEC KillUserConnections
 
-- 再度檢視 SQL Server 目前所有的連線 session ;所有目前的處理序
EXEC sp_who2
GO


其中 sysprocesses 此為 SQL Server 2000 系統資料表。




EX3. 資料列集(Rowsets)方式:刪除 SQL Server 上全部的連線,但保留本身這條連線不會刪除

使用資料列集(Rowsets)方式,無須使用 CURSOR 方式。

適用 SQL Server 2005、2008、2008 R2、2012 等版本。

-- EX2. 資料列集(Rowsets)方式:刪除 SQL Server 上全部的連線,但保留本身這條連線不會刪除

-- 01_檢視 SQL Server 目前所有的連線 session ;所有目前的處理序
USE master
GO
SELECT * FROM sys.dm_exec_connections
GO

-- 02_使用 ISNULL() 函數:刪除 SQL Server 上全部的連線,但保留本身這條連線不會刪除
DECLARE @str1 nvarchar(MAX)

SELECT @str1 = ISNULL(@str1, '') + 'KILL ' + CAST(session_id AS nvarchar(10)) + ';'
FROM sys.dm_exec_connections
WHERE session_id<>@@SPID

-- PRINT @str1
EXEC sp_executesql @str1
GO

/*
PRINT 陳述式所回傳的結果:
KILL 52;KILL 51;KILL 53;KILL 54;KILL 56;KILL 57;KILL 58;KILL 59;KILL 60;KILL 61;KILL 62;KILL 63;KILL 64;KILL 65;
*/


-- 03_使用 COALESCE() 函數:刪除 SQL Server 上全部的連線,但保留本身這條連線不會刪除
DECLARE @str1 nvarchar(MAX)

SELECT @str1 = COALESCE(@str1, '') + 'KILL ' + CAST(session_id AS nvarchar(10)) + ';'
FROM sys.dm_exec_connections
WHERE session_id<>@@SPID

-- PRINT @str1
EXEC sp_executesql @str1
GO


若是要改為 SQL Server 2000 版本:

請置換資料表為:master..sysprocesses。

請置換資料行:spid。



參考資料


刪除所有連線; Kill All Connection
http://sharedderrick.blogspot.tw/2008/01/kill-all-connection.html

SQL Server:認識 COALESCE() 函數,補充範例
http://sharedderrick.blogspot.tw/2012/06/t-sql-coalesce_14.html

初探Cursors(資料指標) 與資料列集(Rowsets)
http://sharedderrick.blogspot.tw/2013/02/cursors-rowsets.html


2013-02-27

初探Cursors(資料指標) 與資料列集(Rowsets)


SQL Server 會使用兩個方法將結果集傳回給取用者:

1. 「資料列集(Rowsets)」具有以下功能:


  • 將負擔最小化。
  • 在提取資料時提供最大效能。
  • 只支援預設的順向、唯讀資料指標功能。
  • 一次將一個資料列傳回給取用者。
  • 一次只支援連接上有一個作用中陳述式。
  • 在執行陳述式之後,要等到取用者已經擷取所有結果或是陳述式已被取消之後,才可以在連接上執行其他陳述式。
  • 支援所有 Transact-SQL 陳述式。


2. Server Cursors(伺服器資料指標)具有以下功能:


  • 支援所有的資料指標功能。
  • 可以將資料列區塊傳回給取用者。
  • 支援單一連接上有多個作用中陳述式。
  • 平衡資料指標功能與效能。
  • 資料指標功能的支援會減少相對於預設結果集的效能。如果取用者可以使用資料指標功能來擷取較小的資料列集,就可以抵銷這個作用。
  • 請勿支援會傳回單一結果集以上的任何 Transact-SQL 陳述式。



認識 Cursors(資料指標)

SQL Server 陳述式雖然會產生完整的結果集,但有時候這些結果或許可以改以一次處理一個資料列。

您可以在結果集上開啟一個資料指標,一次處理一個資料列結果集。

您可以指派一個資料指標給 cursor 資料類型的變數或參數。

關聯式資料庫中的作業會針對完整的資料列集運作。
例如,由 SELECT 陳述式所傳回的資料列集包括所有滿足陳述式 WHERE 子句之條件的資料列。

由陳述式傳回的完整資料列稱為結果集。
應用程式 (尤其是互動式線上應用程式) 不一定能夠以一個單位有效地運用整個結果集。

這些應用程式需要一個機制,一次運用一個資料列或小型資料列區塊。
資料指標就是一種結果集的擴充,提供此種機制。

資料指標擴充結果處理的方式是:

1. 允許定位於結果集中的特定資料列。
2. 從結果集的目前位置,擷取一個資料列或資料列區塊。

3. 支援結果集目前位置上資料列的資料修改。
4. 支援以不同可見性層級來檢視其他使用者對結果集所呈現的資料庫資料所作的變更。

5. 讓指令碼、預存程序和觸發程序中的 Transact-SQL 陳述式能夠存取結果集中的資料。

--
資料指標的 tempdb 使用量

索引鍵集驅動及靜態資料指標會使用 tempdb 內建的工作資料表。
索引鍵集驅動資料指標會使用工作資料表,來儲存識別資料指標中資料列的索引鍵集。

靜態資料指標使用工作資料表來儲存資料指標的完整結果集。
資料指標的磁碟空間使用量可能不同,視所選擇的查詢計畫而定。

如果查詢計畫與 SQL Server 的舊版相同,則磁碟空間使用量大致相同。



DECLARE CURSOR (Transact-SQL)

定義 Transact-SQL 伺服器資料指標的屬性,例如其捲動行為以及用來建立資料指標運作所在之結果集的查詢。
DECLARE CURSOR 可接受 ISO 標準語法,以及使用一組 Transact-SQL 延伸模組的語法。

--
引數:
FORWARD_ONLY

指定資料指標只能從第一個資料列捲到最後一個資料列。
FETCH NEXT 是唯一支援的提取選項。

如果指定不含 STATIC、KEYSET 或 DYNAMIC 等關鍵字的 FORWARD_ONLY 時,資料指標便會作為 DYNAMIC 資料指標操作。
當 FORWARD_ONLY 和 SCROLL 兩者都沒有指定時,除非指定了 STATIC、KEYSET 或 DYNAMIC 等關鍵字,否則,預設值是 FORWARD_ONLY。

STATIC、KEYSET 和 DYNAMIC 資料指標預設為 SCROLL。
與 ODBC 和 ADO 等資料庫 API 不同的是,STATIC、KEYSET 和 DYNAMIC 等 Transact-SQL 資料指標支援 FORWARD_ONLY。

--
@@FETCH_STATUS 資料指標函數

傳回針對連接目前開啟的任何資料指標而發出的最後一個資料指標 FETCH 陳述式的狀態。

0:FETCH 陳述式成功。
-1:FETCH 陳述式失敗,或資料列已超出結果集。
-2:遺漏提取的資料列。



EX00. 建立資料表:myOrders



-- 因為要觀察 tempdb 資料庫,重新啟動 SQL Server

-- EX00. 建立資料表:myOrders

-- 00_建立資料表:myOrders,
-- 耗時約:27 秒。HD:80 GB 。
SET NOCOUNT ON
USE Northwind_Dev
GO
IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[myOrders]') AND type in (N'U'))
DROP TABLE [dbo].[myOrders]
GO
CREATE TABLE myOrders
(EmployeeID INT , OrderDate DATETIME)
GO
DECLARE @CNT INT= 1
WHILE @CNT < 100001
BEGIN
 INSERT myOrders SELECT CAST(RAND() * 10 AS INT) , GETDATE()+@CNT
 SET @CNT +=1
END
GO

--  01_100,000 筆資料列
SELECT COUNT(*) FROM dbo.myOrders
GO

--  02_檢視資料表:dbo.myOrders
SELECT * FROM dbo.myOrders
GO


-- 01_檢視資料表:dbo.myOrders




-- 03_查詢目前資料庫內,每一個資料表的使用空間資訊
SELECT a3.name AS N'結構描述',  a2.name AS N'資料表',  a1.rows AS N'資料列筆數',  (a1.reserved + ISNULL(a4.reserved,0))* 8.0/1024 AS N'配置的空間總量(MB)',  a1.data * 8.0/1024 AS '資料(MB)',  
(CASE WHEN (a1.used + ISNULL(a4.used,0)) > a1.data THEN (a1.used + ISNULL(a4.used,0)) - a1.data ELSE 0 END) * 8.0/1024 AS N'索引(MB)',  
(CASE WHEN (a1.reserved + ISNULL(a4.reserved,0)) > a1.used THEN (a1.reserved + ISNULL(a4.reserved,0)) - a1.used ELSE 0 END) * 8.0/1024 AS N'尚未使用(MB)' 
FROM  (SELECT   ps.object_id, SUM ( CASE  WHEN (ps.index_id < 2) THEN row_count  ELSE 0 END  ) AS [rows],  
SUM (ps.reserved_page_count) AS reserved, SUM (  CASE WHEN (ps.index_id < 2) THEN (ps.in_row_data_page_count + ps.lob_used_page_count + ps.row_overflow_used_page_count)  
ELSE (ps.lob_used_page_count + ps.row_overflow_used_page_count)  END ) AS data,  
SUM (ps.used_page_count) AS used  
FROM sys.dm_db_partition_stats ps  
GROUP BY ps.object_id) AS a1 LEFT OUTER JOIN
(SELECT it.parent_id,  SUM(ps.reserved_page_count) AS reserved,  SUM(ps.used_page_count) AS used  
FROM sys.dm_db_partition_stats ps  INNER JOIN sys.internal_tables it ON (it.object_id = ps.object_id)  
WHERE it.internal_type IN (202,204)  
GROUP BY it.parent_id) AS a4 ON (a4.parent_id = a1.object_id)  
INNER JOIN sys.all_objects a2  ON ( a1.object_id = a2.object_id )   
INNER JOIN sys.schemas a3 ON (a2.schema_id = a3.schema_id)  
WHERE a2.type <> N'S' and a2.type <> N'IT' 
ORDER BY 4 DESC;
GO

/*
資料表:myOrders
資料列筆數:100000
配置的空間總量(MB):2.195312
資料(MB):2.132812
*/


-- 02_查詢目前資料庫內,每一個資料表的使用空間資訊




-- 04_檢視資料庫 tempdb 各個檔案的空間資料
USE tempdb
GO
SELECT name N'邏輯名稱' , size/128.0 N'使用的磁碟空間(MB)' ,
 CAST(FILEPROPERTY(name, 'SpaceUsed') AS int)/128.0 N'資料實際上使用的空間(MB)'
 ,size/128.0 - CAST(FILEPROPERTY(name, 'SpaceUsed') AS int)/128.0 N'剩餘的可用空間(MB)',
 physical_name N'實體檔案'
FROM sys.database_files;
GO

/*
tempdev 
使用的磁碟空間(MB):8.000000
資料實際上使用的空間(MB):2.500000
*/


-- 03_檢視資料庫 tempdb 各個檔案的空間資料





EX1. 使用 CURSOR 來計算每一位員工,最近一次接單的日期


-- EX1. 使用 CURSOR 來計算每一位員工,最近一次接單的日期

-- 宣告:區域變數
USE Northwind_Dev
GO
DECLARE @empid AS INT, @orderdate AS DATETIME, @prevempid AS INT, @prevorderdate AS DATETIME;

-- 宣告:資料表變數:@T
DECLARE @T AS TABLE (empid INT,maxorderdate DATETIME);

-- 宣告 CURSOR:存放 EmployeeID 與 OrderDate
-- FORWARD_ONLY:指定資料指標只能從第一個資料列捲到最後一個資料列。 
DECLARE OrdersCursor CURSOR FAST_FORWARD FOR
  SELECT EmployeeID, OrderDate
  FROM dbo.myOrders
  ORDER BY EmployeeID, OrderDate; -- 排序:EmployeeID、OrderDate

-- 開啟此 CURSOR
OPEN OrdersCursor;

-- 在伺服器資料指標中,擷取第一筆資料列
FETCH NEXT FROM OrdersCursor INTO @empid, @orderdate;

-- 前一次擷取資料是成功時
WHILE @@FETCH_STATUS = 0
BEGIN
  -- 如果前一筆資料列的 EmployeeID 不同於目前的資料列,取出前一筆的 OrderDate 存放到 資料表變數:@T
 IF @prevempid <> @empid
 BEGIN
  INSERT INTO @T(empid, maxorderdate) VALUES(@prevempid, @prevorderdate);
 END

 SELECT @prevempid = @empid, @prevorderdate = @orderdate;

 FETCH NEXT FROM OrdersCursor INTO @empid, @orderdate;
END

-- 如果已經擷取全部的資料列後(此情形下 EmployeeID 會是 NULL),最後一筆資料列會是最後一位員工的最近一次的 OrderDate
IF @empid IS NOT NULL
BEGIN
 INSERT INTO @T(empid, maxorderdate) VALUES(@prevempid, @prevorderdate);
END

-- 查詢資料表變數:@T
SELECT empid, maxorderdate
FROM @T;

-- 若去觀察資料庫 tempdb 各個檔案的空間資料
/*
tempdev 
使用的磁碟空間(MB):8.000000
資料實際上使用的空間(MB):5.000000
*/

-- 釋出目前結果集
CLOSE OrdersCursor;

-- 移除資料指標參考。
DEALLOCATE OrdersCursor;
GO

-- 檢視資料庫 tempdb 各個檔案的空間資料
/*
tempdev 
使用的磁碟空間(MB):8.000000
資料實際上使用的空間(MB):2.562500
*/


-- 04_執行結果,查詢資料表變數:@T



-- 05_CURSOR執行後,檢視資料庫 tempdb 各個檔案的空間資料



-- 06_釋出與移除資料指標參考後,檢視資料庫 tempdb 各個檔案的空間資料





EX2. 改用資料列集(Rowsets)方式來計算

-- EX2. 改用資料列集(Rowsets)方式來計算

-- 計算每一位員工,最近一次接單的日期
USE Northwind_Dev
GO
SELECT EmployeeID, MAX(OrderDate) AS MaxOrderDate
FROM dbo.myOrders
GROUP BY EmployeeID
ORDER BY EmployeeID;
GO




EX3. 測試使用 CURSOR 與 資料列集(Rowsets) 方式的執行時間

-- EX3. 測試使用 CURSOR 與 資料列集(Rowsets) 方式的執行時間

-- 01_測試:使用 CURSOR 的執行時間:1.8270000(秒)

USE Northwind_Dev
GO
DECLARE @StartTime DATETIME2 = SYSDATETIME()

DECLARE @empid AS INT, @orderdate AS DATETIME, @prevempid AS INT, @prevorderdate AS DATETIME;
DECLARE @T AS TABLE (empid INT,maxorderdate DATETIME);

DECLARE OrdersCursor CURSOR FAST_FORWARD FOR
  SELECT EmployeeID, OrderDate
  FROM dbo.myOrders
  ORDER BY EmployeeID, OrderDate

OPEN OrdersCursor;

FETCH NEXT FROM OrdersCursor INTO @empid, @orderdate;

WHILE @@FETCH_STATUS = 0
BEGIN
 IF @prevempid <> @empid
 BEGIN
  INSERT INTO @T(empid, maxorderdate) VALUES(@prevempid, @prevorderdate);
 END

 SELECT @prevempid = @empid, @prevorderdate = @orderdate;

 FETCH NEXT FROM OrdersCursor INTO @empid, @orderdate;
END

IF @empid IS NOT NULL
BEGIN
 INSERT INTO @T(empid, maxorderdate) VALUES(@prevempid, @prevorderdate);
END

SELECT empid, maxorderdate
FROM @T;

CLOSE OrdersCursor;
DEALLOCATE OrdersCursor;

SELECT DATEDIFF(ms, @StartTime, SYSDATETIME())/1000.00 N'使用 CURSOR 的執行時間(秒)'
GO

-- 02_測試:資料列集(Rowsets)方式,所需的執行時間:0.0470000(秒)
USE Northwind_Dev
GO
DECLARE @StartTime DATETIME2 = SYSDATETIME()

SELECT EmployeeID, MAX(OrderDate) AS MaxOrderDate
FROM dbo.myOrders
GROUP BY EmployeeID
ORDER BY EmployeeID;

SELECT DATEDIFF(ms, @StartTime, SYSDATETIME())/1000.00 N'資料列集(Rowsets)方式的執行時間(秒)'
GO


-- 07_使用 CURSOR 的執行時間



-- 08_資料列集(Rowsets)方式,所需的執行時間






或許,可以將 Cursors(資料指標) 改用以下方式來處理:

1. SQL視窗函數(SQL Windows Function)。
2. Aggegrate Functions。

...等。



參考資料

資料指標
http://technet.microsoft.com/zh-tw/library/ms191179.aspx

資料指標 (Transact-SQL)
http://technet.microsoft.com/zh-tw/library/ms181441.aspx

資料列集和 SQL Server 資料指標(Rowsets and SQL Server Cursors)
http://technet.microsoft.com/zh-tw/library/ms130840(v=sql.110).aspx

關於選擇資料指標類型
http://technet.microsoft.com/zh-tw/library/ms187859(v=sql.100).aspx

資料指標程式設計詳細內容
http://technet.microsoft.com/zh-tw/library/ms186346(v=sql.100).aspx

--
最佳化 tempdb 效能
http://technet.microsoft.com/zh-tw/library/ms175527(v=sql.105).aspx

tempdb 的容量計畫
http://msdn.microsoft.com/zh-tw/library/ms345368(v=sql.105).aspx

--
新手學SQL Server 2012「SQL視窗函數(SQL Windows Function)」(1)
http://sharedderrick.blogspot.tw/2013/01/sql-server-2012sqlsql-windows-function1.html

新手學SQL Server 2012「SQL視窗函數(SQL Windows Function)」(2),以CUME_DIST、PERCENT_RANK、PERCENTILE_CONT和PERCENTILE_DISC視窗統計分佈函數為例
http://sharedderrick.blogspot.tw/2013/01/sql-server-2012sqlsql-windows.html


新手學SQL Server 2012「SQL視窗函數(SQL Windows Function)」(3),以FIRST_VALUE()和LAST_VALUE()視窗相對位移函數為例
http://sharedderrick.blogspot.tw/2013/02/sql-server-2012sqlsql-windows.html

2012-10-09

SQL Server sa 帳戶:不能刪除(DROP)、不能拒絕(DENY)、可以停用(DISABLE)、可以改名(RENAME)


適用版本:SQL Server 2005、2008、2008 R2、2012。

示範環境:SQL Server 2012。

SQL Server sa 帳戶,具備以下的特性:

(1) 不能刪除(DROP)。
(2) 不能拒絕(DENY)。

(3) 可以停用(DISABLE)。
(4) 可以改名(RENAME)。



(1) 不能刪除(DROP)

錯誤訊息:

訊息 15405,層級 16,狀態 1,行 3
無法使用特殊主體 'sa'。
--
訊息 15405,層級 16,狀態 1,行 1
Cannot use the special principal 'sa'.
--
無法使用特殊主體 'sa'。 (Microsoft SQL Server, 錯誤: 15405)


-- 01_不能刪除(DROP)



-- 02_不能刪除(DROP)





(2) 不能拒絕(DENY)

錯誤訊息:

無法授與、拒絕或撤銷 sa、dbo、實體擁有者、information_schema、sys 或自己的權限。
--
Cannot grant, deny, or revoke permissions to sa, dbo, entity owner, information_schema, sys, or yourself.



-- 03_不能拒絕(DENY)



-- 04_不能拒絕(DENY)





(3) 可以停用(DISABLE)

-- 05_可以停用(DISABLE)



-- 06_可以停用(DISABLE)



-- 07_已經停用(DISABLE)






(4) 可以改名(RENAME)

-- 08_可以改名(RENAME)



-- 09_可以改名(RENAME)






認識 sa (System Administrator) 帳戶

sa 帳戶是隸屬於 sysadmin 固定伺服器層級角色內。

系統管理員 (sysadmin) 固定伺服器角色的成員可以在伺服器中執行所有活動。

SQL Server sa 登入為伺服器層級的主體。
根據預設,安裝執行個體時會建立它。

從 SQL Server 2005 開始,sa 的預設資料庫是 master。這是和舊版 SQL Server 不同的一項行為變更。

如果您在安裝期間選取混合模式驗證,就必須為名為 sa 的內建 SQL Server 系統管理員帳戶提供並確認增強式密碼。
sa 帳戶會使用 SQL Server 驗證進行連接。

如果您在安裝期間選取 Windows 驗證,安裝程式就會針對 SQL Server 驗證建立 sa 帳戶,但是此帳戶是停用的。

如果您之後變更為混合模式驗證,而且想要使用 sa 帳戶,就必須啟用此帳戶。
任何 Windows 或 SQL Server 帳戶都可以設定為系統管理員。

由於 sa 帳戶是已知的而且經常成為惡意使用者的攻擊目標,因此除非您的應用程式需要 sa 帳戶,否則請勿啟用此帳戶。
請勿針對 sa 帳戶設定弱式或空白密碼,請確認使用增強式密碼。




參考資料:

伺服器層級角色
http://msdn.microsoft.com/zh-tw/library/ms188659.aspx

主體 (Database Engine)
http://msdn.microsoft.com/zh-tw/library/ms181127.aspx

選擇驗證模式
http://msdn.microsoft.com/zh-tw/library/ms144284.aspx

2012-08-21

SSMS 建立包含 FILESTREAM 的資料庫


使用 SSMS 管理工具,建立包含 FILESTREAM 的資料庫。

示範環境:
SQL Server 2012

適用環境:
SQL Server 2008、2008 R2、2012



請參考以下的實作步驟:

步驟01. 使用SSMS管理工具,建立新的資料庫。

若是直接在在「檔案類型」區域,選擇「FILESTREAM 資料」,可以觀察到在「檔案群組」區域,顯示「無 FILESTREAM 檔案群組」。

-- 01_建立新的資料庫,在「檔案類型」區域,選擇「FILESTREAM 資料」



步驟02. 點選「檔案群組」頁籤,在「FILESTREAM」區域,點選「加入」。

在「名稱」區域,輸入名稱,例如:MediaFS。

-- 02_在「FILESTREAM」區域,點選「加入」



步驟03. 再度點選「一般」頁籤,設定以下的參數:

點選「加入」,在「檔案類型」區域,選擇:「FILESTREAM 資料」。
在「檔案群組」區域,選擇先前建立的名稱,例如:MediaFS。

-- 03_選擇「FILESTREAM 資料」的檔案群組



步驟04. 點選「確定」,建立此資料庫。

-- 04_檢視已經建立好的「FILESTREAM 資料」檔案群組



-- 05_檢視檔案群組的相關資料



-- 06_檢視作業系統的檔案結構



檢視產生的範例程式碼:


CREATE DATABASE [Media] ON  PRIMARY 
( NAME = N'Media', FILENAME = N'C:\myAdmin\DB\Media.mdf' , SIZE = 3072KB , FILEGROWTH = 1024KB ), 
 FILEGROUP [FS01] CONTAINS FILESTREAM 
( NAME = N'MediaFS01', FILENAME = N'C:\myAdmin\DB\MediaFS01' )
 LOG ON 
( NAME = N'Media_log', FILENAME = N'C:\myAdmin\DB\Media_log.ldf' , SIZE = 1024KB , FILEGROWTH = 10%)
GO




以下是使用 SQL Server 2008 R2 英文版本的截圖畫面:

-- 01_建立新的資料庫



-- 02_在「File Type」區域,直接選擇「Filestream Data」



-- 03_點選「Filegroups」頁籤,在「Filestream」區域,點選「Add」



-- 04_回到「General」頁籤,點選「Add」,設定「File Type」為:Filestream Data



-- 05_檢視產生的範例程式碼



-- 06_檢視所建立的資料庫



-- 07_檢視作業系統的檔案結構






參考資料

附加(attach)包含 FILESTREAM 的資料庫,以 AdventureWorks2008 範例資料庫為例
http://sharedderrick.blogspot.tw/2009/10/attach-filestream-adventureworks2008.html

啟用 Enable FILESTREAM ,下載安裝 AdventureWorks2008 範例資料庫(Installing Sample Databases)
http://sharedderrick.blogspot.com/2009/06/enable-filestream-adventureworks2008.html