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

2014年6月18日 星期三

Always On Availability Groups learning resources (Always On Availability Groups學習資源與文件)

Always On Availability Groups learning resources
Always On Availability Groups學習資源與文件
from my MSDN blog - June 18, 2014

Overview of Always On Availability Groups (SQL Server)
http://msdn.microsoft.com/en-us/library/ff877884.aspx
Prerequisites, Restrictions, and Recommendations for Always On Availability Groups (SQL Server)
http://msdn.microsoft.com/en-us/library/ff878487.aspx

SQL Always On Team Blog
http://blogs.msdn.com/b/sqlalwayson/
SQL Server Customer Advisory Team
http://blogs.msdn.com/b/sqlcat/

MSDN Blogs  >  Brad Chen's SQL Server Blog   >  All Tags  >  alwayson
http://blogs.msdn.com/b/bradchen/archive/tags/alwayson/

Always On Architecture Guide: Building a High Availability and Disaster Recovery Solution by Using Failover Cluster Instances and Availability Groups
http://msdn.microsoft.com/en-us/library/jj215886.aspx
[Building a High Availability and Disaster Recovery Solution using AlwaysOn Availability Groups.docx]

SQL Server 2012 AlwaysOn: Multisite Failover Cluster Instance
http://msdn.microsoft.com/en-us/library/hh750283.aspx
[SQLServer2012_MultisiteFailoverCluster.docx]

SQL Server High Availability and Disaster Recovery for SAP Deployment at QR: A Technical Case Study
http://download.microsoft.com/download/d/9/4/d948f981-926e-40fa-a026-5bfcf076d9b9/SQLServer_HADR_QR.docx

2009年9月24日 星期四

T-SQL WHILE Loop and CAST

-- DEMO WHILE Loop and CAST
DECLARE @ip1 varchar(15), @ip1start int
SET @ip1 = '10.3.21.'
SET @ip1start = 131

WHILE (@ip1start<255)
BEGIN
--PRINT 'test'
PRINT @ip1 + CAST(@ip1start as varchar(3))

SET @ip1start = @ip1start + 1
END

GO

2009年9月11日 星期五

SQL Server Linked Server To Oracle

SQL Server Linked Server To Oracle

1.Install Oracle 10g Release 2 Client
and Oracle 10g Release 2 ODAC 10.2.0.2.21
on the server that is running Microsoft SQL Server

2.Create an alias name on the server
that is running SQL Server that points to an Oracle database instance.
(tnsname.ora)

3.Enable Allow inprocess on Oracle Provider for OLE DB
SQL Server Instance
->Server Objects -> Linked Servers
->Providers->OraOLEDB.Oracle->Properties
checked Allow inprocess

4.Execute sp_addlinkedserver to create the linked server,
specifying OraOLEDB.Oracle as provider_name,
and the alias for the Oracle database as data_source.
The following example assumes that the alias has been defined as DQORA8:
exec sp_addlinkedserver @server='OrclDB',
@srvproduct='Oracle',
@provider='OraOLEDB.Oracle',
@datasrc='DQORA8'

5.Use sp_addlinkedsrvlogin to create login mappings
from SQL Server logins to Oracle logins.

EXEC sp_addlinkedsrvlogin @rmtsrvname = 'OrclDB',
@useself = 'false',
@locallogin = 'Joe',
@rmtuser = 'OrclUsr',
@rmtpassword = 'OrclPwd'

6.若要寫入資料則要而外設定RPC,RPC OUT
USE master;
EXEC sp_serveroption 'OrclDB', 'rpc out', 'True';

7.限制
Table Name 使用大寫或小寫
每個欄位值都必須提供無論是否可NULL或有預設值
日期型別需使用變數來寫入

例如:
DECLARE @v1 datetime SET @v1 = CONVERT(datetime,'14-sep-94')
EXEC('INSERT INTO
DYNORCL.SALES(ID, ORD_NO, ORD_DATE, QTY)
VALUES (?, ?, ?, ?)', '6380', '6871', @v1, 5) AT OrclDB

一些舊版的Oracle Provider可能不支援AVG()函數(Oracle 10g已直接支援AVG),
若發生錯誤可使用OPENQUERY來達成同樣效果
例如:
SELECT AVG(QTY) FROM ORA..RPUBS.SALES;
發生錯誤則改用
SELECT * FROM OPENQUERY
(
ORA
,'SELECT CAST (AVG(QTY) AS numeric) FROM ORA..RPUBS.SALES'
);


[Reference]
SQL Server 2008 Books Online (August 2009)
Oracle Provider for OLE DB
http://msdn.microsoft.com/en-us/library/ms190618.aspx

2009年8月28日 星期五

SQL Server 設定 2008 Windows 服務帳戶

SQL Server 2008 線上叢書 (2008 年 5 月)
設定 Windows 服務帳戶

http://technet.microsoft.com/zh-tw/library/ms143504.aspx

2009年8月9日 星期日

整合資料加密到資料庫安全設計Data Encryption

[實作快速摘要]
Step1.確認與建立資料庫主要金鑰(Database Master Key)
Step2.建立Certificate準備來加密Symmetric Key
Step3.建立Symmetric Key時使用Certificate來加密
Step4.資料表加入一個加密欄位,加密欄位型別Data Type建議設定為varbinary
Step5.資料寫入時,使用Symmetric Key來加密欄位
PS.詳細Code請看後面的[combine Certificate and Symmetric Key]

[SQL Server 2005的資料加密技術]
1.對稱式金鑰 Symmetric Key
只用一把Key,相對於Asymmetric Key與Certificate較有效率,
但Asymmetric Key與Certificate加密安全性較高
例如Service Master Key與Database Master Key皆為Symmetric Key,

SELECT * FROM master.sys.symmetric_keys
SELECT * FROM sys.symmetric_keys

[寫入]
OPEN SYMMETRIC KEY KeyName DECRYPTION BY PASSWORD = 'Password'
EncryptByKey(Key_GUID('symKey_Name'), 'Insert_Value')
CLOSE SYMMETRIC KEY KeyName

[讀取]
OPEN SYMMETRIC KEY KeyName DECRYPTION BY PASSWORD = 'Password'
DecryptByKey([ColumnName])
CLOSE SYMMETRIC KEY KeyName

2.非對稱式金鑰 Asymmetric Key

SELECT * FROM sys.ssymmetric_keys

[寫入]
EncryptByAsymKey( AsymKey_ID('asymKey_Name'),'Insert_Value')

[讀取]
DecryptByAsymKey( AsymKey_ID('asymKey_Name'), [ColumnName], N'asymKey_Password')

3.憑證 Certificate

[寫入]
EncryptByCert( Cert_ID('Cert_Name'), 'Insert_Value' )
[讀取]
DecryptByCert( Cert_ID('Cert_Name'),[ColumnName], N'Cert_Password')


-- ====== [Service Master Key 與 Database Master Key] ==============
SELECT * FROM master.sys.symmetric_keys
GO

-- Backup Service Master Key
USE Master
GO
BACKUP SERVICE MASTER KEY
TO FILE='C:\Backup\SQL2K5.smk'
ENCRYPTION BY PASSWORD='3dH85Hhk003GHk2597gheij4';
GO

-- Restore Service Master Key
RESTORE SERVICE MASTER KEY
FROM FILE='C:\Backup\SQL2K5.smk'
DECRYPTION BY PASSWORD='3dH85Hhk003GHk2597gheij4';
GO

-- Regenerate Service Master Key
--ALTER SERVICE MASTER KEY REGENERATE
--GO

-- Create Demo Database
CREATE DATABASE [EncryptionDB]

-- Database Master Key
USE [EncryptionDB]
GO
CREATE MASTER KEY
ENCRYPTION BY PASSWORD='23987hxJ#KL95234nl0zBe';
GO

SELECT [name] N'資料庫'
, [is_master_key_encrypted_by_server] N'已使用主要金鑰加密的資料庫'
FROM master.sys.databases;
GO

SELECT * FROM sys.symmetric_keys;
GO

-- ALTER MASTER KEY
--ALTER MASTER KEY
-- REGENERATE WITH ENCRYPTION BY PASSWORD = '23987hxJ#KL95234nl0zBe';
--GO

-- Backup Database MASTER KEY
BACKUP MASTER KEY
TO FILE = 'C:\Backup\EncryptionDB_MasterKey.dmk'
ENCRYPTION BY PASSWORD = '23987hxJ#KL95234nl0zBe';
GO

-- Restore Database Master Key
RESTORE MASTER KEY
FROM FILE = 'C:\Backup\EncryptionDB_MasterKey.dmk'
DECRYPTION BY PASSWORD = '23987hxJ#KL95234nl0zBe';
GO


-- ====== [Symmetric Key] ==============
USE [EncryptionDB]
GO
-- Create test table
CREATE TABLE dbo.tSYMMETRIC
(CustomerID int NOT NULL PRIMARY KEY,
PasswordHintQuestion nvarchar(300) NOT NULL,
PasswordHintAnswer varbinary(8000) NOT NULL)
GO

-- CREATE SYMMETRIC KEY
CREATE SYMMETRIC KEY sym01
WITH ALGORITHM = AES_256
ENCRYPTION BY PASSWORD = '25ho878!45fR6HG%B3f';

--
SELECT * FROM sys.symmetric_keys

-- Encryption Data With EncryptByKey()
OPEN SYMMETRIC KEY sym01
DECRYPTION BY PASSWORD = '25ho878!45fR6HG%B3f';

INSERT dbo.tSYMMETRIC (CustomerID
,PasswordHintQuestion
,PasswordHintAnswer)
VALUES (1
, N'大人小朋友的可玩的'
, EncryptByKey(Key_GUID('sym01 '), 'Wii')
)

CLOSE SYMMETRIC KEY sym01;

-- Query
SELECT CustomerID
,PasswordHintQuestion
,CAST(DecryptByKey(PasswordHintAnswer) as varchar(4000)) N'密碼提示的答案'
FROM dbo.[tSYMMETRIC]

-- Query With DecryptByKey()
OPEN SYMMETRIC KEY sym01
DECRYPTION BY PASSWORD = '25ho878!45fR6HG%B3f';

SELECT CustomerID
,PasswordHintQuestion
,CAST(DecryptByKey(PasswordHintAnswer) as varchar(4000)) N'密碼提示的答案'
FROM dbo.[tSYMMETRIC]

CLOSE SYMMETRIC KEY sym01

-- DELETE SYMMETRIC KEY
DROP SYMMETRIC KEY sym01;


-- ====== [Asymmetric Key] ==============

-- Create TEST Table dbo.tASY
CREATE TABLE dbo.[tASY]
(
[EmployeeID] int NOT NULL PRIMARY KEY,
[mSalary] varbinary(8000) NOT NULL
)
GO

-- CREATE ASYMMETRIC KEY
CREATE ASYMMETRIC KEY asym01
WITH ALGORITHM = RSA_512
ENCRYPTION BY PASSWORD = 'bmsA$dk7i82bv55foajsd9764';
GO

--
SELECT [name] N'金鑰的名稱'
,[pvt_key_encryption_type_desc] N'私密金鑰加密方式'
,[algorithm_desc] N'金鑰使用的演算法'
FROM sys.[asymmetric_keys]

--EX1. EncryptByAsmKey()
INSERT dbo.[tASY]
VALUES (1
,EncryptByAsymKey(AsymKey_ID('asym01'),'999999')
)

--
SELECT * FROM dbo.[tASY]

--
SELECT [EmployeeID]
,CAST([mSalary] AS varchar(2000)) N'薪資'
FROM dbo.[tASY]

--EX2. DecryptByAsymKey()
SELECT [EmployeeID]
,CAST(
DecryptByAsymKey(
AsymKey_ID('asym01'), mSalary, N'bmsA$dk7i82bv55foajsd9764'
) as varchar(100)
) N'薪資'
FROM dbo.[tASY]

-- ====== [Certificate] ==============

-- 建立資料表 dbo.tCert
CREATE TABLE dbo.[tCert]
(
[uids] int NOT NULL PRIMARY KEY,
[cardid] varbinary(8000) NOT NULL
)
GO

-- CREATE CERTIFICATE
CREATE CERTIFICATE cs01
ENCRYPTION BY PASSWORD = 'pGFD4bb925DGvbd2439587y'
WITH SUBJECT = 'Wii issue',
START_DATE = '2009/08/08',
EXPIRY_DATE= '2009/12/31'
GO

--
SELECT [name] N'憑證名稱'
,[pvt_key_encryption_type_desc] N'私密金鑰加密方式'
,issuer_name N'憑證發行者'
,[start_date] N'憑證生效時間'
,[expiry_date] N'憑證逾期時間'
FROM sys.[certificates]

--EX1.
-- EncryptByCert()
INSERT dbo.tCert
VALUES (1
,EncryptByCert(Cert_ID('cs01'), '55553635401028')
)

--
SELECT * FROM dbo.tCert

--
SELECT [uids]
,CAST([cardid] AS varchar(2000)) N'卡號'
FROM dbo.tCert

-- DecryptByCert()
SELECT [uids]
,CAST(
DecryptByCert(
Cert_ID('cs01'),[cardid], N'pGFD4bb925DGvbd2439587y'
) as varchar(1000)
) N'卡號'
FROM dbo.[tCert]


-----------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------
--EX2. Backup Certificate
BACKUP CERTIFICATE cs01
TO FILE = 'C:\Backup\SQLServer\cs01.cer'
WITH PRIVATE KEY ( DECRYPTION BY PASSWORD = 'pGFD4bb925DGvbd2439587y' ,
FILE = 'C:\Backup\SQLServer\cs01PK.pvk' ,
ENCRYPTION BY PASSWORD = 'zxxn34khUbhk$w4ecJH5gh' );
GO

-- 刪除 CERTIFICATE
DROP CERTIFICATE cs01

--
SELECT [uids]
,CAST(
DecryptByCert(
Cert_ID('cs01'),[cardid], N'pGFD4bb925DGvbd2439587y'
) as varchar(1000)
) N'卡號'
FROM dbo.[tCert]


--
SELECT [name] N'憑證名稱'
,[pvt_key_encryption_type_desc] N'私密金鑰加密方式'
,[issuer_name] N'憑證發行者'
,[start_date] N'憑證生效時間'
,[expiry_date] N'憑證逾期時間'
FROM sys.[certificates];

-- Restore Certificate
CREATE CERTIFICATE cs01
FROM FILE = 'C:\Backup\SQLServer\cs01.cer'
WITH PRIVATE KEY (FILE = 'C:\Backup\SQLServer\cs01PK.pvk',
DECRYPTION BY PASSWORD = 'zxxn34khUbhk$w4ecJH5gh',
ENCRYPTION BY PASSWORD ='pGFD4bb925DGvbd2439587y');
GO

--
SELECT [uids]
,CAST(
DecryptByCert(
Cert_ID('cs01'),[cardid], N'pGFD4bb925DGvbd2439587y'
) as varchar(1000)
) N'卡號'
FROM dbo.[tCert];


-- ====== [combine Certificate and Symmetric Key] ==============

CREATE TABLE dbo.EmployeeReview
(EmployeeID int NOT NULL,
ReviewDate datetime DEFAULT GETDATE() NOT NULL,
Comments varbinary(8000) NOT NULL)
GO

--02 建立 CERTIFICATE
CREATE CERTIFICATE cs02
WITH SUBJECT = 'PS3 issue',
START_DATE = '2009/08/08',
EXPIRY_DATE= '2009/12/31'
GO

--03 建立 SYMMETRIC KEY
CREATE SYMMETRIC KEY sym03
WITH ALGORITHM = TRIPLE_DES
ENCRYPTION BY CERTIFICATE cs02 -- 利用 cs02 憑證來保護 sym03 對稱金鑰
GO

--
SELECT * FROM sys.symmetric_keys
WHERE [NAME] <> '##MS_DatabaseMasterKey##'
--
SELECT [name] N'憑證名稱'
,[pvt_key_encryption_type_desc] N'私密金鑰加密方式'
,[issuer_name] N'憑證發行者'
,[start_date] N'憑證生效時間'
,[expiry_date] N'憑證逾期時間'
FROM sys.certificates

--04 EncryptByKey()
OPEN SYMMETRIC KEY sym03
DECRYPTION BY CERTIFICATE cs02

INSERT INTO dbo.EmployeeReview
VALUES (1
,DEFAULT
,EncryptByKey(Key_GUID('sym03'),N'加薪到 $99,000')
);

CLOSE ALL SYMMETRIC KEYS

--
SELECT * FROM dbo.EmployeeReview

--
SELECT
EmployeeID
,ReviewDate
,CONVERT(varchar,Comments) AS Comments
FROM dbo.EmployeeReview;

--05 DecryptByKey()
OPEN SYMMETRIC KEY sym03
DECRYPTION BY CERTIFICATE cs02

SELECT
EmployeeID
,ReviewDate
,CONVERT(nvarchar,DecryptByKey(Comments)) AS Comments
FROM dbo.EmployeeReview

CLOSE ALL SYMMETRIC KEYS

--
USE master
GO
DROP DATABASE EncryptionDB
GO

2009年7月23日 星期四

SQL Server資料庫維護與備份設定

SQL Server資料庫維護與備份設定
建議使用SQL Server內建的維護計畫,可快速設定最基本的SQL Server維護作業
建議建立2個維護計畫,如下說明:

1.系統資料庫(master,msdb,model)
最少每星期完整備份1次
備份前作資料庫完整性檢查

PS.若做了以下動作則建議手動備份一次master
(1)對Instance層級作了組態調整設定
(2)新增個一個資料庫
(3)新增了連線Login帳戶
PS.若在SQL Agent新增一個排程工作,則建議手動備份一次msdb

2.使用者資料庫(應用系統所使用的資料庫)
備份方式與排程時間需視資料庫大小,資料庫性質而定
以中大型大小的線上交易系統資料庫為例可考慮以下列方式執行:
(1)每個星期日完整備份,備份前先做資料庫完整性檢查,再作索引重建,最後才做完整備份。
(2)星期一到星期六可排差異備份,效能不好時可以考慮差異備份前也作索引重建。
(3)每天2到3次的交易紀錄檔備份,例如08:00,13:00,18:00,若要減少資料遺失時間,可以每個小時執行1次,再短一點的話可以縮到每 15 到 30 分鐘進行一次交易記錄檔備份可能就足夠了。

2009年7月7日 星期二

使用統計資料來改善查詢效能-節錄SQL Server 2008 線上叢書-Technet Library

使用統計資料來改善查詢效能
http://technet.microsoft.com/zh-tw/library/ms190397.aspx

在下列狀況中,請考慮更新統計資料:

(1)查詢執行時間很慢
如果查詢回應時間很慢或無法預測,請先確定查詢具有最新的統計資料,然後再執行其他疑難排解步驟。如需有關疑難排解查詢執行緩慢的詳細資訊,請參閱<分析執行緩慢之查詢的檢查清單>。

(2)插入作業針對遞增或遞減索引鍵資料行進行
遞增或遞減索引鍵資料行 (例如 IDENTITY 或即時時間戳記資料行) 之統計資料所需的統計資料更新頻率可能會比查詢最佳化工具所執行的更新頻率更高。插入作業會將新的值附加至遞增或遞減資料行。所加入的資料列數目可能會太小,而無法觸發統計資料更新。如果統計資料不是最新的,而且查詢會從最近加入的資料列中選取,則目前的統計資料將不會具有這些新值的基數估計值。這可能會導致基數估計值不精確以及查詢效能緩慢。

例如,如果統計資料沒有更新成包含最新銷售訂單日期的基數估計值,則從最新銷售訂單日期中選取的查詢就會具有不精確的基數估計值。

(3)在維護作業之後
在執行變更資料分佈的維護程序 (例如截斷資料表或針對大部分的資料列執行大量插入) 之後,請考慮更新統計資料。這樣做可在查詢等候自動統計資料更新時,避免未來查詢處理產生延遲。

重建、重組或重新組織索引等作業都不會變更資料的分佈。因此,在執行 ALTER INDEX REBUILD、DBCC REINDEX、DBCC INDEXDEFRAG 或 ALTER INDEX REORGANIZE 作業之後,您不需要更新統計資料。當您使用 ALTER INDEX REBUILD 或 DBCC DBREINDEX 來重建資料表或檢視表的索引時,查詢最佳化工具就會更新統計資料。不過,這種統計資料更新是重新建立索引的副產品。在 DBCC INDEXDEFRAG 或 ALTER INDEX REORGANIZE 作業之後,查詢最佳化工具則不會更新統計資料。

[Action]
-- 更新資料庫的所有統計資料
EXEC sp_updatestats
--若要判斷上次更新統計資料的時間,請使用 STATS_DATE 函數。
--http://technet.microsoft.com/zh-tw/library/ms173804.aspx


--針對 SalesOrderDetail 資料表的所有索引更新統計資料。
--複製程式碼
USE AdventureWorks;
GO
UPDATE STATISTICS Sales.SalesOrderDetail;
GO
http://technet.microsoft.com/zh-tw/library/ms187348.aspx

2009年6月30日 星期二

SQL Server Memory pool(Buffer Pool) - Procedure Cache and Data Cache

-- SQL Server 7.0之前(SQL Server 6.5),Data Cache與Procedure Cache有獨立控制的memory pool
-- SQL Server 7.0與SQL Server 2000則是共用一個memory pool
--
-- 此memory pool即Buffer pool
-- The buffer pool is managed by a process called the lazywriter

--01.Procedure cache (execution plan cache)

select * from master.dbo.syscacheobjects

--DBCC PROCCACHE
--GO

--Free Porcedure Cache
-- Method 1: Free Porcedure Cache by database
--SELECT DB_ID('pubs')
--DBCC FLUSHPROCINDB (5)
--GO
--
-- Method 2 -Free All Porcedure Cache
-- DBCC FREEPROCCACHE
-- GO




-- 02.Data Buffer Cache
-- Get TOP 20 objects in the data cache
-- BUG: DBCC MEMUSAGE Is Not Supported in SQL Server 7.0
--The DBCC MEMUSAGE statement is not supported in SQL Server 7.0. Executing it on servers running heavy loads with large databases may cause the server to stop responding.
-- http://support.microsoft.com/default.aspx?scid=kb;en-us;196629

DBCC MEMUSAGE

-- Free Buffer Cache
-- DBCC DROPCLEANBUFFERS

-- Force all dirty pages to be written to disk
--CHECKPOINT
--GO



-- 03.Other Useful Command - DBCC MEMORYSTATUS
USE master
GO
DBCC MEMORYSTATUS
GO

-- 04.Other Useful Command - DBCC PINTABLE (@db_id,@object_id)
-- 微軟不建議使用以下功能,但仍然可以使用,建議在測試環境才使用
-- keep a table's data pages in memory
-- demo Database named pubs
USE pubs
GO
select DB_ID('pubs')
GO
-- return 5
select OBJECT_ID('dbo.jobs')
GO
-- return 277576027
DBCC PINTABLE (5,277576027)
GO

-- release a pinned table's data pages from memory.
USE pubs
GO
select DB_ID('pubs')
GO
-- return 5
select OBJECT_ID('dbo.jobs')
GO
-- return 277576027
DBCC UNPINTABLE (5,277576027)
GO

[reference]
Analyzing SQL Server 2000 Data Caching
How to Interact with SQL Server's Data and Procedure Cache

2009年6月20日 星期六

跨資料庫存取而不想在別的資料庫額外設定權限EXECUTE AS的用法

最近接到一個需求,需要跨資料庫存取,而不想在別的資料庫額外設定權限,
所以就開始了解一下EXECUTE AS的用法

[注意]執行以下Demo Code需要AdventureWorks資料庫

-- 建立測試資料庫TEST1
CREATE DATABASE [TEST1]
GO

-- 建立測試Login帳戶Brad
CREATE LOGIN [Brad]
WITH PASSWORD = N'P@ssw0rd',
CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF,
DEFAULT_DATABASE = [TEST1],
DEFAULT_LANGUAGE = [繁體中文]
GO

-- 建立TEST1對應的User帳戶brad
USE [TEST1]
GO
CREATE USER [Brad]
GO

-- 建立PROCEDURE With EXECUTE AS SELF讀取別的資料庫的資料
CREATE PROCEDURE [usp_GetAdvWorkEmployee]
WITH EXECUTE AS SELF
AS
SELECT SUSER_NAME(), USER_NAME(), COUNT(*)
FROM [AdventureWorks].[HumanResources].[Employee]
GO

-- 給予EXECUTE權限給Brad
GRANT EXECUTE ON [usp_GetAdvWorkEmployee] to [Brad]
GO

-- 從AdventureWork資料庫產生一些資料到TEST1資料庫
SELECT * INTO dbo.Employee FROM AdventureWorks.HumanResources.Employee;
GO

-- 建立一個Procedure JOIN外部資料庫的資料表
CREATE PROCEDURE [usp_EmployeeDetail]
WITH EXECUTE AS SELF
AS
SELECT a.EmployeeID, a.Title, b.AddressID ,b.ModifiedDate
FROM dbo.Employee a LEFT JOIN AdventureWorks.HumanResources.EmployeeAddress b
ON a.EmployeeID=b.EmployeeID
GO

-- 給予EXECUTE權限給Brad
GRANT EXECUTE ON [usp_EmployeeDetail] to [Brad]
GO

-- Create function with EXECUTE AS SELF
USE [TEST1]
GO
CREATE FUNCTION ufn_GetAdvWorkEmployee()
RETURNS @retTable TABLE
(
EmployeeID int,
Title nvarchar(50)
)
WITH EXECUTE AS SELF
AS
BEGIN
INSERT INTO @retTable SELECT EmployeeID,Title FROM [AdventureWorks].[HumanResources].[Employee]
RETURN
END;
GO

-- 給予SELECT權限給Brad
GRANT SELECT ON ufn_GetAdvWorkEmployee to [Brad]
GO

-- 此時使用brad登入到SQL Server執行以下2個Procedure仍會出現錯誤訊息
USE [TEST1]
GO
EXECUTE usp_GetAdvWorkEmployee;
GO
EXECUTE usp_EmployeeDetail;
GO
-- Msg 916, Level 14, State 1, Procedure usp_GetAdvWorkEmployee, Line 4
-- 伺服器主體 "sa" 在目前的安全性內容下無法存取資料庫 "AdventureWorks"。

-- 將測試資料庫的TRUSTWORTHY改為ON
USE MASTER
GO
ALTER DATABASE [TEST1] SET TRUSTWORTHY ON
GO

-- 此時使用brad登入到SQL Server執行以下2個Procedure就可以執行成功
USE [TEST1]
GO
EXECUTE usp_GetAdvWorkEmployee;
GO
EXECUTE usp_EmployeeDetail;
GO

-- 刪除資料庫
USE MASTER
GO
DROP DATABASE [TEST1]
GO
-- 刪除Login登入帳戶
DROP LOGIN [Brad]
GO

2009年6月18日 星期四

如何識別SQL Server的版本

-- SQL Server 2005
SELECT SERVERPROPERTY('productversion'), SERVERPROPERTY ('productlevel'), SERVERPROPERTY ('edition')

發行 Sqlservr.exe
RTM 2005.90.1399
SQL Server 2005 Service Pack 1 2005.90.2047
SQL Server 2005 Service Pack 2 2005.90.3042

-- SQL Server 2000
SELECT SERVERPROPERTY('productversion'), SERVERPROPERTY ('productlevel'), SERVERPROPERTY ('edition')

發行 Sqlservr.exe
RTM 2000.80.194.0
SQL Server 2000 SP1 2000.80.384.0
SQL Server 2000 SP2 2000.80.534.0
SQL Server 2000 SP3 2000.80.760.0
SQL Server 2000 SP3a 2000.80.760.0
SQL Server 2000 SP4 2000.8.00.2039

-- SQL Server 7.0
SELECT @@VERSION

版本編號 Service Pack
7.00.1063 SQL Server 7.0 Service Pack 4 (SP4)
7.00.961 SQL Server 7.0 Service Pack 3 (SP3)
7.00.842 SQL Server 7.0 Service Pack 2 (SP2)
7.00.699 SQL Server 7.0 Service Pack 1 (SP1)
7.00.623 SQL Server 7.0 RTM (製造階段版本,Release to Manufacturing)


[參考]
http://support.microsoft.com/kb/321185

2009年5月30日 星期六

SQL Server 2008 與SQL Server 2005 Sample Databases範例資料庫下載與安裝

SQL Server 2008 與SQL Server 2005 Sample Databases範例資料庫下載與安裝

 
SQL Server 2008安裝光碟已不再含有範例資料庫Sample Database,需自行到CodePlex網站的SQL Server Database Product Samples網頁下載
http://msftdbprodsamples.codeplex.com/

 
[SQL Server 2008]
 
 
 
 
[SQL Server 2005]
 
 
SQL Server 2008 Sample Database 安裝
Next
 
 
 
勾選同意
 
 
 
Next
 
 
 
選擇一個要安裝在哪一個本機SQL Server 2008 Instance
 
Read Carefully的Warning:有兩個功能必須是啟用的(FILESTREAM與Full-Text Search)
實際執行安裝完成後發現這兩個功能若沒有啟用仍可正常安裝,只是這兩個功能會被啟動起來
 
 
 
點擊Install開始安裝
 
 
 
PS.安裝過程中會另外出現一個sqlcmd畫面,表示需連進SQL Server 2008 Instance執行安裝的T-SQL,若安裝之前沒有把Instance啟動,在安裝的過程中安裝程式會自動將Instance啟動
 
 
 
Finish完成安裝

2009年5月27日 星期三

Use User-Defined Functon for default constraint使用Function產生自訂的自動編號欄位

開發人員需要每日Import大量資料,想改用SSIS產生package排程執行,但有一個流程目前是用EXCEL完成的,第一個欄位要自訂格式,年月加上流水號(例如200805000001),希望我在SSIS找到解決方案,當我聽到時第一個想法是透過T-SQL User-Defined Function與default contraint來完成這個需求,果然在google上找到類似的寫法,以下是我改寫後的demo code

--STEP1.Create test database
Use master
GO
CREATE DATABASE TESTDB
GO


--STEP2.Create T-SQL User-Defined Function
-- 在Code裡面已經指定要從這個資料表dbo.autoIDTable取得最大的流水號

USE TESTDB
GO
CREATE FUNCTION GetNewAutoID
(
-- Add the parameters for the function here
--@p1 char(4)
)
RETURNS char(12)
AS
BEGIN
-- Declare the return variable here
DECLARE @ResultVar Char(12)
Declare @MaxValue int
Set @MaxValue=0
Select @MaxValue=Cast(Right(autoid,6) as int) from dbo.autoIDTable
Set @MaxValue=@MaxValue +1
Set @ResultVar=LEFT(cast(convert(varchar , GETDATE(), 112) as varchar ),6) + Right(('00000'+Ltrim(str(@maxValue))),6)
-- Return the result of the function
RETURN @ResultVar
END
GO

--STEP3.Create dbo.autoIDTable Table use default constraint
Create table dbo.autoIDTable
(
autoid char(12) default dbo.GetNewAutoID(),
Data varchar(50)
);

-- STEP4.Try to select fucntion dbo.GetNewAutoID()
SELECT dbo.GetNewAutoID()

-- STEP5.Insert test data
insert into dbo.autoIDTable(Data) values('haha')
insert into dbo.autoIDTable(Data) values('wawa')
insert into dbo.autoIDTable(Data) values('gaga')

-- STEP6.select dbo.autoIDTable
select * from dbo.autoIDTable

-- STEP7.drop test database
USE master
GO
DROP DATABASE TESTDB
GO

2009年5月14日 星期四

如何防止資料表被意外刪除(Prevent table from accidental removing in SQL Server)

最近被問到一個問題,如何防止資料表被意外刪除
有兩種方式:
第一種是DBA的慣用的老技巧Create View With SchemaBinding
第二種是SQL Server 2005才開始有的DDL Trigger

[方法1] SchemaBinding
-- 新增demo資料庫
USE master
GO
CREATE DATABASE MyDB
GO

-- 新增一個測試客戶資料表
USE MyDB
GO
CREATE TABLE dbo.customer
(
cust_id int PRIMARY KEY,
cust_name varchar(20),
cust_telephone varchar(20)
);
GO

-- 新增一個使用SCHEMA BINDING的VIEW
CREATE VIEW dbo.vCustomer
WITH SCHEMABINDING
AS
SELECT [cust_id]
,[cust_name]
,[cust_telephone]
FROM [dbo].[customer]
GO

-- 無法移除資料表(因資料表已被vCustomer所referenced)
DROP TABLE customer
GO

-- 無法移除現有的欄位(已被vCustomer所referenced)
ALTER TABLE [dbo].[customer]
DROP COLUMN cust_telephone ;
GO

-- 可新增欄位
ALTER TABLE [dbo].[customer]
ADD cust_Address VARCHAR(20) ;
GO

-- 可移除未被vCustomer所referenced的欄位
ALTER TABLE [dbo].[customer]
DROP COLUMN cust_Address ;
GO

-- 移除demo資料庫
USE master
GO
DROP DATABASE MyDB
GO

[方法2] DDL Trigger
-- 新增demo資料庫
USE master
GO
CREATE DATABASE DEMO_DDL_TRIGGER
GO

-- 新增2個測試資料表
USE DEMO_DDL_TRIGGER
GO
CREATE TABLE dbo.customer
(
cust_id int PRIMARY KEY,
cust_name varchar(20),
cust_telephone varchar(20)
);
GO

CREATE TABLE dbo.orders
(
order_id int PRIMARY KEY,
product_name varchar(20)
);
GO

-- 新增一個Production Table的資料表
CREATE TABLE dbo.ProductionTable
(
prodtable_id int PRIMARY KEY,
table_name varchar(50)
);
GO

-- INSERT一筆customer
INSERT INTO dbo.ProductionTable
VALUES(1,'customer');
GO

SELECT * FROM dbo.ProductionTable;
GO

-- 新增一個DDL Trigger on Database level
CREATE TRIGGER [Tgr_ChkProductionTable]
ON DATABASE
FOR DROP_TABLE
AS
--PRINT 'You must disable DDL Trigger "[Tgr_ChkProductionTable]" to drop or alter tables!'
declare @tablename varchar(50)
SELECT @tablename = EVENTDATA().value
('(/EVENT_INSTANCE/ObjectName)[1]','nvarchar(max)')
IF EXISTS (SELECT prodtable_id FROM [ProductionTable] WHERE table_name=@tablename)
BEGIN
RAISERROR ('You must delete the record from ProductionTable or disable DDL Trigger "[Tgr_ChkProductionTable]" before you drop the table!',10, 1)
ROLLBACK
END
;
GO

-- 測試無法刪除資料表
DROP TABLE dbo.customer;
GO

-- 不在production_table資料表內有一筆紀錄則可被刪除
DROP TABLE dbo.orders;
GO

-- 移除DDL Trigger
DROP TRIGGER [Tgr_ChkProductionTable]
ON DATABASE
GO

-- 移除demo資料庫
USE master
GO
DROP DATABASE DEMO_DDL_TRIGGER
GO

2009年5月7日 星期四

交易記錄檔Transaction log大小的檢查清空與縮小

-- 檢查交易紀錄檔(Transaction log)的大小與使用量
DBCC SQLPERF(logspace)
GO

-- 查詢資料庫檔案與交易紀錄檔(Transaction log)檔的邏輯名稱
USE MyDB
GO
EXEC sp_helpfile
GO

-- 清空交易紀錄檔(Transaction log)
BACKUP LOG MyDB WITH TRUNCATE_ONLY
GO

-- 縮小交易紀錄檔(Transaction log)到200MB
USE MyDB
GO
DBCC SHRINKFILE ('MyDB_Log', 200)
GO

2009年4月16日 星期四

SQL Server 2005 Express 設定遠端連接

1.SQL Server Surface Area Configuration
點選[遠端連接]->選擇 [本機與遠端連接] ->子選項選擇[只使用TCP/IP]

















2.SQL Server Configuration Manager
指定一個固定TCP Port給SQL Server用


















3.檢查Windows防火牆是否開放剛剛設定的TCP Port

4.重新啟動SQL Server Database Engine服務

[參考]
KB914277-如何將 SQL Server 2005 設定為允許遠端連接

SQL Server 2005 Express Import /Export Wizard 匯入匯出精靈

最近被問到一個問題,
在SQL Server 2005 Express上開發系統,之後想將資料轉移到另一台SQL Server,
卻發現Microsoft SQL Server Management Studio Express沒有匯入匯出功能,
所以花了一點時間總算找到解法,方法是安裝
Microsoft SQL Server 2005 Express Edition Toolkit,
目前已經出到Microsoft SQL Server 2005 Express Edition Toolkit Service Pack 3,
請連到此處(微軟官網下載),

1.安裝


















2.安裝完成後,原本沒有的Microsoft Visual Studio 2005也安裝上去了,
可以開發Reporting Service報表專案(報表伺服器專案)





3.最重要的是這個目錄(DTS目錄),安裝完後才會產生此DTS目錄















4.進入Binn目錄就可以找到DTSWizard程式














5.執行後就會出現匯入匯出精靈了

資料治理實施

資料治理實施