SQL Server 2008 介面區組態(Surface Area Configuration,SAC):啟用 xp_cmdshell

http://sharedderrick.blogspot.tw/2009/04/sql-server-2008-surface-area.html

為了安全起見,預設在「介面區組態」內的功能,都已經停用。


xp_cmdshell (Transact-SQL)
繁衍 Windows 命令 Shell 並傳入字串中以供執行。任何輸出都會當作文字資料列來傳回。
xp_cmdshell 繁衍的 Windows 處理序擁有與 SQL Server 服務帳戶相同的安全性權限。
xp_cmdshell 會同步操作。完成 command-shell 命令時,才會將控制權傳回呼叫者。

若你確認需要啟用或是停用介面區組態上的功能,請參考以下的步驟:
使用 SQL Server Management Studio 中的「Facet」來設定啟用和停用 SQL Server 功能。
1. 使用 SQL Server Management Studio,連接到目標的 SQL Server。
2. 在 [物件總管] 中,點選目標伺服器,滑鼠右鍵,選擇「Facet」。 請參考下圖所示:
選取「Facet」01
3. 在「檢視 Facet」視窗,在右邊的「Facet」區域,選擇「介面區組態」。
4. 在右下角的「Facet屬性」區域,選擇所需要啟用或是停用的功能。
請參考下圖所示:
02_設定介面區組態

以下為使用 sp_configure 來啟用 xp_cmdshell:

--01 查詢是否已經啟用 xp_cmdshell
SELECT name N'組態選項的名稱', value N'針對這個選項所設定的值', value_in_use N'這個選項目前有效的執行值',
description N'組態選項的描述'
FROM sys.configurations
WHERE name='xp_cmdshell'

--02 設定啟用 xp_cmdshell
USE master;
GO
EXEC sp_configure 'show advanced option', '1';
GO
RECONFIGURE
GO
--
EXEC sp_configure 'xp_cmdshell', '1'
RECONFIGURE WITH OVERRIDE
GO

--03 再度查詢是否已經啟用 xp_cmdshell
SELECT name N'組態選項的名稱', value N'針對這個選項所設定的值', value_in_use N'這個選項目前有效的執行值',
description N'組態選項的描述'
FROM sys.configurations
WHERE name='xp_cmdshell'

 

SQL SERVER SELECT 與 SET

SQL Server 中對已經定義的變量賦值的方式用兩種,分別是 SET 和 SELECT。
對於這兩種方式的區別,SQL Server 聯機叢書中已經有詳細的說明,但很多時候我們
並沒有注意,其實這兩種方式還是有很多差別的。
SQL Server推薦使用 SET 而不是 SELECT 對變量進行賦值。
當表達式返回一個值並對一個變量進行賦值時,推薦使用 SET 方法。
下表列出 SET 與 SELECT 的區別。請特別注意紅色部分。 

set select
同時對多個變量同時賦值 不支持 支持(如:select   @a=1,@b=2,@c=3 )
表達式返回多個值時 出錯 將返回的最後一個值賦給變量
表達式未返回值 變量被賦null值 變量保持原值

下面以具體示例來說明問題:

create table chinadba1(
userid int ,
addr varchar(128)
)
go
insert into chinadba1(userid,addr) values(1,’addr1′)
insert into chinadba1(userid,addr) values(2,’addr2′)
insert into chinadba1(userid,addr) values(3,’addr3′)
go

表達式返回多個值時,使用 SET 賦值

declare @addr varchar(128)
set @addr = (select addr from chinadba1)
/*
–出錯信息為
服務器: 消息 512,級別 16,狀態 1,行 2
子查詢返回的值多於一個。當子查詢跟隨在 =、!=、<、<=、>、>= 之後,或子查詢用作表達式時,這種情況是不允許的。
*/
go

表達式返回多個值時,使用 SELECT 賦值

declare @addr varchar(128)
select @addr = addr from chinadba1
print @addr –結果集中最後一個 addr 列的值
–結果: addr3
go

表達式未返回值時,使用 SET 賦值

declare @addr varchar(128)
set @addr = ‘初始值’
set @addr = (select addr from chinadba1 where userid = 4 )
print @addr –null值
go

表達式未返回值時,使用 SELECT 賦值

declare @addr varchar(128)
set @addr = ‘初始值’
select @addr = addr from chinadba1 where userid = 4
print @addr –保持原值
go

需要注意的是,SELECT 也可以將標量子查詢的值賦給變量,如果標量子查詢不返回值,則變量被置為 null 值。
此時與 使用 SET 賦值是完全相同的
對標量子查詢的概念大家應該都覺得陌生,舉個例子就能說明

declare @addr varchar(128)
set @addr = ‘初始值’
–select addr from chinadba1 where userid = 4 為標量子查詢語句
select @addr = (select addr from chinadba1 where userid = 4)
print @addr –null值
go

原文地址 http://blog.chinaunix.net/u/25096/showart_375538.html

如何讓用不到的專案不再出現在 VS2003/2005/VS2008 的啟始頁

原文網址

這是每個人都很可能遇到的情況,那就是你建立了一個專案,然後你將它搬動、刪除或重新命名了,但是舊的名字卻一直出現在啟始頁的「最近使用的專案」窗格裡,無從刪除。

這個問題從 VS2002 一直到 VS2008 都存在。雖然不會引起什麼問題,但對於部份習慣從該窗格選取專案的人來講,卻是一個討人厭的問題。

解決的方法很簡單,請開啟登錄編輯程式,從 HKCU/Software/Microsoft/VisualStudio/x.0/ProjectMRUList 中把不要的項目刪除就可以了。

對於 VS2002/2003 的使用者,則可以找 HKCU/Software/Microsoft/VisualStudio/7.1/ProjectMRUList, VS2008 則是 HKCU/Software/Microsoft/VisualStudio/9.0/ProjectMRUList

到了 VS2010,什麼都不必做,因為在啟始頁中就可以直接 remove 掉了。

快速取得資料庫資料表結構

select t.name as [table name], c.name AS [column name], tp.name AS [資料型別],
  case tp.name
  when 'bigint' then cast(c.precision as varchar(3))
  when 'int' then cast(c.precision as varchar(3))
  when 'smallint' then cast(c.precision as varchar(3))
  when 'tinyint' then cast(c.precision as varchar(3))
  when 'numeric' then '(' + cast(c.precision as varchar(3)) + ',' + cast(c.scale as varchar(3)) + ')'
  when 'decimal' then '(' + cast(c.precision as varchar(3)) + ',' + cast(c.scale as varchar(3)) + ')'
  when 'nvarchar' then cast((c.max_length/2) as varchar(5))
  when 'nchar' then cast((c.max_length/2) as varchar(5))
  else cast(c.max_length as varchar(5))
  end as [長度],
  CASE WHEN c.is_nullable=1 THEN 'ok' ELSE 'no' END AS [NULL ok],
  ep.value as [描述] 
from sys.tables as t
inner join sys.columns as c on t.object_id=c.object_id
inner join sys.types as tp on c.system_type_id = tp.system_type_id
left outer join sys.extended_properties as ep on (ep.major_id = t.object_id
and ep.minor_id = c.column_id and ep.class = 1 )
where tp.system_type_id = tp.user_type_id 
order by t.name,c.name

 

SQL 執行批次檔指令

要透過SQL執行批次檔的動作一定要該帳號權限允許,以及SQL SERVER有開啟該程序。

其執行語法為:

EXEC master.dbo.xp_cmdshell ‘C:\TEST.bat’

 

其中要注意的一點是,語法中的 C:\TEST.bat 是指 SQL SERVER 那台主機上的目錄。

 

開啟該權限的語法:

EXEC sp_configure ‘show advanced options’, 1;

RECONFIGURE;

EXEC sp_configure ‘xp_cmdshell’, 1;

RECONFIGURE;

 

關閉該權限的語法

EXEC sp_configure ‘show advanced options’, 1;

RECONFIGURE;

EXEC sp_configure ‘xp_cmdshell’, 0;

RECONFIGURE;