시작에서
 
실행에서 Sysedit 입력
 
시스템 구성 편집기가 뜨면 창이 몇개 뜨는데
 
거기서 C:\CONFIG.SYS 를 찾아서
 
빈 공간에 Stacks=9,256 을 입력 후
 
저장한 다음 재부팅 하시면됩니다.
 
 
 
스택오버 플로우용 보안패치
Microsoft 보안 공지 MS06-040
2009/05/12 13:29 2009/05/12 13:29

테스트를 하다 보면 너무 많은 양의 데이터가 들어가서 행을 삭제한 후 다시 작업을 해야할 경우가 있습니다. 개발 단계에서 테스트 데이터를 집어넣어 놓고 실제로 유효한 데이터를 입력할 경우 seq가 1부터 시작하질 않죠-_-;;


    DBCC CHECKIDENT(테이블명, reseed, 초기값);


를 사용하면 행을 삭제 후 seq값을 초기화 시킬 수 있습니다.

초기값은 0을 지정한 후 insert 해보면 1부터 증가하는것을 볼 수 있습니다.

2009/05/08 11:22 2009/05/08 11:22

경고: 레지스트리 편집기를 잘못 사용하면 심각한 문제가 발생할 수 있으며 문제를 해결하기 위해 운영 체제를 다시 설치해야 할 수도 있습니다. 필자는 레지스트리 편집기를 잘못 사용함으로써 발생하는 문제에 대해 해결을 보증하지 않습니다. 레지스트리 편집기의 사용에 따른 모든 책임은 사용자에게 있습니다.

HKLMSystemCurrentControlSetServicesTcpipParameters
값 이름: SynAttackProtect
키: TcpipParameters
값 종류: REG_DWORD
유효 범위: 0,1
기본값: 0

이 레지스트리 값은 TCP(Transmission Control Protocol)가 SYN-ACKS의 재전송을 조정하도록 합니다. 이 값을 구성하면 SYN 공격(서비스 거부 공격의 한 종류) 동안 연결 응답이 더 빨리 시간 초과됩니다.

다음 매개 변수는 이 레지스트리 값과 함께 사용할 수 있습니다. ? 0(기본값): SYN 공격에 대한 일반적인 보호를 하려면 SynAttackProtect를 0으로 설정합니다.
1 : SYN 공격에 대하여 보다 높은 수준의 보호를 하려면 SynAttackProtect를 1로 설정합니다. 이 매개 변수는 TCP가 SYN-ACKS의 재전송을 조정하도록 합니다. SynAttackProtect를 1로 설정하는 경우 시스템에서 SYN 공격이 이루어지고 있음을 감지하면 연결 응답이 더 빨리 시간 초과됩니다. Windows는 공격이 진행 중인지 확인하기 위하여 다음 값을 사용합니다.

TcpMaxPortsExhausted
TCPMaxHalfOpen
TCPMaxHalfOpenRetried


값 이름: EnableDeadGWDetect
키: TcpipParameters
값 종류: REG_DWORD
유효 범위: 0, 1(False, True)
기본값: 1(True)

다음은 이 레지스트리 값과 함께 사용할 수 있는 매개 변수입니다. ? 1 : EnableDeadGWDetect를 1로 설정하면 TCP는 더 이상 작동하지 않는 게이트웨이를 검색할 수 있습니다. 더 이상 작동하지 않는 게이트웨이 감지가 사용되면 TCP는 여러 연결에 문제가 발생하는 경우 인터넷 프로토콜(IP)에 백업 게이트웨이를 변경하도록 요청할 수 있습니다. 백업 게이트웨이는 제어판의 네트워크 도구에 있는 TCP/IP 구성 대화 상자의 고급 섹션에서 정의됩니다.
0: EnableDeadGWDetect 값은 0으로 설정하는 것이 좋습니다. 0으로 설정하지 않으면 공격으로 인하여 서버가 강제로 원하지 않는 게이트웨이로 전환될 수 있습니다.

값 이름: EnablePMTUDiscovery
키: TcpipParameters
값 종류: REG_DWORD
유효 범위: 0, 1(False, True)
기본값: 1(True)

다음은 이 레지스트리 값과 함께 사용할 수 있는 매개 변수입니다. ? 1 : EnablePMTUDiscovery를 1로 설정하면 TCP는 최대 전송 단위(MTU)나 원격 호스트 경로에 대한 최대 패킷 크기를 검색하려 합니다. TCP는 경로의 MTU를 검색하고 TCP 세그먼트를 이 크기로 제한하여 경로에 있는 각자 다른 MTU로 네트워크에 연결하는 라우터에서 조각을 제거할 수 있습니다. 조각이 있으면 TCP 처리량에 좋지 않은 영향을 줍니다.
? 0 : EnablePMTUDiscovery는 0으로 설정하는 것이 좋습니다. 이렇게 하면 로컬 서브넷에서 호스트하지 않는 모든 연결에 576바이트의 MTU가 사용됩니다. 이 값을 0으로 설정하지 않으면 공격자가 강제로 MTU를 아주 작은 값으로 설정하여 스택의 부하가 커집니다.

값 이름: KeepAliveTime
키: TcpipParameters
값 종류: REG_DWORD - 시간(밀리초)
유효 범위: 1 - 0xFFFFFFFF
기본값: 7,200,000(2시간)

이 값은 TCP가 Keep Alive 패킷을 보내어 유휴 연결이 열려 있는지 확인하는 빈도를 결정합니다. 연결이 유지되어 있다면 원격 컴퓨터가 Keep-Alive 패킷을 인식합니다. Keep-Alive 패킷은 기본적으로 보내지지 않습니다. 연결에서 이 값을 구성하기 위한 프로그램을 사용할 수 있습니다. 권장값은 300,000(5분)입니다.

값 이름: NoNameReleaseOnDemand
키: NetbtParameters
값 종류: REG_DWORD
유효 범위: 0, 1(False, True)
기본값: 0(False)

이 값은 컴퓨터가 이름 해제 요청을 받을 때 NetBIOS 이름을 해제할지 여부를 결정합니다. 이 값은 관리자가 악의적인 이름 해제 공격으로부터 컴퓨터를 보호할 수 있도록 추가되었습니다. NoNameReleaseOnDemand 값은 1로 설정하는 것이 좋습니다.


DisableIPSourceRouting DWORD 2

IP 원본 라우팅은 데이터그램이 네트워크를 통해 취해야 할 IP 경로를 보낸 사람이 결정할 수 있도록 하는 메커니즘입니다.
보안 문제
공격자는 원본에서 라우팅한 패킷을 사용하여 ID와 위치를 모호하게 만들 수 있습니다.
패킷을 보내는 컴퓨터는 원본 라우팅을 통해 사용할 경로를 지정할 수 있습니다.
이 레지스트리 값으로 사용할 수 있는 값은 다음과 같습니다.

? 0, 1 또는 2, 기본값은 0(원본에서 라우팅한 패킷 확인됨)


TcpMaxConnectResponseRetransmissions DWORD 2

TcpMaxConnectResponseRetransmissions: SYN ? ACK retransmissions when a connection request is not acknowledged
이 항목은 SCE에서 MSS: SYN ? ACK retransmissions when a connection request is not acknowledged로 나타납니다. 이 매개 변수는 중단하기 전에 TCP에서 SYN을 재전송하는 횟수를 결정합니다. 재전송 제한 시간은 지정한 연결 시도에서 재전송이 연속될 때마다 두 배로 증가합니다. 초기 시간 제한 값은 3초입니다.

보안 문제
SYN 대규모 공격에서 공격자는 연속 SYN 패킷 스트림을 서버에 보내고 서버는 무력화되어 더 이상 합법적인 요청에 응답할 수 없을 때까지 부분 공개 연결을 열어 둡니다.

대책
MSS: SYN ? ACK retransmissions when a connection request is not acknowledged의 값을 3 seconds, half?open connections dropped after nine seconds로 구성하십시오.

이 레지스트리 값으로 사용할 수 있는 값은 다음과 같습니다.

? 0?0xFFFFFFFF, 기본값은 2


TcpMaxDataRetransmissions DWORD 3

TcpMaxDataRetransmissions: How many times unacknowledged data is retransmitted (3 recommended, 5 is default)
이 항목은 SCE에서 MSS: How many times unacknowledged data is retransmitted (3 recommended, 5 is default)로 나타납니다. 이 매개 변수는 연결을 중단하기 전에 TCP에서 개별 데이터 세그먼트(연결되지 않은 세그먼트)를 재전송하는 횟수를 결정합니다. 재전송 제한 시간은 연결에서 재전송이 연속될 때마다 두 배로 증가하고 응답이 재개되면 다시 설정됩니다. 기본 제한 시간 값은 연결 시 측정된 Round-Trip Time에 따라 동적으로 결정됩니다.

보안 문제
SYN 대규모 공격에서 공격자는 연속 SYN 패킷 스트림을 서버에 보내고 서버는 무력화되어 더 이상 합법적인 요청에 응답할 수 없을 때까지 부분 공개 연결을 열어 둡니다.

대책
MSS: How many times unacknowledged data is retransmitted (3 recommended, 5 is default)의 값을 3으로 구성하십시오. 이 레지스트리 값으로 사용할 수 있는 값은 다음과 같습니다.

? 0 ~ 0xFFFFFFFF, 기본값은 5


PerformRouterDiscovery DWORD 0

PerformRouterDiscovery: Allow IRDP to detect and configure Default Gateway addresses (could lead to DoS)
이 항목은 SCE에서 MSS: Allow IRDP to detect and configure Default Gateway addresses (could lead to DoS)로 나타납니다. 이 설정은 IRDP(Internet Router Discovery Protocol)의 사용 여부를 설정하는 데 사용됩니다. IRDP를 사용하면 시스템에서 기본 게이트웨이 주소를 자동으로 검색하고 구성할 수 있습니다.

보안 문제
같은 네트워크 세그먼트에서 시스템을 제어하는 공격자는 네트워크에서 컴퓨터가 라우터를 가장하도록 구성할 수 있습니다. 그러면 IRDP를 사용하도록 설정된 다른 컴퓨터에서 이미 손상된 시스템을 통해 트래픽을 라우팅하려고 시도할 수 있습니다.

대책
MSS: Allow IRDP to detect and configure Default Gateway addresses (could lead to DoS)의 값을 사용 안 함으로 구성하십시오.

이 레지스트리 값으로 사용할 수 있는 값은 다음과 같습니다.

? 1 또는 0, 기본값은 0(사용 안 함)


TCPMaxPortsExhausted DWORD 5

TCPMaxPortsExhausted: How many dropped connect requests to initiate SYN attack protection (5 is recommended)
이 항목은 SCE에서 MSS: How many dropped connect requests to initiate SYN attack protection (5 is recommended)으로 나타납니다. 이 매개 변수는 SYN ? ATTACK 보호가 작동하기 시작하는 시점을 결정합니다. 사용 가능한 연결 백로그를 0으로 설정했기 때문에 시스템에서 TcpMaxPortsExhausted 연결 요청을 거부하면 SYN ? ATTACK 보호가 작동하기 시작합니다.

보안 문제
SYN 대규모 공격에서 공격자는 연속 SYN 패킷 스트림을 서버에 보내고 서버는 무력화되어 더 이상 합법적인 요청에 응답할 수 없을 때까지 부분 공개 연결을 열어 둡니다.

대책
MSS: How many dropped connect requests to initiate SYN attack protection (5 is recommended)의 값을 5로 구성하십시오.

이 레지스트리 값으로 사용할 수 있는 값은 다음과 같습니다.

? 0 ~ 0xFFFF, 기본값은 5


AFD 설정:

DynamicBacklogGrowthDelta

EnableDynamicBacklog
MinimumDynamicBacklog

MaximumDynamicBacklog
FTP 서버 및 웹 서버와 같은 Windows 소켓 응용 프로그램의 연결 시도는 Afd.sys에 의해 처리됩니다. Afd.sys는 합법적 클라이언트에 대한 액세스를 거부하지 않고 부분 공개 상태에서 여러 번의 연결을 지원하도록 수정되었습니다.
관리자가 동적 백로그를 구성할 수 있도록 함으로써 이러한 지원이 가능해졌습니다.
DynamicBacklogGrowthDelta는 연결이 더 필요할 때 만들 사용 가능 연결 수를 결정합니다. 값이 크면 free 연결 할당이 폭주할 수 있으므로 이 값을 주의하여 설정하십시오.
SYN 대규모 공격에서 공격자는 연속 SYN 패킷 스트림을 서버에 보내고 서버는 무력화되어 더 이상 합법적인 요청에 응답할 수 없을 때까지 부분 공개 연결을 열어 둡니다.


DisableIPSourceRouting
IP 원본 라우팅은 데이터그램이 네트워크를 통해 취해야 할 IP 경로를 보낸 사람이 결정할 수 있도록 하는 메커니즘입니다. 이 값을 2로 설정하면 원본에서 라우팅한 모든 들어오는 패킷이 삭제됩니다.
공격자는 원본에서 라우팅한 패킷을 사용하여 ID와 위치를 모호하게 만듭니다. 패킷을 보내는 컴퓨터는 원본 라우팅을 통해 취할 경로를 지정할 수 있게 됩니다.


PerformRouterDiscovery
이 매개 변수는 IRDP(Internet Router Discovery Protocol)를 지원하는 Windows 2000이 컴퓨터에서 기본 게이트웨이 주소를 자동으로 검색 및 구성하지 못하도록 하기 위해 설정됩니다.
같은 네트워크 세그먼트에서 시스템을 제어하는 공격자는 네트워크에서 컴퓨터가 라우터를 가장하도록 구성할 수 있습니다.
그러면 IRDP를 사용하도록 설정된 다른 컴퓨터에서 이미 손상된 시스템을 통해 트래픽을 라우팅하려고 시도할 수 있습니다.

자동 실행 사용 안 함: 모든 드라이브에 대해 자동 실행 사용 안 함
이 항목은 SCE에서 MSS: 모든 드라이브에 대해 자동 실행 사용 안 함으로 나타납니다. 자동 실행은 컴퓨터의 드라이브에 미디어가 삽입되는 즉시 읽기를 시작하는 기능입니다. 따라서 프로그램의 설치 파일과 오디오 미디어의 사운드가 즉시 시작됩니다.

다음과 같은 레지스트리 값 항목이 템플릿 파일의 HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionPoliciesExplorer 레지스트리 키에 추가되었습니다.

표 5. 자동 실행을 사용하지 않도록 구성하기 위해 레지스트리에 추가된 설정

하위 키 레지스트리 값 항목 형식 권장 값(10진수)
NoDriveTypeAutoRun
DWORD
0xFF


다음 설정의 값을 1로 설정하여 CD/DVD 자동 실행만 사용할 수 없도록 할 수도 있습니다. 다음과 같은 레지스트리 값 항목이 템플릿 파일의 HKEY_LOCAL_MACHINE SYSTEMCurrentControlSetServicesCdrom 레지스트리 키에 추가되었습니다.

표 6. 자동 실행을 사용하지 않도록 구성하기 위해 레지스트리에 추가할 설정

하위 키 레지스트리 값 항목 형식 권장 값(10진수)
AutoRun
DWORD
0


보안 문제
미디어를 삽입할 때 악의적인 프로그램이 시작되지 않도록 하기 위해 그룹 정책을 통해 모든 드라이브에서 자동 실행을 사용하지 않도록 합니다.

시스템에 실제로 액세스할 수 있는 공격자는 자동 실행이 가능한 DVD 또는 CD를 컴퓨터에 삽입할 수 있으므로 이로 인해 악의적인 코드가 자동으로 시작됩니다. 이 악의적 프로그램에는 공격자가 원하는 모든 코드가 포함되어 있습니다.

화면 보호기 암호 보호 즉시 적용: 화면 보호기 유예 기간 만료 시간(초)(0 권장)
이 항목은 SCE에서 MSS: 화면 보호기 유예 기간 만료 시간(초)(0 권장)으로 나타납니다. Windows에는 화면 보호기 잠금이 활성화되어 있는 경우 화면 보호기가 실행된 후 실제로 콘솔이 자동으로 잠길 때까지의 유예 기간이 설정되어 있습니다.

다음과 같은 레지스트리 값 항목이 템플릿 파일의 HKEY_LOCAL_MACHINESYSTEMSoftwareMicrosoftWindows NTCurrentVersionWinlogon 레지스트리 키에 추가되었습니다.

표 7. 화면 보호기 암호 보호를 즉시 적용하기 위해 레지스트리에 추가된 설정

하위 키 레지스트리 값 항목 형식 권장 값(10진수)
ScreenSaverGracePeriod
String
0


보안 문제
화면 보호기 잠금이 실행되기 전에 사용자 동작에 허용된 기본 유예 기간은 5초입니다. 기본 유예 기간의 기본 설정을 그대로 유지하면 화면 보호기 잠금이 실행되기 전에 시스템에 로그온하기 위해 콘솔에 들어가는 사람으로부터 컴퓨터가 쉽게 공격을 받을 수 있습니다. 레지스트리 항목을 만들어 유예 기간을 조정할 수 있습니다.

대책
MSS: 화면 보호기 유예 기간 만료 시간(초)(0 권장)의 값을 0으로 구성하십시오.

이 레지스트리 값으로 사용할 수 있는 값은 다음과 같습니다.

? 0 ~ 255, 기본값은 5초

보안 로그 용량 경고: 시스템에서 경고를 생성할 보안 이벤트 로그 용량에 대한 백분율 임계값
이 항목은 SCE에서 MSS: 시스템에서 경고를 생성할 보안 이벤트 로그 용량에 대한 백분율 임계값으로 나타납니다. Windows Server 2003과 Windows 2000 서비스 팩 3에는 보안 로그가 사용자 정의된 임계값에 도달하면 보안 이벤트 로그에 보안 감사를 생성하는 새로운 기능이 포함되어 있습니다. 예를 들어 이 값이 90으로 설정된 경우에는 보안 로그가 용량의 90%에 도달하면 eventID 523에 대한 이벤트 항목과 보안 이벤트 로그가 90% 찼습니다.라는 텍스트가 표시됩니다.

참고: 필요에 따라 이벤트를 덮어쓰도록 보안 이벤트 로그를 구성한 경우에는 이 설정이 적용되지 않습니다.

다음과 같은 레지스트리 값 항목이 템플릿 파일의 HKEY_LOCAL_MACHINE SYSTEMCurrentControlSetServicesEventlogSecurity 레지스트리 키에 추가되었습니다.

표 8. 안전한 DLL 검색 모드를 사용할 수 있도록 레지스트리에 추가된 설정

하위 키 레지스트리 값 항목 형식 권장 값(10진수)
WarningLevel
DWORD
0


보안 문제
필요에 따라 이벤트를 덮어쓰도록 컴퓨터를 구성하지 않은 경우 보안 로그가 꽉 차면 최신 이벤트가 로그에 기록되지 않습니다. 보안 로그에 더 이상 이벤트를 기록할 수 없을 때 컴퓨터를 종료하도록 구성한 경우 로그가 꽉 차면 컴퓨터가 종료되고 네트워크 서비스를 더 이상 제공할 수 없게 됩니다.

대책
MSS: 시스템에서 경고를 생성할 보안 이벤트 로그 용량에 대한 백분율 임계값의 값을 90으로 구성하십시오.

이 레지스트리 값으로 사용할 수 있는 값은 다음과 같습니다.

? 0 ~ 100, 기본값은 0(경고 이벤트가 생성되지 않음)

안전한 DLL 검색 순서 사용: 안전한 DLL 검색 모드 사용(권장)
이 항목은 SCE에서 MSS: 안전한 DLL 검색 모드 사용(권장)으로 나타납니다. 다음 두 가지 중 한 가지 방법으로 프로세스를 실행하여 요청된 DLL(동적 연결 라이브러리)을 검색하도록 DLL 검색 순서를 구성할 수 있습니다.

? 시스템 경로에 지정된 폴더를 먼저 검색한 다음 현재 작업 중인 폴더를 검색합니다.

? 현재 작업 중인 폴더를 먼저 검색한 다음 시스템 경로에 지정된 폴더를 검색합니다.


이 레지스트리 값은 1로 설정되어 있습니다. 이 경우 시스템에서는 시스템 경로에 지정된 폴더를 먼저 검색한 다음 현재 작업 중인 폴더를 검색합니다. 0으로 설정하면 시스템에서는 현재 작업 중인 폴더를 먼저 검색한 다음 시스템 경로에 지정된 폴더를 검색합니다.

다음과 같은 레지스트리 값 항목이 템플릿 파일의 HKEY_LOCAL_MACHINE SYSTEMCurrentControlSetControlSession Manager 레지스트리 키에 추가되었습니다.

표 9. 안전한 DLL 검색 모드를 사용할 수 있도록 레지스트리에 추가된 설정

하위 키 레지스트리 값 항목 형식 권장 값(10진수)
SafeDllSearchMode
DWORD
0


보안 문제
사용자가 실수로 악성 코드를 실행하는 경우 이 코드가 수정된 버전의 시스템 DLL을 포함하여 추가 파일과 함께 패키지되어 있으면 해당 DLL의 고유 버전이 로드되어 코드에서 렌더링할 수 있는 손상 유형 및 정도가 커집니다.

대책
MSS: 안전한 DLL 검색 모드 사용(권장)의 값을 사용으로 구성하십시오.

이 레지스트리 값으로 사용할 수 있는 값은 다음과 같습니다.

? 1 또는 0, 기본값은 0

최종 로그온 사용자 이름 감추기
레지스트리를 아래와 같이 설정하여 최종 로그온 한 사용자의 이름을 감추십시오.

Win NT

하이브
HKEY_LOCAL_MACHINESOFTWARE


MicrosoftWindows NTCurrent VersionWinlogon

이름
DontDisplayLastUserName

형식
REG_SZ (Win 2000 > REG_DWORD)


1

win NT

공개 로컬 보안 인증(LSA)의 정보에 대한 액세스 제한

시스템의 모든 사용자를 식별하여, 익명 사용자를 제한하고 Windows NT Security Subsystem의 LSA 구성 요소에 대해 얻을 수 있는 공개 정보를 최소화해야 합니다. LSA는 로컬 컴퓨터의 액세스와 사용 권한을 포함한 보안 관리 항목을 처리합니다. 이 제한을 적용하려면 아래와 같이 레지스트리 항목을 만들고 설정하십시오. 하이브

HKEY_LOCAL_MACHINE SYSTEM


CurrentControlSetControlLSA


값 이름

RestrictAnonymous


종류

REG_DWORD


1

win 2000
RestrictAnonymous 레지스트리 값
레지스트리 편집기를 사용하여 다음 레지스트리 키를 보고 이 키에 다음 값을 추가하거나 값이 이미 있는 경우 값을 수정하십시오.
HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlLSA
값: RestrictAnonymous
값 종류: REG_DWORD
값 데이터: 0x2(16진수)

윈도우 기본 공유 폴더 생성 또는 제거

HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesLanmanServerParametersAutoShareServer

AutoShareServer의 값을 0으로 한경우 재시작시 공유 만들지 않음.
1인경우 재시작시 공유 만들거나 복원.
출처 : [기타] 인터넷 : support.microsoft.com 검색 내용

2009/04/21 10:56 2009/04/21 10:56
--//SQL Database documentation script
--//Description: T-SQL script to generate the database document for SQL server 2000/2005

Declare @i Int, @maxi Int
Declare @j Int, @maxj Int
Declare @sr int
Declare @Output varchar(4000)
--Declare @tmpOutput varchar(max)
Declare @SqlVersion varchar(5)
Declare @last varchar(155), @current varchar(255), @typ varchar(255), @description varchar(4000)

create Table #Tables  (id int identity(1, 1), Object_id int, Name varchar(155), Type varchar(20), [description] varchar(4000))
create Table #Columns (id int identity(1,1), Name varchar(155), Type Varchar(155), Nullable varchar(2), [description] varchar(4000))
create Table #Fk(id int identity(1,1), Name varchar(155), col Varchar(155), refObj varchar(155), refCol varchar(155))
create Table #Constraint(id int identity(1,1), Name varchar(155), col Varchar(155), definition varchar(1000))
create Table #Indexes(id int identity(1,1), Name varchar(155), Type Varchar(25), cols varchar(1000))

 If (substring(@@VERSION, 1, 25 ) = 'Microsoft SQL Server 2005')
   set @SqlVersion = '2005'
else if (substring(@@VERSION, 1, 26 ) = 'Microsoft SQL Server  2000')
   set @SqlVersion = '2000'
else
   set @SqlVersion = '2005'


Print '<head>'
Print '<title>::' + DB_name() + '::</title>'
Print '<style>'
   
Print '      body {'
Print '      font-family:verdana;'
Print '      font-size:9pt;'
Print '      }'
     
Print '      td {'
Print '      font-family:verdana;'
Print '      font-size:9pt;'
Print '      }'
     
Print '      th {'
Print '      font-family:verdana;'
Print '      font-size:9pt;'
Print '      background:#d3d3d3;'
Print '      }'
Print '      table'
Print '      {'
Print '      background:#d3d3d3;'
Print '      }'
Print '      tr'
Print '      {'
Print '      background:#ffffff;'
Print '      }'
Print '   </style>'
Print '</head>'
Print '<body>'

set nocount on
   if @SqlVersion = '2000'
      begin
      insert into #Tables (Object_id, Name, Type, [description])
         --FOR 2000
         select object_id(table_name),  '[' + table_schema + '].[' + table_name + ']', 
         case when table_type = 'BASE TABLE'  then 'Table'   else 'View' end,
         cast(p.value as varchar(4000))
         from information_schema.tables t
         left outer join sysproperties p on p.id = object_id(t.table_name) and smallid = 0 and p.name = 'MS_Description'
         order by table_type, table_schema, table_name
      end
   else if @SqlVersion = '2005'
      begin
      insert into #Tables (Object_id, Name, Type, [description])
      --FOR 2005
      Select o.object_id,  '[' + s.name + '].[' + o.name + ']',
            case when type = 'V' then 'View' when type = 'U' then 'Table' end, 
            cast(p.value as varchar(4000))
            from sys.objects o
               left outer join sys.schemas s on s.schema_id = o.schema_id
               left outer join sys.extended_properties p on p.major_id = o.object_id and minor_id = 0 and p.name = 'MS_Description'
            where type in ('U', 'V')
            order by type, s.name, o.name
      end
Set @maxi = @@rowcount
set @i = 1

print '<table border="0" cellspacing="0" cellpadding="0" width="550px" align="center"><tr><td colspan="3" style="height:50;font-size:14pt;text-align:center;"><a name="index"></a><b>Index</b></td></tr></table>'
print '<table border="0" cellspacing="1" cellpadding="0" width="550px" align="center"><tr><th>Sr</th><th>Object</th><th>Type</th></tr>'
While(@i <= @maxi)
begin
   select @Output =  '<tr><td align="center">' + Cast((@i) as varchar) + '</td><td><a href="#' + Type + ':' + name + '">' + name + '</a></td><td>' + Type + '</td></tr>'
         from #Tables where id = @i
  
   print @Output
   set @i = @i + 1
end
print '</table><br />'

set @i = 1
While(@i <= @maxi)
begin
   --table header
   select @Output =  '<tr><th align="left"><a name="' + Type + ':' + name + '"></a><b>' + Type + ':' + name + '</b></th></tr>',  @description = [description]
         from #Tables where id = @i
  
   print '<br /><br /><br /><table border="0" cellspacing="0" cellpadding="0" width="750px"><tr><td align="right"><a href="#index">Index</a></td></tr>'
   print @Output
   print '</table><br />'
   print '<table border="0" cellspacing="0" cellpadding="0" width="750px"><tr><td><b>Description</b></td></tr><tr><td>' + isnull(@description, '') + '</td></tr></table><br />'

   --table columns
   truncate table #Columns
   if @SqlVersion = '2000'
      begin
      insert into #Columns  (Name, Type, Nullable, [description])
      --FOR 2000
      Select c.name,
               type_name(xtype) + (
               case when (type_name(xtype) = 'varchar' or type_name(xtype) = 'nvarchar' or type_name(xtype) ='char' or type_name(xtype) ='nchar')
                  then '(' + cast(length as varchar) + ')'
                when type_name(xtype) = 'decimal' 
                     then '(' + cast(prec as varchar) + ',' + cast(scale as varchar)   + ')'
               else ''
               end           
               ),
               case when isnullable = 1 then 'Y' else 'N'  end,
               cast(p.value as varchar(8000))
            from syscolumns c
               inner join #Tables t on t.object_id = c.id
               left outer join sysproperties p on p.id = c.id and p.smallid = c.colid and p.name = 'MS_Description'
            where t.id = @i
            order by c.colorder
      end
   else if @SqlVersion = '2005'
      begin
      insert into #Columns  (Name, Type, Nullable, [description])
      --FOR 2005  
      Select c.name,
               type_name(user_type_id) + (
               case when (type_name(user_type_id) = 'varchar' or type_name(user_type_id) = 'nvarchar' or type_name(user_type_id) ='char' or type_name(user_type_id) ='nchar')
                  then '(' + cast(max_length as varchar) + ')'
                when type_name(user_type_id) = 'decimal' 
                     then '(' + cast([precision] as varchar) + ',' + cast(scale as varchar)   + ')'
               else ''
               end           
               ),
               case when is_nullable = 1 then 'Y' else 'N'  end,
               cast(p.value as varchar(4000))
      from sys.columns c
            inner join #Tables t on t.object_id = c.object_id
            left outer join sys.extended_properties p on p.major_id = c.object_id and p.minor_id  = c.column_id and p.name = 'MS_Description'
      where t.id = @i
      order by c.column_id
      end
   Set @maxj =   @@rowcount
   set @j = 1

   print '<table border="0" cellspacing="0" cellpadding="0" width="750px"><tr><td><b>Table Columns</b></td></tr></table>'
   print '<table border="0" cellspacing="1" cellpadding="0" width="750px"><tr><th>Sr.</th><th>Name</th><th>Datatype</th><th>Nullable</th><th>Description</th></tr>'
  
   While(@j <= @maxj)
   begin
      select @Output = '<tr><td width="20px" align="center">' + Cast((@j) as varchar) + '</td><td width="150px">' + isnull(name,'')  + '</td><td width="150px">' +  upper(isnull(Type,'')) + '</td><td width="50px" align="center">' + isnull(Nullable,'N') + '</td><td>' + isnull([description],'') + '</td></tr>'
         from #Columns  where id = @j
     
      print    @Output   
      Set @j = @j + 1;
   end

   print '</table><br />'

   --reference key
   truncate table #FK
   if @SqlVersion = '2000'
      begin
      insert into #FK  (Name, col, refObj, refCol)
   --      FOR 2000
      select object_name(constid), s.name,  object_name(rkeyid) ,  s1.name 
            from sysforeignkeys f
               inner join sysobjects o on o.id = f.constid
               inner join syscolumns s on s.id = f.fkeyid and s.colorder = f.fkey
               inner join syscolumns s1 on s1.id = f.rkeyid and s1.colorder = f.rkey
               inner join #Tables t on t.object_id = f.fkeyid
            where t.id = @i
            order by 1
      end  
   else if @SqlVersion = '2005'
      begin
      insert into #FK  (Name, col, refObj, refCol)
--      FOR 2005
      select f.name, COL_NAME (fc.parent_object_id, fc.parent_column_id) , object_name(fc.referenced_object_id) , COL_NAME (fc.referenced_object_id, fc.referenced_column_id)    
      from sys.foreign_keys f
         inner  join  sys.foreign_key_columns  fc  on f.object_id = fc.constraint_object_id  
         inner join #Tables t on t.object_id = f.parent_object_id
      where t.id = @i
      order by f.name
      end
  
   Set @maxj =   @@rowcount
   set @j = 1
   if (@maxj >0)
   begin

      print '<table border="0" cellspacing="0" cellpadding="0" width="750px"><tr><td><b>Refrence Keys</b></td></tr></table>'
      print '<table border="0" cellspacing="1" cellpadding="0" width="750px"><tr><th>Sr.</th><th>Name</th><th>Column</th><th>Reference To</th></tr>'

      While(@j <= @maxj)
      begin

         select @Output = '<tr><td width="20px" align="center">' + Cast((@j) as varchar) + '</td><td width="150px">' + isnull(name,'')  + '</td><td width="150px">' +  isnull(col,'') + '</td><td>[' + isnull(refObj,'N') + '].[' +  isnull(refCol,'N') + ']</td></tr>'
            from #FK  where id = @j

         print @Output
         Set @j = @j + 1;
      end

      print '</table><br />'
   end

   --Default Constraints
   truncate table #Constraint
   if @SqlVersion = '2000'
      begin
      insert into #Constraint  (Name, col, definition)
      select object_name(c.constid), col_name(c.id, c.colid), s.text
            from sysconstraints c
               inner join #Tables t on t.object_id = c.id
               left outer join syscomments s on s.id = c.constid
            where t.id = @i
            and
            convert(varchar,+ (c.status & 1)/1)
            + convert(varchar,(c.status & 2)/2)
            + convert(varchar,(c.status & 4)/4)
            + convert(varchar,(c.status & 8)/8)
            + convert(varchar,(c.status & 16)/16)
            + convert(varchar,(c.status & 32)/32)
            + convert(varchar,(c.status & 64)/64)
            + convert(varchar,(c.status & 128)/128) = '10101000'
      end
   else if @SqlVersion = '2005'
      begin
      insert into #Constraint  (Name, col, definition)
      select c.name,  col_name(parent_object_id, parent_column_id), c.definition
      from sys.default_constraints c
         inner join #Tables t on t.object_id = c.parent_object_id
      where t.id = @i
      order by c.name
      end
   Set @maxj =   @@rowcount
   set @j = 1
   if (@maxj >0)
   begin

      print '<table border="0" cellspacing="0" cellpadding="0" width="750px"><tr><td><b>Default Constraints</b></td></tr></table>'
      print '<table border="0" cellspacing="1" cellpadding="0" width="750px"><tr><th>Sr.</th><th>Name</th><th>Column</th><th>Value</th></tr>'

      While(@j <= @maxj)
      begin

         select @Output = '<tr><td width="20px" align="center">' + Cast((@j) as varchar) + '</td><td width="250px">' + isnull(name,'')  + '</td><td width="150px">' +  isnull(col,'') + '</td><td>' +  isnull(definition,'') + '</td></tr>'
            from #Constraint  where id = @j

         print @Output
         Set @j = @j + 1;
      end

   print '</table><br />'
   end


   --Check  Constraints
   truncate table #Constraint
   if @SqlVersion = '2000'
      begin
      insert into #Constraint  (Name, col, definition)
         select object_name(c.constid), col_name(c.id, c.colid), s.text
            from sysconstraints c
               inner join #Tables t on t.object_id = c.id
               left outer join syscomments s on s.id = c.constid
            where t.id = @i
            and ( convert(varchar,+ (c.status & 1)/1)
               + convert(varchar,(c.status & 2)/2)
               + convert(varchar,(c.status & 4)/4)
               + convert(varchar,(c.status & 8)/8)
               + convert(varchar,(c.status & 16)/16)
               + convert(varchar,(c.status & 32)/32)
               + convert(varchar,(c.status & 64)/64)
               + convert(varchar,(c.status & 128)/128) = '00101000'
            or convert(varchar,+ (c.status & 1)/1)
               + convert(varchar,(c.status & 2)/2)
               + convert(varchar,(c.status & 4)/4)
               + convert(varchar,(c.status & 8)/8)
               + convert(varchar,(c.status & 16)/16)
               + convert(varchar,(c.status & 32)/32)
               + convert(varchar,(c.status & 64)/64)
               + convert(varchar,(c.status & 128)/128) = '00100100')

      end
   else if @SqlVersion = '2005'
      begin
      insert into #Constraint  (Name, col, definition)
         select c.name,  col_name(parent_object_id, parent_column_id), definition
         from sys.check_constraints c
            inner join #Tables t on t.object_id = c.parent_object_id
         where t.id = @i
         order by c.name
      end
   Set @maxj =   @@rowcount
  
   set @j = 1
   if (@maxj >0)
   begin

      print '<table border="0" cellspacing="0" cellpadding="0" width="750px"><tr><td><b>Check  Constraints</b></td></tr></table>'
      print '<table border="0" cellspacing="1" cellpadding="0" width="750px"><tr><th>Sr.</th><th>Name</th><th>Column</th><th>Definition</th></tr>'

      While(@j <= @maxj)
      begin

         select @Output = '<tr><td width="20px" align="center">' + Cast((@j) as varchar) + '</td><td width="250px">' + isnull(name,'')  + '</td><td width="150px">' +  isnull(col,'') + '</td><td>' +  isnull(definition,'') + '</td></tr>'
            from #Constraint  where id = @j
         print @Output
         Set @j = @j + 1;
      end

      print '</table><br />'
   end


   --Triggers
   truncate table #Constraint
   if @SqlVersion = '2000'
      begin
      insert into #Constraint  (Name)
         select tr.name
         FROM sysobjects tr
            inner join #Tables t on t.object_id = tr.parent_obj
         where t.id = @i and tr.type = 'TR'
         order by tr.name
      end
   else if @SqlVersion = '2005'
      begin
      insert into #Constraint  (Name)
         SELECT tr.name
         FROM sys.triggers tr
            inner join #Tables t on t.object_id = tr.parent_id
         where t.id = @i
         order by tr.name
      end
   Set @maxj =   @@rowcount
  
   set @j = 1
   if (@maxj >0)
   begin

      print '<table border="0" cellspacing="0" cellpadding="0" width="750px"><tr><td><b>Triggers</b></td></tr></table>'
      print '<table border="0" cellspacing="1" cellpadding="0" width="750px"><tr><th>Sr.</th><th>Name</th><th>Description</th></tr>'

      While(@j <= @maxj)
      begin
         select @Output = '<tr><td width="20px" align="center">' + Cast((@j) as varchar) + '</td><td width="150px">' + isnull(name,'')  + '</td><td></td></tr>'
            from #Constraint  where id = @j
         print @Output
         Set @j = @j + 1;
      end

      print '</table><br />'
   end

   --Indexes
   truncate table #Indexes
   if @SqlVersion = '2000'
      begin
      insert into #Indexes  (Name, type, cols)
         select i.name, case when i.indid = 0 then 'Heap' when i.indid = 1 then 'Clustered' else 'Nonclustered' end , c.name
         from sysindexes i
            inner join sysindexkeys k  on k.indid = i.indid  and k.id = i.id
            inner join syscolumns c on c.id = k.id and c.colorder = k.colid
            inner join #Tables t on t.object_id = i.id
         where t.id = @i and i.name not like '_WA%'
         order by i.name, i.keycnt
      end
   else if @SqlVersion = '2005'
      begin
      insert into #Indexes  (Name, type, cols)
         select i.name, case when i.type = 0 then 'Heap' when i.type = 1 then 'Clustered' else 'Nonclustered' end,  col_name(i.object_id, c.column_id)
            from sys.indexes i
               inner join sys.index_columns c on i.index_id = c.index_id and c.object_id = i.object_id
               inner join #Tables t on t.object_id = i.object_id
            where t.id = @i
            order by i.name, c.column_id
      end

   Set @maxj =   @@rowcount
  
   set @j = 1
   set @sr = 1
   if (@maxj >0)
   begin

      print '<table border="0" cellspacing="0" cellpadding="0" width="750px"><tr><td><b>Indexes</b></td></tr></table>'
      print '<table border="0" cellspacing="1" cellpadding="0" width="750px"><tr><th>Sr.</th><th>Name</th><th>Type</th><th>Columns</th></tr>'
      set @Output = ''
      set @last = ''
      set @current = ''
      While(@j <= @maxj)
      begin
         select @current = isnull(name,'') from #Indexes  where id = @j
               
         if @last <> @current  and @last <> ''
            begin  
            print '<tr><td width="20px" align="center">' + Cast((@sr) as varchar) + '</td><td width="150px">' + @last + '</td><td width="150px">' + @typ + '</td><td>' + @Output  + '</td></tr>'
            set @Output  = ''
            set @sr = @sr + 1
            end
        
           
         select @Output = @Output + cols + '<br />' , @typ = type
               from #Indexes  where id = @j
        
         set @last = @current   
         Set @j = @j + 1;
      end
      if @Output <> ''
            begin  
            print '<tr><td width="20px" align="center">' + Cast((@sr) as varchar) + '</td><td width="150px">' + @last + '</td><td width="150px">' + @typ + '</td><td>' + @Output  + '</td></tr>'
            end

      print '</table><br />'
   end

    Set @i = @i + 1;
   --Print @Output
end


Print '</body>'
Print '</html>'

drop table #Tables
drop table #Columns
drop table #FK
drop table #Constraint
drop table #Indexes
set nocount off

2009/04/21 10:53 2009/04/21 10:53
USE TEMPDB
GO
declare @hash varbinary (255)
CREATE TABLE tempdb..h (id_num int, hash varbinary (255))
SET @hash = pwdencrypt('123') -- encryption
INSERT INTO tempdb..h (id_num,hash) VALUES (1,@hash)
SET @hash = pwdencrypt('123')
INSERT INTO tempdb..h (id_num,hash) VALUES (2,@hash)
SELECT TOP 1 @hash = hash FROM tempdb..h WHERE id_num = 2
SELECT pwdcompare ('123', @hash) AS [Success of check] -- Comparison
SELECT * FROM tempdb..h
INSERT INTO tempdb..h (id_num,hash) 
VALUES (3,CONVERT(varbinary (255),
0x01002D60BA07FE612C8DE537DF3BFCFA49CD9968324481C1A8A8FE612C8DE537DF3BFCFA49CD9968324481C1A8A8))
SELECT TOP 1 @hash = hash FROM tempdb..h WHERE id_num = 3
SELECT pwdcompare ('123', @hash) AS [Success of check] -- Comparison
SELECT * FROM tempdb..h
DROP TABLE tempdb..h
GO

Results

(1 row(s) affected)
(1 row(s) affected)
Success of check ------------------- 1 (1 row(s) affected)
id_num hash ----------- ------------------------------------------------------ 1 0x01004A335DCEDB366D99F564D460B1965B146D6184E4E1025195 2 0x0100E11D573F359629B344990DCD3D53DE82CF8AD6BBA7B638B6 (2 row(s) affected)
(1 row(s) affected)
Success of check
-------------------
1
(1 row(s) affected)
id_num hash ----------- ------------------------------------------------------ 1 0x01004A335DCEDB366D99F564D460B1965B146D6184E4E1025195 2 0x0100E11D573F359629B344990DCD3D53DE82CF8AD6BBA7B638B6 3 0x01002D60BA07FE612C8DE537DF3BFCFA49CD9968324481C1A8A8FE612C8DE537DF3BFCFA49CD9968324481C1A8A8 (3 row(s) affected)
2009/04/21 10:43 2009/04/21 10:43
프로그래밍을 하다보면 불가피하게 dynamic query를 사용해야하는 경우가 발생한다.

stored procedure를 사용하면서 exec statement를 사용하게 되는데 이렇게 되면 조금만 부주의해도 injection에 의한 공격이 허용되는 경우도 있고 같은 유형의 쿼리가 들어가도 미리 만들어진 실행계획을 이용하지 못하는 문제가 있어서 성능면에서 그 효과가 많이 줄어든다.

그에 반해 sp_executesql을 이용하게 되면 parameters를 이용할 수 있으므로 injection에 의한 공격에도 자유로울 수 있고 아래의 옮겨 놓은 ms sql의 도움말에 적혀 있듯이 비슷한 유형의 경우 기 실행계획을 이용하게 되는 경우가 있으니 상대적으로 성능면에서 유리한 면이 있고 이를 보고 일석이조라고 해야 하지 않을까 한다.

== 아래 == :: ms sql 도움말 옮김

sp_executesql

여러 번 사용할 수 있거나, 동적으로 만들어진 Transact-SQL문 또는 일괄 처리를 실행합니다. Transact-SQL문 또는 일괄 처리는 포함 매개 변수를 포함할 수 있습니다.

구문

sp_executesql [@stmt =] stmt[
   
{, [@params =] N'@parameter_name  data_type [,...n]' }
     {, [@param1 =] 'value1' [,...n] }
]

인수

[@stmt =] stmt

Transact-SQL문 또는 일괄 처리를 포함한 유니코드 문자열입니다. stmt는 암시적으로 ntext로 변환될 수 있는 변수 또는 유니코드 상수여야 합니다. + 연산자로 두 개의 문자열을 연결한 식 등과 같은 보다 복잡한 유니코드식은 사용할 수 없습니다. 문자 상수도 사용할 수 없습니다. 상수가 지정된 경우에는 N이라는 접두사가 있어야 합니다. 예를 들어, N'sp_who'라는 유니코드 상수는 사용할 수 있지만 'sp_who'는 사용할 수 없습니다. 문자열의 크기는 사용 가능한 데이터베이스 서버의 메모리의 용량에 따라서만 제한됩니다.

stmt는 변수 이름과 동일한 형식의 매개 변수를 포함할 수 있습니다. 예를 들면 다음과 같습니다.

N'SELECT * FROM Employees WHERE EmployeeID = @IDParameter'

stmt에 포함된 각 매개 변수에는 @params 매개 변수 정의 목록과 매개 변수 값 목록 모두에 해당되는 항목이 있어야 합니다.

[@params =] N'@parameter_name  data_type [,...n]'

stmt에 포함된 모든 매개 변수의 정의를 포함하는 하나의 문자열입니다. 문자열은 암시적으로 ntext로 변환될 수 있는 변수 또는 유니코드 상수여야 합니다. 각 매개 변수의 정의는 매개 변수 이름과 데이터 형식으로 구성됩니다. n은 추가 매개 변수 정의를 나타내는 자리 표시자입니다. stmt에서 지정된 모든 매개 변수는 반드시 @params에서 정의되어야 합니다. stmt의 Transact-SQL문 또는 일괄 처리에 매개 변수가 없는 경우에는 @params가 필요하지 않습니다. 이 매개 변수의 기본값은 NULL입니다.

[@param1 =] 'value1'

매개 변수 문자열에서 정의된 첫번째 매개 변수의 값입니다. 값은 상수 또는 변수가 될 수 있습니다. stmt에 포함된 모든 매개 변수에 대해 제공되는 매개 변수 값이 있어야 합니다. stmt의 Transact-SQL문 또는 일괄 처리에 매개 변수가 없는 경우에는 값이 필요하지 않습니다.

n

추가 매개 변수의 값에 대한 자리 표시자입니다. 값은 상수 또는 변수만 가능합니다. 값은 함수 또는 연산자를 사용하여 작성된 표현식 등과 같이, 보다 복잡한 표현식이 될 수 없습니다.

반환 코드 값

0(성공) 또는 1(실패)

결과 집합

SQL 문자열에 작성된 모든 SQL문에서 결과 집합을 반환합니다.

비고

sp_executesql은 일괄 처리, 이름의 범위 및 데이터베이스 컨텍스트면에서 EXECUTE와 동작이 동일합니다. sp_executesql stmt 매개 변수의 Transact-SQL문 또는 일괄 처리는 sp_executesql이 실행될 때까지 컴파일되지 않습니다. stmt의 내용은 sp_executesql이라는 일괄 처리의 실행 계획과 별도로 컴파일되고 실행됩니다. sp_executesql 일괄 처리는 sp_executesql을 호출하는 일괄 처리에서 선언된 변수를 참조할 수 없습니다. sp_executesql 일괄 처리의 로컬 커서 또는 변수는 sp_executesql을 호출하는 일괄 처리에는 보이지 않습니다. 데이터베이스 컨텍스트 내의 변경 사항은 sp_executesql문이 종료될 때까지만 지속됩니다.

문에 대한 매개 변수의 변경 사항이 변형뿐인 경우, Transact-SQL문을 여러 번 실행하기 위해 저장 프로시저 대신 sp_executesql을 사용할 수 있습니다. Transact-SQL문 자체에 상수가 남아 있으며 매개 변수 값만이 변경되었으므로 Microsoft® SQL Server™ 쿼리 최적화 프로그램이 첫번째 실행에 대해 생성된 실행 계획을 다시 사용할 확률이 높습니다.

참고   문의 문자열에 있는 개체 이름이 정식으로 규정되지 않은 경우에는 실행 계획이 다시 사용되지 않습니다.

sp_executesql은 Transact-SQL 문자열과 별도로 매개 변수 값의 설정을 지원합니다.

DECLARE @IntVariable INT
DECLARE @SQLString NVARCHAR(500)
DECLARE @ParmDefinition NVARCHAR(500)

/* Build the SQL string once.*/
SET @SQLString =
     N'SELECT * FROM pubs.dbo.employee WHERE job_lvl = @level'
SET @ParmDefinition = N'@level tinyint'
/* Execute the string with the first parameter value. */
SET @IntVariable = 35
EXECUTE sp_executesql @SQLString, @ParmDefinition,
                      @level = @IntVariable
/* Execute the same string with the second parameter value. */
SET @IntVariable = 32
EXECUTE sp_executesql @SQLString, @ParmDefinition,
                      @level = @IntVariable

sp_executesql에서 매개 변수를 대치할 수 있는 경우에는 EXECUTE문을 사용하여 문자열을 실행하는 데 있어서 다음과 같은 장점이 있습니다.

  • sp_executesql 문자열에 있는 Transact-SQL문의 실제 텍스트가 실행 사이에 변경되지 않으므로 쿼리 최적화 프로그램이 두 번째 실행의 Transact-SQL문과 첫번째 실행에 대해 생성된 실행 계획을 일치시킬 가능성이 있습니다. 따라서 SQL Server가 두 번째 문을 컴파일할 필요가 없습니다.

  • Transact-SQL 문자열이 단 한 번만 작성됩니다.

  • 정수 매개 변수는 자신의 기본 형식으로 지정됩니다. 유니코드를 캐스팅할 필요가 없습니다.
사용 권한

public 역할에 대한 기본 권한을 실행합니다.

예제
A. 단순 SELECT문 실행

다음은 @level이라는 포함 매개 변수를 포함한 단순 SELECT 문을 작성하고 실행하는 예제입니다.

execute sp_executesql 
          N'select * from pubs.dbo.employee where job_lvl = @level',
          N'@level tinyint',
          @level = 35
B. 동적으로 작성된 문자열 실행

다음은 sp_executesql을 사용하여 동적으로 작성된 문자열을 실행하는 예제입니다. 예로 든 저장 프로시저는 일 년 간의 판매 데이터를 파티션으로 분리하는데 사용되는 일련의 테이블에 데이터를 삽입하는 데 사용됩니다. 일 년의 각 달에는 다음과 같은 형식의 테이블이 한 개씩 있습니다.

CREATE TABLE May1998Sales
    (OrderID      INT      PRIMARY KEY,
    CustomerID      INT      NOT NULL,
    OrderDate      DATETIME   NULL
        CHECK (DATEPART(yy, OrderDate) = 1998),
    OrderMonth      INT
        CHECK (OrderMonth = 5),
    DeliveryDate   DATETIME   NULL,
        CHECK (DATEPART(mm, OrderDate) = OrderMonth)
    )

파티션으로 분리된 테이블에서 데이터를 검색하는 것에 관한 자세한 내용은 파티션으로 분리된 데이터로 보기 사용을 참조하십시오.

각 테이블의 이름은 달 이름의 첫 세 글자, 연도를 표시하는 네 자리 수 및 상수인 Sales로 구성됩니다. 이름은 주문 날짜에서 동적으로 작성될 수 있습니다.

/* Get the first three characters of the month name. */
SUBSTRING( DATENAME(mm, @PrmOrderDate), 1, 3) +
/* Concatenate the four-digit year; cast as character. */
CAST(DATEPART(yy, @PrmOrderDate) AS CHAR(4) ) +
/* Concatenate the constant 'Sales'. */
'Sales'

이러한 견본 저장 프로시저는 동적으로 INSERT 문을 작성하고 실행하여 새 주문을 올바른 테이블에 삽입합니다. 또한 반드시 데이터를 포함해야 하는 테이블의 이름을 작성하는 데 주문 날짜를 사용하며, 작성된 이름은 INSERT 문에 병합됩니다. 이는 sp_executesql의 단순한 예입니다. 여기에는 오류 확인 및 테이블 간에 주문 번호가 중복되지 않았는지를 확인하는 등의 업무 규칙 확인이 포함되지 않습니다.

CREATE PROCEDURE InsertSales @PrmOrderID INT, @PrmCustomerID INT,
                 @PrmOrderDate DATETIME, @PrmDeliveryDate DATETIME
AS
DECLARE @InsertString NVARCHAR(500)
DECLARE @OrderMonth INT

-- Build the INSERT statement.
SET @InsertString = 'INSERT INTO ' +
       /* Build the name of the table. */
       SUBSTRING( DATENAME(mm, @PrmOrderDate), 1, 3) +
       CAST(DATEPART(yy, @PrmOrderDate) AS CHAR(4) ) +
       'Sales' +
       /* Build a VALUES clause. */
       ' VALUES (@InsOrderID, @InsCustID, @InsOrdDate,' +
       ' @InsOrdMonth, @InsDelDate)'

/* Set the value to use for the order month because
   functions are not allowed in the sp_executesql parameter
   list. */
SET @OrderMonth = DATEPART(mm, @PrmOrderDate)

EXEC sp_executesql @InsertString,
     N'@InsOrderID INT, @InsCustID INT, @InsOrdDate DATETIME,
       @InsOrdMonth INT, @InsDelDate DATETIME',
     @PrmOrderID, @PrmCustomerID, @PrmOrderDate,
     @OrderMonth, @PrmDeliveryDate

GO

이 프로시저에서는 EXECUTE를 실행하는 것보다 sp_executesql을 실행하여 문자열을 실행하는 것이 더 효과적입니다. sp_executesql을 실행하는 경우, 각 개월별 테이블에 대해 한 개씩, 12 버전의 INSERT 문자열만이 생성됩니다. EXECUTE의 경우, 매개 변수 값이 다르므로 각 INSERT 문자열이 고유합니다. 두 가지 방법 모두 같은 수의 일괄 처리를 생성하지만 sp_executesql에 의해 생성된 INSERT 문자열의 유사성으로 인해 쿼리 최적화 프로그램이 실행 계획을 다시 사용할 확률이 높습니다.

2009/04/21 10:43 2009/04/21 10:43

============================================================================
1. DBCC CHECKALLOC

- 디스크 공간 할당 구조의 일관성을 검사
============================================================================

   DBCC CHECKALLOC
     ( '데이터베이스이름'
             [ , NOINDEX -- 시스템 테이블이 아닌 테이블의 클러스터되지 않은 인덱스를 검사하지 않음
                |
                 { -- 단일사용자모드에서만 사용가능
         REPAIR_ALLOW_DATA_LOSS  -- 일부데이터손실 될 수 있음
                     | REPAIR_FAST   -- 대충복구
                     | REPAIR_REBUILD   -- 모든복구작업수행 (인덱스다시생성)
                } ]
    )     [ WITH { [ ALL_ERRORMSGS | NO_INFOMSGS ] -- 에러메시지 표시여부
                     [ , [ TABLOCK ] ]   -- 공유잠금 (여기서는 무시)
                     [ , [ ESTIMATEONLY ] ]   -- 명령의 실행에 필요한 tempdb 공간의 예상크기를 표시
                }
        ]



============================================================================
2. DBCC CHECKCATALOG

- 시스템 테이블의 일관성과 시스템 테이블 간의 일관성을 검사
============================================================================

 DBCC CHECKCATALOG
      ( '데이터베이스이름'
     )    
 [ WITH NO_INFOMSGS ]  
 


============================================================================
3. DBCC CHECKCONSTRAINTS

- 지정한 테이블에서 특정 제약 조건이나 모든 제약조건의 무결성을 검사
============================================================================

 DBCC CHECKCONSTRAINTS
      [( '테이블이름' | '제약조건' )]
 [ WITH { ALL_ERRORMSGS | ALL_CONSTRAINTS } ]


============================================================================
4. DBCC CHECKDB

- 지정한 데이터베이스에서 모든 개체의 할당과 구조적 무결성을 검사
- 데이터베이스안에 있는 모든 내용의 무결성을 검사
- 가장 안정한 복구문
- DBCC CHECKDB 문을 최근에 실행했다면 CHECKALLOC, CHECKTABLE 을 실행할 필요가 없다.
- 병렬로 검사 수행 ( 추적 플래그 2528 을 쓰면 병렬검사를 해제할수 있다 )

- 검사내용
 - 인덱스와 데이터 페이지가 제대로 연결되어있는가?
 - 인덱스 정렬순서가 제대로 인가?
 - 포인터가 일치하는가?
 - 각 페이지의 데이터가 적절한가?
 - 페이지 오프셋이 적절한가?
============================================================================

 DBCC CHECKDB
      ( '데이터베이스명'
              [ , NOINDEX   -- 시스템 테이블이 아닌 테이블의 클러스터되지 않은 인덱스를 검사하지 않도록 지정합니다.
                 | { REPAIR_ALLOW_DATA_LOSS
                     | REPAIR_FAST
                     | REPAIR_REBUILD
                    } ]
     )    
 [
  WITH { [ ALL_ERRORMSGS ] -- 개체당 오류수를 무제한으로 표시
                     [ , [ NO_INFOMSGS ] ] -- 모든 정보 메시지와 사용한 공간보고서를 표시안함
                     [ , [ TABLOCK ] ]  -- 공유테이블 잠금
                     [ , [ ESTIMATEONLY ] ]  -- DBCC CHECKDB 실행에 필요한 tempdb 공간의 예상크기와 지정된 다른 옵션을 모두 표시
                    [ , [ PHYSICAL_ONLY ] ]  -- 검사를 제한 (페이지와 레코드헤더의 실제구조의 무결성, 페이지의 개체ID 와 인덱스 ID 간의 일관성 및 할당구조로 검사를 제한
                    }
        ]



============================================================================
5. DBCC CHECKFILEGROUP

- 지정한 파일 그룹에서 현재 데이터 베이스에 있는 모든 테이블의 할당과 구조적 무결성을 검사
============================================================================

 DBCC CHECKFILEGROUP
      ( [ { 'filegroup' | filegroup_id } ]
         [ , NOINDEX ]
     )    
 [
  WITH { [ ALL_ERRORMSGS | NO_INFOMSGS ]
                     [ , [ TABLOCK ] ]
                     [ , [ ESTIMATEONLY ] ]
                    }
        ]


============================================================================
6. DBCC CHECKIDENT

- 지정한 테이블의 현재 ID 값을 검사하고 필요하면 수정합니다.
============================================================================

 DBCC CHECKIDENT
      ( '테이블 이름'
          [ ,  { NORESEED
                      | { RESEED [ , new_reseed_value ] }
             }
          ]
     )


============================================================================
7. DBCC CHECKTABLE

- 지정한 테이블이나 인덱스된 뷰에 대해 데이터, 인덱스, text, ntext, image 페이지의 무결성을 검사합니다.
- 검사내용
 - 인덱스와 데이터 페이지가 제대로 연결되어 있는가?
 - 인덱스 정렬순서가 제대로 되어 있는가?
 - 포인터가 일치하는가?
 - 각 페이지의 데이터가 적절한가?
 - 페이지 오프셋이 적절한가?

- 테이블 잠금을 얻지 못하여 데이터 변경은 허용되지만 메타데이터의 변경을 방지하는 스키마 잠금을 허용
============================================================================

 DBCC CHECKTABLE
      ( '테이블이름' | '뷰명'

          [ ,  NOINDEX
              |  index_id   -- 인덱스 ID 번호
              | {  
    REPAIR_ALLOW_DATA_LOSS
                  |  REPAIR_FAST
                  |  REPAIR_REBUILD
    }
         ]

     )    
 [ WITH {
  [  ALL_ERRORMSGS
      |  NO_INFOMSGS
  ]
                [ , [ TABLOCK ] ]
                [ , [ ESTIMATEONLY ] ]
                [ , [ PHYSICAL_ONLY ] ]
               }
        ]


============================================================================
8. DBCC CLEANTABLE

- 삭제된 가변길이 열과 텍스트 열의 공간을 다시 사용
- ALTER TABLE DROP COLUMN 문을 사용하여 가변길이 열이나 text 열을 삭제한 후 공간을 반환하지만 고정길이 열이 삭제된 후에는 공간을 반환하지 않는다.

============================================================================

 DBCC CLEANTABLE
      ( { '데이터베이스이름' | 데이터베이스아이디 }
         , { '테이블이름' | 테이블아이디 | '뷰명' | 뷰아이디 }
         [ , batch_size ]  - 트랜잭션 당 처리되는 행 수 ( 값 지정 않으면 한 트랜잭션에서 전체테이블을 처리 )
     )



============================================================================
9. DBCC DBREINDEX

- 지정한 데이터베이스의 테이블에 대해 하나 이상의 인덱스를 다시 작성
- 시스템 테이블에 대해 사용할 수 없습니다.
============================================================================

 DBCC DBREINDEX
     (    
  [  'database.owner.table_name'   
               [ , index_name
    [ , fillfactor ]
   ]
         ]
     )    
 [ WITH NO_INFOMSGS ]


============================================================================
10. DBCC DBREPAIR

- 손상된 데이터베이스를 삭제합니다.
- 손상된 데이터베이스를 삭제할 경우에는 DROP DATABASE 를 사용하는 것이 좋습니다.

============================================================================



============================================================================
11. DBCC dllname(FREE)

- 지정한 확장 저장 프로시저의 동적 연결 라이브러리를 메모리에서 언로드합니다.

============================================================================

 DBCC DLL이름 ( FREE )


============================================================================
12. DBCC DROPCLEANBUFFERS

- 버퍼 풀에서 빈 버퍼를 모두 제거

============================================================================
 
 DBCC DROPCLEANBUFFERS



============================================================================
13. DBCC FREEPROCCACHE

- 프로시저 캐시에서 모든 요소를 제거
- 프로시저 캐시를 해제하면 임의 SQL 문이 캐시에서 다시 사용되지 않고 다시 컴파일됩니다.
============================================================================

 DBCC FREEPROCCACHE

============================================================================
14. DBCC INDEXDEFRAG

- 지정한 테이블이나 뷰의 클러스터된 인덱스와 보조 인덱스의 조각을 모음
- 인덱스 스캔성능을 향상시키기 위해 페이지의 물리적 순서가 왼쪽에서 오른쪽으로 잎 노드의 논리적 순서와 일치하다고 인덱스 잎 수준의 조각을 모음
============================================================================

 DBCC INDEXDEFRAG
      (
  { 데이터베이스이름 | 데이터베이스아이디 | 0 }
     ,  { 테이블이름 | 테이블아이디 | '뷰명' | 뷰아이디 }
            ,  { 인덱스이름 | 인덱스아이디 }
     )   


============================================================================
15. DBCC INPUTBUFFER

- 클라이언트에서 MSSQL 로 보낸 최종 명령문을 표시
- SP_WHO2 를 이용해서 spid 를 얻은후에 해당 spid 쿼리를 볼 수 있다.
- EventType, Parameters, EventInfo
============================================================================

 DBCC INPUTBUFFER (spid)


============================================================================
16. DBCC OPENTRAN

- 지정한 데이터베이스에서 가장 오래된 활성 트랜잭션과 가장 오래된 분산 및 비분산 복제된 트랜잭션에 대한 정보를 표시
============================================================================

 DBCC OPENTRAN
     (     { '데이터베이스이름' | 데이터베이스아이디} )
        [ WITH TABLERESULTS
             [ , NO_INFOMSGS ]
        ]


============================================================================
17. DBCC OUTPUTBUFFER

- 지정한 시스템 프로세스 ID 의 현재 출력버퍼를 16진수와 ASCII 형식으로 반환
============================================================================

 DBCC OUTPUTBUFFER ( spid )


============================================================================
18. DBCC PINTABLE / DBCC UNPINTABLE (해제)

- 테이블을 메모리에 고정 (플러시 하지 않음)
- 정말 자주 쓰이는 테이블의 경우
- 주의 : PINTABLE 은 성능을 향상시킬 수 있지만 주의해서 사용해야 합니다.
 커다란 테이블을 고정할 경우 많은 용량의 버퍼캐시를 사용하므로 다른 테이블에서 사용할 캐시가 부족하게 되어 성능저하가 발생 할 수 있음.

- UNPINTABLE 로 해제
============================================================================

 DBCC PINTABLE ( database_id , table_id )
 DBCC UNPINTABLE ( database_id , table_id )



============================================================================
19. DBCC PROCCACHE

- 프로시저 캐시에 대한 정보를 테이블 형식으로 반환
- SQL Server 성능 모니터는 프로시저 캐시에 대한 정보를 얻기위해 DBCC PROCCACHE 를 사용함
- 결과 집합

 num proc buffs    프로시저 캐시에 저장할 수 있는 저장 프로시저의 개수
 num proc buffs used   저장 프로시저를 보관하는 캐시 슬롯의 개수
 num proc buffs active   현재 실행 중인 저장 프로시저를 보관하는 캐시 슬롯의 개수
 proc cache size   프로시저 캐시의 전체 크기
 proc cache used   저장 프로시저를 보관하는 프로시저 캐시의 용량
 proc cache active   현재 실행 중인 저장 프로시저를 보관하는 프로시저 캐시의 용량

============================================================================

 DBCC PROCCACHE


============================================================================
20. DBCC SHOW_STATISTICS

- 지정한 테이블에서 특정 대상의 현재 배포 통계를 표시
- 결과집합

 Updated   통계가 마지막으로 업데이트된 날짜와 시간
 Rows    테이블의 행 수
 Rows Sampled   통계 정보를 위해 샘플링된 행 수
 Steps    배포 단계 수
 Density   첫 번째 인덱스 열 접두사의 선택도(자주 사용하지 않음)
 Average key length  첫 번째 인덱스 열 접두사의 평균 길이
 All density   인덱스 열 접두사 집합의 선택도(자주 사용함)
 Average length   인덱스 열 접두사 집합의 평균 길이
 Columns   전체 밀도 및 평균 길이가 표시되는 인덱스 열 접두사의 이름
 RANGE_HI_KEY   히스토그램 단계의 상위 바운드 값
 RANGE_ROWS   상위 바운드를 제외한 히스토그램 단계에 해당하는 예제의 행 수
 EQ_ROWS   히스토그램 단계의 상위 바운드 값과 동일한 예제의 행 수
 DISTINCT_RANGE_ROWS  상위 바운드를 제외한 히스토그램 단계에 있는 고유한 값 수
 AVG_RANGE_ROWS   상위 바운드(DISTINCT_RANGE_ROWS에 대해 RANGE_ROWS / DISTINCT_RANGE_ROWS > 0)를 제외한, 히스토그램 단계에 있는 중복 값의 평균 수
 
============================================================================
 
 DBCC SHOW_STATISTICS ( table , target )



============================================================================
21. DBCC SHOWCONTIG

- 지정한 테이블의 데이터와 인덱스에 대한 조각화 정보를 표시
- 인덱스가 심하게 조각난 경우에 조각난 정보를 감소시키는 방법
 - 클러스터된 인덱스를 삭제한 후 다시 만듬
 - DBCC INDEXDEFRAG | DBCC DBREINDEX 로 인덱스 다시 구성
- 결과집합

 Pages Scanned   테이블이나 인덱스의 페이지 수입니다.

 Extents Scanned  테이블이나 인덱스의 익스텐트 수입니다.

 Extent Switches  DBCC 문이 테이블이나 인덱스 페이지를 스캔하는 동안의 익스텐트 전환 횟수입니다.

 Avg. Pages per Extent  페이지 체인에서 익스텐트 당 페이지 수입니다.

 Scan Density [Best Count: Actual Count]
    Best count는 모든 데이터가 인접하여 있는 경우 이상적인 익스텐트 변경 횟수이고  
    Actual count는 실제 익스텐트 변경 횟수입니다. 스캔 밀도가 100이면 모든 데이터가 인접해 있고 100보다 작으면 일부 데이터가 조각화된 것입니다. 스캔 밀도는 % 단위입니다.

 Logical Scan Fragmentation
    인덱스의 잎 페이지 스캔에서 반환된 순서가 바뀐 페이지의 비율입니다. 이 값은 힙이나 텍스트 인덱스와는 관계가 없습니다.
    (순서가 바뀐 페이지란 IAM에 지정된 다음 페이지가 잎 페이지의 다음 페이지 포인터에서 가리키는 페이지와 다른 경우입니다.)

 Extent Scan Fragmentation
    인덱스의 잎 페이지 스캔에서 순서가 바뀐 익스텐트의 비율입니다. 이 값은 힙과는 관계가 없습니다.     (순서가 바뀐 익스텐트란 인덱스의 현재 페이지가 포함된 익스텐트가 물리적으로 이전 페이지가 포함된 익스텐트의 다음 익스텐트가 아닌 경우입니다. )

 Avg. Bytes free per page
    스캔된 페이지에서 사용 가능한 평균 바이트 수입니다. 이 값이 클수록 페이지의 채우기 비율이 낮으므로 값이 작을수록 좋습니다. 이 값은 행 크기에 따라 달라지며 행 크기가 크면 값이 커집니다.

 Avg. Page density (full) 평균 페이지 밀도입니다(단위: %). 이것은 행 크기를 고려한 값이므로 페이지의 채우기 비율을 더욱 정확하게 알 수 있습니다. 값이 클수록 좋습니다.

============================================================================

 DBCC SHOWCONTIG
     [    
  ( { table_name | table_id | view_name | view_id }
              [ , index_name | index_id ]
        )
     ]
      [ WITH {  ALL_INDEXES
                 |  FAST    -- 인덱스의 잎 또는 데이터 수준 페이지를 읽지 않음 (빠름)
   [ , ALL_INDEXES ]
                 |  TABLERESULTS   --결과를 추가 정보와 함께 행 집합으로 표시
   [ , { ALL_INDEXES } ]
                 [ , { FAST | ALL_LEVELS } ]
            }
     ]




============================================================================
22. DBCC SHRINKDATABASE

- 지정한 데이터베이스에서 데이터 파일의 크기를 축소시킴
- 파일 단위로 데이터 파일을 축소
- 데이터 파일과 로그파일의 대상 크기는 파일의 최소크기보다 작을수 없음
- NOTRUNCATE / TRUNCATEOLNY 는 데이터파일에는 적용되나 로그파일에는 적용되지 않는다.
============================================================================

 DBCC SHRINKDATABASE
      ( 데이터베이스이름 [ , 데이터베이스에 남겨둘 여유공간비율 ]

          [ , {   NOTRUNCATE  - 해제된 파일 공간을 데이터베이스 파일에서 보유
   |  TRUNCATEONLY  - 해제된 파일 공간을 운영체제에 반환
      }
  ]
     )



============================================================================
23. DBCC SHRINKFILE

- 관련 데이터베이스에 대해 지정한 데이터 파일이나 로그파일의 크기를 축소 시킴
============================================================================

 DBCC SHRINKFILE
      (  
  {
  파일이름 | 파일아이디 }
           { [ , 변경할크기 ]
               | [ ,
    {
     EMPTYFILE  -- 지정한 파일의 모든 데이터를 동일한 파일 그룹의 다른파일로 마이그레이션, 더 이상 데이터를 저장할 수 없음.
    |  NOTRUNCATE  -- 해제된 파일 공간을 파일에 보유
    |  TRUNCATEONLY  -- 해제된 파일 공간을 운영체제에 반환
    }
     ]
         }
     )



============================================================================
24. DBCC SQLPERF

- 모든 데이터베이스에서 트랜잭션 로그공간의 사용에 관한 통계를 제공


- DBCC SQLPERF(LOGSPACE)
 
 결과 집합
 
 Database Name   로그 통계가 표시될 데이터베이스의 이름입니다.
 Log Size(MB)   로그에 사용 가능한 실제 공간의 크기입니다. Microsoft�� SQL Server™는 내부 헤더 정보를 위해 적은 양의 디스크 공간을 예약하므로 이것은 로그 공간에 원래 할당된 크기보다 작습니다.
 Log Space Used (%)  로그 파일에서 현재 트랜잭션 로그 정보가 차지하는 비율입니다.
 Status    로그 파일의 상태입니다(항상 0임).


- DBCC SQLPERF(UMSSTATS) : This Option returns data about SQL Server thread management.

 결과 집합

 Statistic                        Value
 -------------------------------- ------------------------
 Scheduler ID                     0.0  
 num users                        18.0  -- This is the number of SQL Server threads currently in the scheduler.
 num runnable                     0.0  -- This is the number of actual SQL Server threads that are runnable.
 num workers                      13.0  -- This is the actual number of worker there are to process threads. (This is the size of the thread pool.)
 idle workers                     11.0  -- The number of workers that are currently idle.
 work queued                      0.0  
 cntxt switches                   2.2994396E+7 -- The number of context switches between runnable threads.
 cntxt switches(idle)             1.7793976E+7 -- The number of context switches to the idle thread.
 Scheduler ID                     1.0
 num users                        15.0
 num runnable                     0.0
 num workers                      13.0
 idle workers                     10.0
 work queued                      0.0
 cntxt switches                   2.4836728E+7
 cntxt switches(idle)             1.6275707E+7
 Scheduler ID                     2.0
 num users                        17.0
 num runnable                     0.0
 num workers                      12.0
 idle workers                     11.0
 work queued                      0.0
 cntxt switches                   1.1331447E+7
 cntxt switches(idle)             1.6273097E+7
 Scheduler ID                     3.0
 num users                        16.0
 num runnable                     0.0
 num workers                      12.0
 idle workers                     11.0
 work queued                      0.0
 cntxt switches                   1.1110251E+7
 cntxt switches(idle)             1.624729E+7
 Scheduler Switches               0.0
 Total Work                       3.1632352E+7



- DBCC SQLPERF(WAITSTATS) : This Option returns data about wait types for SQL Server  resources.

- DBCC SQLPERF(IOSTATS)  : This Option returns data about outstanding SQL Server  reads and writers.

- DBCC SQLPERF(RASTATS)  : SQL Server read-ahead activity

- DBCC SQLPERF(THREADS)  : I/O, CPU, and memory usage per SQL Server Thread.



============================================================================

 DBCC SQLPERF ( LOGSPACE )


============================================================================
25. DBCC TRACEON / TRACEOFF
 
- 지정한 추적플래그를 설정 / 해제

============================================================================

 DBCC TRACEON ( trace# [ ,...n ] )
 DBCC TRACEOFF ( trace# [ ,...n ] )


============================================================================
26. DBCC TRACESTATUS
 
- 추적 플래그의 상태를 표시
- DBCC TRACESTATUS(-1) 로 하면 모든 추적 플래그의 상태를 표시
============================================================================

 DBCC TRACESTATUS ( trace# [ ,...n ] )



============================================================================
27. DBCC UPDATEUSAGE
 
- sp_spaceused 시스템 저장프로시저에서 잘못된 공간 사용정보가 보고되도록 하는 sysindexes 테이블의 부정확성을 보고하고 수정
- 테이블과 클러스터된 인덱스에 대해 sysindexes 테이블의 rows, used, reserved, dpages 열을 수정함
============================================================================

 DBCC UPDATEUSAGE
     (     { 'database_name' | 0 }
          [ , { 'table_name' | 'view_name' }
          [ , { index_id | 'index_name' } ] ]
     )
      [
  WITH    
   [ COUNT_ROWS ]   -- sysindexes 의 rows 열이 테이블이나 뷰의 현재 행 개수로 업데이트되도록 지정함. 단 indid 가 0 또는 1 인 sysindexes 행에만 작용 (커다란테이블과 인덱스된 뷰의 성능에만 영향을 줌)
   [ , NO_INFOMSGS ]  -- 모든 정보 메시지를 표시하지 않음
        ]



============================================================================
28. DBCC USEROPTIONS
 
- 현재 연결에 활성화된 SET 옵션을 반환함
============================================================================

 DBCC USEROPTIONS


============================================================================
29. DBCC CACHESTATS
 
- 현재 버퍼캐시안에 있는 오프젝트에 대한 정보를 보여줌
 - hit rates
 - compiled objects and plans

- 결과집합
 - Hit Ratio : Displays the percentage of time that this particular object was found in SQL Server's cache.
     The bigger this number, the better

 - Object Count  : Displays the total number of objects of the specified type that are cached.

 - Avg. Cost : A value used by SQL Server that measures how long it takes to compile a plan, along with the amount of memory needed by the plan. This value is used by SQL Server to determine if the plan should be cached or not.

 - Avg. Pages  : Measures the total number of 8K pages used, on average, for cached objects.

 - LW Object Count, LW Avg Cost, WL Avg Stay, LW Ave Use :
   All these columns indicate how many of the specified objects have been removed from the cache by the Lazy Writer.
   The lower the figure, the better.


============================================================================

 DBCC CACHESTATS



============================================================================
30. DBCC ERRORLOG

- 현재의 에러로그를 TRUNCATE
- sp_cycle_errorlog 도 같은 역할
============================================================================

 DBCC ERRORLOG


============================================================================
31. DBCC FLUSHPROCINDB

- 지정한 데이터베이스에 있는 스토어드 프로시저 캐시를 지운다. (전체가아님)
============================================================================
 
 DBCC FLUSHPROCINDB (데이터베이스이름)


============================================================================
32. DBCC MEMORYSTATUS

- 버퍼 캐시안에 있는 메모리 상태를 보여줌
-
 Buffer Distribution
 Buffer Counts
 Procedure Cache
 Dynamic Memory Manager
 Global Memory Objects
 Query Memory Objects
 Optimization Queue

============================================================================
 
 DBCC MEMORYSTATUS


============================================================================
33. DBCC PAGE

- SQL Server 안에 저장된 데이터 페이지의 컨텐츠를 볼수 있는 명령
- View the data page structure

============================================================================
 
 DBCC PAGE (
   {dbid|dbname}
  ,  pagenum   - 페이지넘버
  [, print option ]  - 페이지 헤더 정보를 출력하는 옵션
       0 : This option causes DBCC PAGE to print out only the page header information. (default)
       1 : page header information, each row of information from the page, and then page's offset table.
       2 : the same as option 1, except a single block of information (rather then separating the individual rows)

  [, cache ]  - 0 : 디스크로부터 페이지 번호를 반환
        1 : 캐시로 부터 페이지 번호를 반환 (default)

  [, logical ]  - 0 : virtual page number
        1 : logical page number
    )



============================================================================
34. DBCC SQLMGRSTATS

- ad-hoc , prepared Transact-SQL 구문이 어떻게 캐싱이 되는 지를 알수 있도록 함
- 결과집합
 Memory Used (8k Pages) - 메모리 페이지의 사용량
 Number CSql Objects - 캐시된 전체 수
 Number False Hits - Hit 실패수 (적을수록 좋다)
============================================================================
 
 DBCC FLUSHPROCINDB (데이터베이스이름)


============================================================================
35. DBCC BUFFER

- This Command can be used to display buffer headers and pages from the buffer cache.

- ex )
 DBCC TRACEON (3604)
 DBCC BUFFER(master, 'sysobjects')
============================================================================
 
 DBCC BUFFER ( [dbid | dbname]
   [, objid | objname ]
   [, nbufs]  -- number of buffers to examine
   [, printopt ]
    -- 0 : print out only the buffer header and page header (default)
    -- 1 : print out each row separately and the offset table
    -- 2 : print out each row as a whole and the offset table
      )



============================================================================
36. DBCC BYTES

- This command can be used to dump out bytes from a specific address.

- ex )
 DBCC TRACEON (3604)
 DBCC BYTES (10000000, 100)
============================================================================

 DBCC BYTES (startaddress, length)


============================================================================
37. DBCC DBINFO

- Displays DBINFO structure form the specified database.

- ex )
 DBCC TRACEON (3604)
 DBCC DBINFO(master)
============================================================================

 DBCC DBINFO (dbname)


============================================================================
38. DBCC DBTABLE

- This command displays the contents of then DBTABLE structure.
- This parameter keeps track of how many users are in the database.

- ex )
 DBCC TRACEON (3604)
 DBCC DBTABLE (master)
============================================================================

 DBCC DBTABLE ( [ dbid | dbname ] )


============================================================================
39. DBCC DES

- Prints the contents of the specified DES(descriptor).

- ex )
 DBCC TRACEON (3604)
 DBCC DES
============================================================================

 DBCC DES


============================================================================
40. DBCC IND

- Shows all pages in use by indexes of the specified table.

- ex )
 DBCC TRACEON (3604)
 DBCC IND (master, sysobjects, 0)
============================================================================

 DBCC IND ( [dbid | dbname] , [objid | objname], printopt )


============================================================================
41. DBCC LOG

- This command is used to view the transaction log for the specified database.

- ex )
 DBCC TRACEON (3604)
 DBCC LOG (master)
============================================================================

 DBCC LOG (
   [ dbid | dbname ]
   [, type ]  -- 0 : minimum infomation (operation, context, transaction id)
      -- 1 : more information ( plus flags, tags, row length, description )
      -- 2 : very detailed infomation (plus object name, index name, page id, slot id)
      -- 3 : full information about each operation
      -- 4 : full information about each operation plus hexadecimal dump of then current transaction log's row
      -- -1 : full information about each operaion plus hexadecimal dump of then current transaction log's row, plus Checkpoint Begin, DB version, Max XDESID
   )    


============================================================================
42. DBCC PROCBUF

- This command displays procedure buffer headers and stored procedure headers from the procedure cache.

- ex )
 DBCC TRACEON (3604)
 DBCC PROCBUF (master, 'sp_help', 1, 0)
============================================================================

 DBCC PROCBUF (
    [ dbid | dbname ]
   , [ objid | objname ]
   , nbufs
   , printopt -- 0 : only the proc buff and proc header
      -- 1 : proc buff, proc header, and contents of buffer.
       )


============================================================================
43. DBCC PRTIPAGE

- This command prints the page number pointed to by each row on the specified index page.

- ex )
 DBCC TRACEON (3604)

 DECLARE @dbid  int
 , @objectid int
 select @dbid = DB_ID('master')
 select @objectid = object_id('sysobjects')

 DBCC PRTIPAGE (@dbid, @objectid, 1, 0)
============================================================================

 DBCC PRTIPAGE ( dbid, objid, indexid, indexpage )


============================================================================
44. DBCC PSS

- This command shows info about processes currently connected to the server.

- ex )
 DBCC TRACEON (3604)
 DBCC PSS
============================================================================

 DBCC PSS (
   suid
  , spid
  , printopt -- 0 : standard output
     -- 1 : all open DES's and current sequence tree
   )


============================================================================
45. DBCC RESOURCE

- This command shows the server's level RESOURCE, PERFMON, and DS_CONFIG information.
 RESOURCE - shows addresses of various data structures used by the server.
 PERFMON  - structure contains master..spt_monitor field info.
 DS_CONFIG - structure contains master..syscurconfigs field information.

- ex )
 DBCC TRACEON (3604)
 DBCC RESOURCE
============================================================================

 DBCC RESOURCE


============================================================================
46. DBCC TAB

- view the data pages structure (in comparison with DBCC PAGE, this command will return information about all data pages for viewed table, not only for particular number)

- ex )
 DBCC TRACEON (3604)

 DECLARE @dbid  int
 , @objectid int
 select @dbid = DB_ID('master')
 select @objectid = OBJECT_ID('sysdatabases')

 DBCC TAB (@dbid, @objectid)
============================================================================

 DBCC TAB(dbid, objid)

2009/04/16 00:18 2009/04/16 00:18
master 및 기타 db 모두 옮긴다고 삽질을 좀 했습니다.
저같은 분을 위해 적어봤습니다. MSSQL 2000에서 한것이라
2005에서는 약간 달라질수 있으나 기본 개념은 변하지 않았으니
특별히 문제가 되는 부분은 없을겁니다.

전제사항
백업 된 데이터에서 이전 또는 복구 하기 위해서는
쿼리 분석기에서 select @@version 또는 exec master.dbo.xp_msver 쿼리 결과등을 통해 보여지는
MSSQL 백업시의 MSSQL과 이전대상의 MSSQL 버젼이 동일해야 한다.
서비스팩이 다르면 서비스팩도 동일해야 한다.
이 부분때문에 제가 삽질을 좀했습니다 ㅡㅡ;;

1. 원본 백업
    쿼리 브라우저에서 아래의 쿼리 형태를 실행
    BACKUP DATABASE master TO DISK = 'D:/sqlbackup/master.backup' WITH INIT;
    BACKUP DATABASE model TO DISK = 'D:/sqlbackup/model.backup' WITH INIT;
    BACKUP DATABASE msdb TO DISK = 'D:/sqlbackup/msdb.backup' WITH INIT;
    BACKUP DATABASE Northwind TO DISK = 'D:/sqlbackup/Northwind.backup' WITH INIT;
    BACKUP DATABASE pubs TO DISK = 'D:/sqlbackup/pubs.backup' WITH INIT;
    BACKUP DATABASE web1 TO DISK = 'D:/sqlbackup/web1.backup' WITH INIT;
    BACKUP DATABASE Web2 TO DISK = 'D:/sqlbackup/Web2.backup' WITH INIT;
    ....

2. cmd 실행후
    2001 인 경우 : C:\Program Files\Microsoft SQL Server\MSSQL\Binn 디렉토리로 이동
    2005 인 경우 : C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Binn 디렉토리로 이동

3. MS SQL 관련서비스 모두 종료
    cmd 명령어 => net stop mssqlserver
    SQLEXPRESS 의 경우 net stop "SQL Server (SQLEXPRESS)"

4. sqlservr -m 또는 net start mssqlserver /m 명령 실행
    SQLEXPRESS 의 경우 net start "SQL Server (SQLEXPRESS)" /m 으로 실행

5. SQL 접속
    2000 인 경우 : 쿼리 분석기
    2005 인 경우 : cmd => sqlcmd -E 명령 실행

6. master 디비 복원
    RESTORE DATABASE master FROM DISK = 'D:/sqlbackup/master.backup';
    복원이 정상적으로 되면 sql 이 종료 됩니다.

7. SQL Server 다시 실행

8. 기타 데이터베이스 복구
    - 백업화일로 복구하는 경우
    RESTORE DATABASE model FROM DISK = 'D:/sqlbackup/model.backup';
    RESTORE DATABASE msdb FROM DISK = 'D:/sqlbackup/msdb.backup';
    RESTORE DATABASE Northwind FROM DISK = 'D:/sqlbackup/Northwind.backup';
    RESTORE DATABASE pubs FROM DISK = 'D:/sqlbackup/pubs.backup';
    RESTORE DATABASE web1 FROM DISK = 'D:/sqlbackup/web1.backup';
    RESTORE DATABASE Web2 FROM DISK = 'D:/sqlbackup/Web2.backup';
    ...

    - mdf ldf 파일로 복구하는 경우
    해당 db의 mdf ldf 을
    C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data(2000) 또는
    C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data(2005) 로
    복사해 붙여넣기 한다음

    exec sp_attach_db 'DB명'
    ,'C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data\DB명.mdf',
    'C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data\DB명_log.ldf'
    를 실행
2009/04/12 17:33 2009/04/12 17:33