http://www.sqler.com/344564
자동화된 SQL Injection 공격을 통한
악성코드 대량 삽입 수법 분석
관련 자료입니다.
2월 10일 세미나에서도 거론했었죠.
http://www.sqler.com/344564
자동화된 SQL Injection 공격을 통한
악성코드 대량 삽입 수법 분석
관련 자료입니다.
2월 10일 세미나에서도 거론했었죠.
SSMS 단축키 모음입니다.
단축키 |
동작 |
ALT |
SSMS 메뉴바로 이동Move to the SQL Server Management Studio menu bar |
ALT+HYPHEN |
도구상자 메뉴 활성화(실제로는 도구상자에서 펼친 창 닫기) |
SHIFT+F10 |
컨텍스트 메뉴 표시(오른쪽 마우스 버튼과 동일) |
CTRL+N |
새 파일(새 창) 표시 |
CTRL+SHIFT+N |
새 프로젝트 만들기 |
CTRL+O |
파일 열기 |
CTRL+SHIFT+O |
프로젝트 열기 |
CTRL+SHIFT+A |
현재 프로젝트에 새 항목 추가 |
ALT+SHIFT+A |
현재 프로젝트에 기존 항목 추가 |
CTRL+SHIFT+Q |
쿼리 디자이너 표시 |
ESC |
취소 또는 메뉴 닫기 |
CTRL-SHIFT-F2 |
책갈피 초기화 |
CTRL+F2 |
책갈피 삽입 또는 삭제(토글) |
F2 |
다음 책갈피 가기 |
SHIFT+F2 |
이전 책갈피 가기 |
ALT+BREAK |
쿼리 취소 |
CTRL+O |
연결 (실제로는 파일 열기?) |
CTRL+F4 |
연결 끊기 |
ALT+F4 |
하위연결 끊고 닫기 |
ALT+F1 |
데이터베이스 객체 정보(객체 선택 후 실행) |
CTRL+SHIFT+DEL |
현재 편집기의 영역 초기화(내용이 사라짐) |
CTRL+K+C (2000 : CTRL+SHIFT+C) |
주석 추가 |
CTRL+C or Ctrl+Insert |
복사 |
CTRL+X or Shift+Del |
잘라내기 |
SHIFT+TAB |
탭 줄이기(이전 탭 위치로) |
CTRL+DEL |
블록 삭제 |
CTRL+F |
찾기 |
CTRL+G |
지정한 줄 위치로 이동 |
TAB |
탭 추가 |
CTRL+SHIFT+L |
선택영역을 소문자로 |
CTRL+SHIFT+U |
선택영역을 대문자로 |
CTRL+V or Shift+Insert |
붙여넣기 |
CTRL+K+U |
주석 제거 |
F3 |
가장 최근에 검색했던 문자검색 재실행 |
CTRL+H |
바꾸기 |
CTRL+A |
전체선택 |
CTRL+Z |
실행취소 |
F5 or Ctrl + E |
쿼리 실행하기 (선택영역이 있으면 선택한 곳만) |
F1 |
도움말 |
SHIFT+F1 |
현재 선택한 구문의 도움말 |
F6 |
쿼리 영역과 결과영역 커서 변경(커서의 위치가 바뀜) |
Shift+F6 |
영역 변경 (편집 창에서는 위와 동일) |
CTRL+W |
열린 창 선택하기 |
CTRL+N |
새 쿼리 창 |
F8 |
개체 탐색기 보이기/감추기(토글) |
F4 |
객체 찾기 |
CTRL+F5 |
구문 검사(실행하지 않고 구문오류만 검사함) |
CTRL+P |
출력 |
CTRL+D |
그리드(표) 형태로 결과물 출력 |
CTRL+T |
텍스트 형태로 결과물 출력 |
CTRL+B |
창 나누기 이동 |
CTRL+SHIFT+F |
결과물을 파일로 저장하기 |
CTRL+R |
결과창 보이기/감추기(토글) |
CTRL+S |
쿼리 저장하기 |
CTRL+SHIFT+INSERT |
템플릿 삽입 |
CTRL+SHIFT+M |
템플릿 바꾸기 |
CTRL+L |
예상실행계획 보이기 |
CTRL+K |
실행계획 보이기/감추기(토글) |
CTRL+I |
인덱스 튜닝 마법사 실행 |
CTRL+SHIFT+S |
클라이언트 통계 표시(실제로는 다른이름으로 저장?) |
CTRL+SHIFT+T |
서버 통계 표시(실제로는 앞 구문과 뒷 구문 치환?) |
CTRL+U |
사용할 데이터베이스 변경 드롭다운리스트로 이동 |
쓸만한게 없네 윤선식입니다.
여러군데 나온 적 있는 .NET CLR을 사용한 음력/양력 달력 만들기를 간단하게 설명하고자 합니다.
1. 새 프로젝트로 데이터베이스의 SQL CLR 프로젝트로 만듭니다.
2. 이 때 SQL 연결설정을 해 주셔야 합니다. SQL Server Project는 SQL 2005 이상이어야 합니다.
3. 프로젝트를 생성하면 클래스가 나옵니다. 이 때 다음과 같이 .NET Code를 넣어주시면 됩니다.
음력/양력 변환 소스인데요. 원리는 여러 군데 게시판에 있으니 설명을 생략하겠습니다.
using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
using System.Globalization;
public partial class UserDefinedFunctions
{
[Microsoft.SqlServer.Server.SqlFunction]
public static SqlDateTime Udf_Lunar2Solar(SqlDateTime sDt)
{
DateTime dt = (DateTime)sDt;
bool bExistLeap = false;
KoreanLunisolarCalendar kr_Lunnar = new KoreanLunisolarCalendar();
int _lunnarYY = kr_Lunnar.GetYear(dt);
int _lunnarMM = kr_Lunnar.GetMonth(dt);
int _lunnarDD = kr_Lunnar.GetDayOfMonth(dt);
if (kr_Lunnar.GetMonthsInYear(_lunnarYY) > 12)
{
bExistLeap = kr_Lunnar.IsLeapMonth(_lunnarYY, _lunnarMM);
int intLeap_mm = kr_Lunnar.GetLeapMonth(_lunnarYY);
if (_lunnarMM >= intLeap_mm)
{
_lunnarMM--;
}
}
return Convert.ToDateTime(_lunnarYY.ToString() + "-" + _lunnarMM.ToString() + "-" + _lunnarDD.ToString());
}
};
SET NOCOUNT ON;
USE master;
EXEC sp_configure 'clr enabled', 1;
RECONFIGURE;
GO
5. 위와 같이 CLR을 사용하게 변경하고 나서 해당 Assembly를 DB에 등록합니다.
use TestDB
Go
CREATE ASSEMBLY UDF_Lunar2Solar
FROM 'D:\SQLNetProjects\UDF_Lunar2Solar\UDF_Lunar2Solar\bin\Debug\UDF_Lunar2Solar.dll'
WITH PERMISSION_SET = SAFE;
CREATE FUNCTION UFN_Lunar2Solar (@sDt as DATETIME)
RETURNS DateTime
AS EXTERNAL NAME UDF_Lunar2Solar.UserDefinedFunctions.Udf_Lunar2Solar
GO
6. Assembly를 Function에 정상적으로 등록하고 나면 Function으로 사용이 가능합니다.
with sTB as (
select x = dbo.UFN_Lunar2Solar(cast('1985-03-19' as datetime))
, y = dbo.UFN_Lunar2Solar('19850319')
, z = dbo.UFN_Lunar2Solar('1985/03/19')
)
select * from sTB
* 결과
x y z
----------------------- ----------------------- -----------------------
1985-01-28 00:00:00.000 1985-01-28 00:00:00.000 1985-01-28 00:00:00.000
(1개 행이 영향을 받음)
이상입니다.
Isolation Level 중 Snapshot 설명입니다.
큰 이미지 파일은 첨부파일을 보시면 됩니다.
1. Session 1.
- DB 옵션에서 SNAPSHOT 격리수준을 사용가능하도록 변경합니다.
2. Session 1.
- 테이블을 생성합니다.
3. Session 1.
- 임의의 데이터를 넣습니다. SEQ 10만 보시면 됩니다.
4. Session 1.
- 트랜잭션을 시작하면서 10의 "가"를 "ABC"로 변경합니다.
5. Session 1.
- SELECT 해 보면 "ABC"로 나옵니다.
6. Session 2.
- 격리수준을 SNAPSHOT으로 설정합니다.
7. Session 2.
- 트랜잭션을 시작하고, SEQ 10을 SELECT 해 보면 이전 값인 "가"가 표시됩니다.
8. Session 1.
- Session 1의 Update한 내역을 Commit합니다.
9. Session 1.
- Session 1에서 "10"의 값을 가져오면 당연히 변경된 "ABC"로 가져옵니다.
10. Session 2.
- Session 2에서 "10"의 값을 SELECT 하면 여전히 이전 값인 "가"입니다.
11. Session 2.
- Commit합니다. 이렇게 되면 Session2의 트랜잭션도 종료됩니다.
12. Session 2.
- 이제 "10"을 SELECT하면 변경된 값인 "ABC"로 가져옵니다.
즉, SNAPSHOT은 다른 트랜잭션의 종료유무와 상관없이 해당 트랜잭션에서는 동일한 값이 유지됨을 알 수 있습니다.
이상입니다.
저 또한 처음 SQL을 시작할 때에는 제 마음대로 이름을 적곤 했지만,
시간이 지나면 지날수록 정말 보기 힘들다는 것을 알게 되죠.
물론 sysobjects 명령어를 사용해서 가져오면 되지만,
명명규칙을 정하고 나면, Object 이름만 봐도 무엇인지 알 수 있게 됩니다.
회사마다 차이점은 있겠지만, 일반적인 개체 명명 방법은 이렇습니다.
1. Object 앞에 접두사 또는 뒤에 접미어 사용 : Upper Case
2. Camel Case 와 _ 사용
Object |
접두어 또는 접미어 |
Example |
User Table |
TB_ |
TB_Order |
User Function |
UDF_ 또는 UF_ |
UDF_Get_PackSize |
Stored Procedure |
USP_ 또는 UP_ |
USP_Select_AllPacket |
View |
VW_ 또는 UV_ |
VW_UserHistory |
Partitioned View |
PV_ |
PV_OrginalCustomer |
Trigger |
TRI_ / TRU_ / TRIU_ etc |
TRI_TB_Order |
Primary Key |
PK_ |
PK_TB_User |
Foreign Key |
FK_ |
FK_TB_User_TB_Order_001 |
Constraint |
CT_ |
CT_TB_User_MEM_ID |
User Defined Type |
UT_ 또는 UD_ |
UT_REM_001 |
Index (Nonclustered) |
IDX_ 또는 IX_ |
IX_TB_User_001 |
접두어 또는 접미어 이외에는 보통 다음과 같은 규칙을 적용합니다.
1. 테이블에 속해 있는 경우 테이블명 표시
- FK는 주/종 관계를 표시
- 제약조건은 해당 컬럼명 표시 : _CK / _DF / _UN 등의 접미어 표현 또는 아예 이를 접두사로 사용하는 경우도 많습니다.
- Index : Clustered Index인 경우 Primary Key가 아니면 _C 를 붙이기도 합니다.
- Trigger : Insert / Update / Delete 등의 행위를 보통 접두어에 포함합니다.
2. 함수나 프로시저 등은 그 성격을 그대로 표시
- 함수는 동사(Action) + 반환(Return) 으로 표시하거나 그 반대로 표시 : 정하기 나름
- 프로시저는 업무의 성격이나 로직의 Action을 담는 경우가 많습니다.(CRUD)
è UP_Select_~~~ / UP_Delete_~~~ / UP_Make_~~~
정말 회사마다 차이점이 있습니다. 이게 정답은 아니니… 오해 마시길.~