You are on page 1of 22

Microsoft

Microsoft SQL
SQL Server
Server
使用經驗分享與交流
使用經驗分享與交流
By Richard
2007/03/26
Table of Contents
• SQL Server 操作
– 如何替 Database 瘦身
– Enterprise Manager vs. Query Analyzer
– CSV 到 SQL Server table
– SQL Server = Task Manager?
• SQL Server Function
– 善用 SQL Server date function
– 這是不是 NULL? 數字 ? 日期 ?
– 百變金剛 ? 看我 72 變…
– Truncate table and Drop table
– Drop & create index
Table of Contents
• SQL & Store Procedure Tuning
– 如何建立 Store Procedure 的 script?
– 我的極速快感與永遠的痛 : Index
– 使用 For loop update 資料
– 借我放一下…
– Store Procedure = function?
• SQL 2005 data encrypt/decrypt
– 我的萬用鑰匙 (Key and Certificate)
– Data Encrypt & Decrypt
• 建立一個可以 rollback 前一天資料的 batch
SQL Server 操作
• 如何替 Database 瘦身 :
– DB 的 mdf 與 ldf
– DB 的復原模型
– 壓縮資料庫

• Enterprise Manager vs. Query Anal


yzer :
– 當 Enterprise Manager 與 Query Analy
zer 對同一個 table 做動作…
SQL Server 操作
• CSV 到 SQL Server table
– “,” 或 CSV 文字檔 , 可透過 Data import
/export 匯入 SQL Server DB.
– bcp

• SQL Server = Task Manager?


– SQL Server 的作業排程
SQL Server Function
• 善用 SQL Server date function
– int = DATEADD (datepart, number, date)
– int = DATEDIFF (datepart, startdate, en
ddate)
– int = DATEPART (datepart, date)
– int = DAY (date) = DATEPART(dd, date)
– int = MONTH (date) = DATEPART(mm, d
ate)
– int = YEAR (date) = DATEPART(yy, date)
– Datetime = GETDATE()
SQL Server Function
• 這是不是 NULL? 數字 ? 日期 ?
– ISNULL ( check_expression , replacem
ent_value )
• check_expression, replacement_value, 傳回
值需為同一個 data type.
– int = ISNUMERIC ( expression )
– int = ISDATE( expression )
• 1 : 有效日期
• 0 : 無效日期
SQL Server Function
• 百變金剛 ? 看我 72 變…
– CAST ( expression AS data_type )
– CONVERT ( data_type [ ( length ) ] , ex
pression [ , style ] )
• 特別要注意的是日期轉換判斷
• 各 datatype 間是否可以轉換
• Eg: CONVERT(varchar, create_dt, 112) = CO
NVERT(varchar, getdate(), 112)
– SUBSTRING(‘ABC’, 1, 2) = ‘AB’
SQL Server Function
• Truncate table and Drop table
– Truncate table:
• Table 仍存在 , 資料全刪除
– Drop table :
• Table 及資料全刪除
– 在執行前 , 應注意該 table 是否存在 .
– Eg: if exists (select * from dbo.sysobjects whe
re id = object_id(N'[dbo].[VIP_SOD]') and OB
JECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[VIP_SOD]
GO
SQL Server Function
• Drop & create index
– Drop index 前檢查該 index 是否存在
– Create index 前檢查該 index 是否已存在
– Eg: IF EXISTS (SELECT * FROM sysindexes WHERE id=OBJECT
_ID('dbo.CUS_PORTFOLIO') AND name='IX_CUS_PORTFOLIO')
BEGIN
DROP INDEX dbo.CUS_PORTFOLIO.IX_CUS_PORTFOLIO
END
– Eg: IF NOT EXISTS (SELECT * FROM sysindexes WHERE id=O
BJECT_ID('dbo.CUS_PORTFOLIO') AND name='IX_CUS_PORTFO
LIO')
BEGIN
CREATE UNIQUE NONCLUSTERED INDEX IX_CUS_PORTFO
LIO ON dbo.CUS_PORTFOLIO(CPF_ID)
END
SQL & Store Procedure Tuning
• 如何建立 Store Procedure 的 script?
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[DR
OP_TABLE]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[DROP_TABLE]
GO

CREATE PROCEDURE dbo.DROP_TABLE ( @tablename nvarchar(255) )


AS
BEGIN

XXXXXX … XXXXX
END

GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
SQL & Store Procedure Tuning
• 我的極速快感與永遠的痛 : Index
– 何時該 create index?
• 大量資料存取
– 何時該 drop index?
• 大量資料寫入
– index 要如何建 ?
• SELECT, UPDATE 的條件
• Eg: select * from users where user_id=‘abc’
create index ix_users on users(‘user_id’)
SQL & Store Procedure Tuning
• 使用 For loop update 資料
DECLARE @UTYPE_ID varchar(50);
DECLARE @USER_ID varchar(50);

DECLARE CURSOR_I CURSOR LOCAL


FOR SELECT UTYPE_ID, USER_ID FROM USERS

OPEN CURSOR_I

WHILE 1 = 1 BEGIN
FETCH NEXT FROM CURSOR_I INTO @UTYPE_ID, @USER_ID;

if @@fetch_status <> 0
break

IF @UTYPE_ID = 'AO'
UPDATE USERS SET AO_TYPE='RM' WHERE USER_ID=@USER_ID

END; -- END OF WHILE

CLOSE CURSOR_I
SQL & Store Procedure Tuning
• 借我放一下…
DECLARE @UTYPE_ID varchar(50);
DECLARE @USER_ID varchar(50);
SELECT * INTO USERS_TMP FROM USERS ( 要檢查 USERS_TMP 是否存在 )
DECLARE CURSOR_I CURSOR LOCAL
FOR SELECT UTYPE_ID, USER_ID FROM USERS_TMP

OPEN CURSOR_I

WHILE 1 = 1 BEGIN
FETCH NEXT FROM CURSOR_I INTO @UTYPE_ID, @USER_ID;

if @@fetch_status <> 0
break

IF @UTYPE_ID = 'AO'
UPDATE USERS SET AO_TYPE='RM' WHERE USER_ID=@USER_ID

END; -- END OF WHILE


CLOSE CURSOR_I
DROP TABLE USERS_TMP
SQL & Store Procedure Tuning
• Store Procedure = function?
• 無傳回值之 Store Procedure
SQL & Store Procedure Tuning
• 有傳回值之 Store Procedure
SQL 2005 data encrypt/decrypt
• 我的萬用鑰匙 (Key and Certificate)
USE rmadmin;

-- Create Database Master Key


CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'RMW1234'

-- Create Certificate by Master Key


CREATE CERTIFICATE RMWCert
WITH SUBJECT = 'RM Workstation Certificate',
START_DATE = '01/01/2006',
EXPIRY_DATE = '12/31/9999'

-- Create Certificate by Password


CREATE CERTIFICATE RMWCert
ENCRYPTION BY PASSWORD = 'RMW1234'
WITH SUBJECT = 'RM Workstation Certificate',
START_DATE = '01/01/2006',
EXPIRY_DATE = '12/31/9999'

-- Create Symmetric Key encrypt by Certificate with 3DES


CREATE SYMMETRIC KEY RMWKey WITH ALGORITHM = Triple_DES
ENCRYPTION BY CERTIFICATE RMWCert
SQL 2005 data encrypt/decrypt
• Data Encrypt & Decrypt
-- 1. Open Key
OPEN SYMMETRIC KEY RMWKey DECRYPTION BY CERTIFICATE RMWCert
-- 1. Open Key with password
OPEN SYMMETRIC KEY RMWKey DECRYPTION BY CERTIFICATE RMWCert WITH PASSWORD
= 'RMW1234'

-- 2. Using key for encrypt


ALTER TABLE dbo.CUSTOMER ADD ENC_CNAME varbinary(128)
UPDATE CUSTOMER SET ENC_CNAME=EncryptByKey(Key_GUID('RMWKey'), CNAME)

-- 3. Using key for decrypt


select top 10 CONVERT(VARCHAR, DecryptByKey(ENC_CNAME)) FROM CUSTOMER

-- 4. Using key for decrypt without open key first


select top 10 CONVERT(varchar, DecryptByKeyAutoCert(cert_ID('RMWCert'), null, ENC_CNAM
E)) FROM CUSTOMER

-- 5. Using a user defined function to decrypt


select top 10 dbo.decrypt(ENC_CNAME) from customer
SQL 2005 data encrypt/decrypt
USE rmadmin;
GO
IF OBJECT_ID (N'dbo.decrypt', N'FN') IS NOT NULL
DROP FUNCTION dbo.decrypt;
GO
CREATE FUNCTION dbo.decrypt (@enc_content varbinary(128))
RETURNS varchar
WITH EXECUTE AS CALLER
AS
BEGIN
DECLARE @dec_content varchar

USE rmadmin
OPEN SYMMETRIC KEY RMWKey DECRYPTION BY CERTIFICATE RMWCert WITH PASS
WORD = 'RMW1234'

SET @dec_content = CONVERT(varchar, decryptbykey(@enc_content))

RETURN(@dec_content)
END;
GO
建立一個可以 rollback 前一天資料
的 batch
• 將相關 batch 影響的 tables, copy 一份變成 xx
x_batch 之 tables.
• 將 download import, 針對 xxx_batch 之 tables
做 batch.
• 如果 batch 執行成功 : 將原非 xxx_batch 之 ta
bles 備份成 xxx_lastday, 將 xxx_batch 改名
成原 xxx tables.
• 如果 batch 執行失敗 : 不做任何動作 .
• 如果 batch 執行成功 , 但 data failure: 則可將 x
xx_lastday 之 tables, 還原成原 xxx 之 tables.
建立一個可以 rollback 前一天資料
的 batch
Batch Start
copy

XXX tables XXX_batch

Do batch with X fail


XX_batch Fail End

backup succeed

XXX tables XXX_yesterday

copy

XXX_batch XXX tables

Yes
Data Succeed End
correct?

recover No

XXX_yesterday XXX tables


Q&A

You might also like