Post List

레이블이 Database_Basic인 게시물을 표시합니다. 모든 게시물 표시
레이블이 Database_Basic인 게시물을 표시합니다. 모든 게시물 표시

2015년 1월 9일 금요일

MS-SQL 숫자형식 왼쪽 0으로 채우기

UPDATE AAA
SET BBB = REPLICATE('0', 5 - LEN(BBB)) + BBB

또는




Update AAA
SET BBB = Right('00000' + BBB, 5)

MS-ACCESS DB] mdb 파일 암호설정 및 C#에서 접근하기

MDB를 사용하는데 있어서 다른 사용자가 열지 못하게 하여 어느정도의 보안이 가능합니다.

1.ACCESS 실행한다.

2.열기->파일선택->파일선택 후 -> 열기 버튼에서 ▼를 눌러서 단독으로 열기 모드 선택




3.데이터베이스 도구 -> 데이터베이스 암호 설정



*해제는 동일한 방법으로 열어서 3번에서 데이터베이스 암호 해제를 하면 됩니다~

1. 암호가 설정된 파일을 C#에서 로드시 연결구문을 아래와 같이 설정합니다.






출처 : http://hongjinhyeon.tistory.com/7

Database 보안

작가
김규백
출판
프리렉
발매
2013.05.07
평점

오라클 데이터베이스 보안이란 책을 읽고 그중 Database 보안에 대한 내용을 정리해 보았다.

 통상적으로 Software 개발시 처음에는 성능, 안정성을 우선하여 개발한다. DBMS 역시 마찬가지다. 처음부터 보안적인 부분까지 고려하여 개발하기란 쉽지 않다. 그래서 DBMS 중에 보안에 대한 취약성이 있는 경우가 많다.

 국내 Database 보안사고 사례를 보면 70%는 내부망에서 일어났으며, 그 중 90%는 내부인의 소행이다.

 Database 보안을 적용하기에 앞서 기본이 되는 지침들이 있다.

 첫째, 보안패치를 실행한다. D/B는 그 특성상 동작을 멈추고 보안패치를 실행하기가 쉽지 않은데, 패치하기 전까지는 해당 위험에 노출되어 있으니 각별히 신경을 써야 한다.

 둘째, 사용안하는 계정은 잠그며, 비밀번호도 만료시켜야 한다.

 셋째, 비밀번호 정책을 강화한다.

 넷째, 의심스러운 작업을 모니터링 해야 한다.

 다섯째, 계정, 패스워드는 절대로 Text 형태로 저장하여서는 안된다.

* Database 보안의 영역

1. 암호화(Encryption)

 - 민감한 Data는 암호화하여 처리한다. Database 설정뿐 아니라 응용 프로그램까지 수정해야 하므로 적용이 귀찮다.
 - Column Level 암호화, Table Space 암호화 설정
 - Data Masking : 원본 Data를 알아 볼 수 없도록 변조
 - Backup 암호화 : Backup Data 로 개인정보가 유출되는 사례가 많다.

2. 접근제어(Access Control)

 - SQL 명령어 실행 통제
 - 보안영역 설정 : 특정 Group/사용자만 특정 영역에 접근가능 (심지어 DBA도 접근불가하게 설정)
 - 행단위 접근제어 : 한개의 Table에 대해서도 자기 부서 정보만 열람 가능하도록 설정
 - Level 지정 접근제어 : 해당 Level 이상의 권한이 있는 사람만 열람 가능하도록 설정
 - 접속유형 제한 : IP, 사용자, 시간 등
 - 보안위반사항 알림 : 관리자에게 자동 e-mail 전송 등...
 - 보고서 생성

3. 감사(Audit)

 - 감사대상 선정 -> 수집방안 -> 소스 Database 설정 -> 수집기 설정 -> 보고서 Data 생성 -> 경보 설정

* SQL Injection

 - D/B 보안 솔루션 만으로는 해결이 힘들다.
 - Application 개발시 신경써야 한다. Parameter 처리 -> Bind Variable 사용
 - DBMS 보안에서 고려사항 : 최소한의 권한 부여, 보안 영역 보호, 명령어 원천 차단, 대량 정보 조회 감사

* 10가지 Database 보안 위험

 1. 과도한 권한에 의한 남용 (Excessive Privilege Abuse)
 2. 정당한 권한에 의한 남용 (Legitimate Privilege Abuse)
 3. 권한 상승 (Privilege Elevation)
 4. 플랫폼 취약성 (Platform Vulnerabilities)
 5. SQL Injection
 6. 약한 감사 기능 (Weak Audit Trail)
 7. DoS (Deniel of Service)
 8. 데이터베이스 프로토콜 오류 (Database Communication Protocol Vulnerabilities)
 9. 약한 인증 (Weak Authentication)
10. 백업 데이터 노출 (Backup Data Exposure)


블로거의 오늘의 책에 참여한 포스트 입니다

Table의 Column 을 변경하고자 할때...

ex)

1. 먼저 해당 테이블의 INDEX , CONSTRAINT  모든 제약사항들을 삭제

DROP INDEX IDX_01 ON xpc_YTarget
ALTER TABLE xpc_YTarget DROP CONSTRAINT FK_xpc_YTarget_ProductSizeCode

2. Column 명 변경

SP_RENAME  'xpc_YTarget.ProductSizeCode','ModelCode','COLUMN'

3. Column Data형 변경

ALTER TABLE xpc_YTarget ALTER COLUMN ModelCode CHAR(15) NOT NULL;

4. 제약사항에 맞게 Data 수정

UPDATE xpc_YTarget SET ModelCode = 'CL10C101JB8NNNC'

5. 제약사항 추가

ALTER TABLE xpc_YTarget ADD CONSTRAINT FK_xpc_YTarget_ModelCode FOREIGN KEY (ModelCode) REFERENCES xpc_Model(ModelCode)

6. INDEX  생성




CREATE UNIQUE INDEX IDX_01 ON xpc_YTarget(ModelCode, ProcessCode, InspectCode);

INSERT SELECT : 테이블 복사

 INSERT 테이블2
             SELECT 컬럼1, 컬럼2, 컬럼3
                FROM 테이블1

테이블1의 컬럼1,2,3 을 테이블2 로 복사한다.
물론 컬럼1,2,3은 테이블2에도 같은 이름으로 존재하여야 한다.

다른 Database의 Category끼리도 복사가 가능하다.

예를 들어서

INSERT CAT_B.dbo.TB_USER
           SELECT Name, Age, Address
              FROM CAT_A.dbo.TB_USER


GROUP BY 와 HAVING 절

WHERE 필터를 통한 후 파생된 입력 테이블 GROUP BY 절에 그룹화하고 또한 HAVING 절을 사용하여 필요없는 그룹을 제거할 수 있습니다.
SELECT select_list
    FROM ...
    [WHERE ...]
    GROUP BY grouping_column_reference [, grouping_column_reference]...
 GROUP BY 절 은 테이블에서 선택된 모든 열에서 같은 값을 소유한 행을 그룹화하는 데 사용됩니다. 열의 열거 순서는 상관 없습니다. 이것은 일반적인 값을 가지는 각각의 행 집합을 그룹 내의 모든 행을 대표하는 1 개의 그룹 행에 정리 효과가 있습니다. 그러면 출력 중복을 제거하고, 또한 이들 그룹에 적용되는 집계가 계산됩니다. 예를 들면 다음과 같습니다.
=> SELECT * FROM test1;
 x | y
---+---
 a | 3
 c | 2
 b | 5
 a | 1
(4 rows)

=> SELECT x FROM test1 GROUP BY x;
 x
---
 a
 b
 c
(3 rows)

2 번째 질의는 SELECT * FROM test1 GROUP BY x로 쓸 수 없습니다. 각 그룹에 관련된 열 y의 값이 없기 때문입니다. 그룹마다 하나의 값을 가지므로, 선택 목록에서 GROUP BY에 지정된 열을 참조할 수 있습니다.
일반적으로 테이블이 그룹화되는 경우, GROUP BY에 열거되지 않은 열은 집계 식을 제외하고 볼 수 없습니다. 집계식의 예는 다음과 같습니다.
=> SELECT x, sum(y) FROM test1 GROUP BY x;
 x | sum
---+-----
 a |   4
 b |   5
 c |   2
(3 rows) 
위에서 sum()은 그룹 전체에 대해 단일 값을 계산하는 집계 함수입니다. 사용할 수 있는 집계 함수에 대한 자세한 내용은 섹션 9.18 을 참조하십시오.
Tip : 집계식을 사용하지 그룹화는 열의 중복되지 않는 값의 집합을 효율적으로 계산합니다. 이것은 DISTINCT 절의 사용과 동일합니다 ( 섹션 7.3.3 을 참조하십시오).
다른 예입니다. 이것은 각 제품의 총 매출을 계산합니다 (모든 제품의 총 매출이 아닙니다.)
SELECT product_id, p.name, (sum(s.units) * p.price) AS sales
    FROM products p LEFT JOIN sales s USING (product_id)
    GROUP BY product_id, p.name, p.price; 
이 예제에서는 product_id 열, p.name 열, p.price 열은 반드시 GROUP BY 절에 지정해야 합니다. 왜냐하면 이들은 문의 선택 목록에서 사용되고 있기 때문입니다.  (products 테이블을 어떻게 설정 하느냐에 따라 이름과 가격을 전부 product ID에 종속시킬 수 있으므로 이론적으로 이들을 그룹화 할 필요를 없앨 수 있습니다. 그러나, 이것은 구현 되지 않았습니다.) s.units 열은 GROUP BY로 지정할 필요가 없습니다. 이것은 각 제품의 매출 계산 집약 식 ( sum(...) ) 안에서만 사용되기 때문입니다. 이 질문은 각 제품에 대해  제품의 전체 판매에 관한 전체 행을 반환합니다.
제한된 SQL에서 GROUP BY는 원본 테이블의 열에 의해서만 그룹화할 수 있지만, PostgreSQL에서는 선택 목록의 열 그룹화도 할 수 있게 확장되어 있습니다. 단훈한 열 이름 대신 평가 식에서 그룹화 할 수 있습니다.
GROUP BY를 사용하여 그룹화된 테이블에서 특정 그룹만 필요한 경우, 결과에서 불필요한 그룹을 제거하기 위하여, WHERE 절과 같이 HAVING 절을 사용할 수 있습니다. 구문은 다음과 같습니다.
 SELECT select_list FROM ... [WHERE ...] GROUP BY ... HAVING boolean_expression 
HAVING 절의 식은 그룹화된 식과 그룹화되지 않은 식 (이 경우에는 집계 함수가 필요합니다)을 모두 볼 수 있습니다.
예 입니다.
=> SELECT x, sum(y) FROM test1 GROUP BY x HAVING sum(y) > 3;
 x | sum
---+-----
 a |   4
 b |   5
(2 rows)

=> SELECT x, sum(y) FROM test1 GROUP BY x HAVING x < 'c';
 x | sum
---+-----
 a |   4
 b |   5
(2 rows) 

이제 더 현실적인 예입니다.
SELECT product_id, p.name, (sum(s.units) * (p.price - p.cost)) AS profit
    FROM products p LEFT JOIN sales s USING (product_id)
    WHERE s.date > CURRENT_DATE - INTERVAL '4 weeks'
    GROUP BY product_id, p.name, p.price, p.cost
    HAVING sum(p.price * s.units) > 5000;
위의 예에서, WHERE 절은 그룹화되지 않은 열을 기준으로 행을 선택하고 있는 (이 식은 최근 4 주간의 매출만이 참입니다) 반면, HAVING 은 출력을 매출이 5000 초과의 그룹으로 제한하고 있습니다. 집계식이 문의에서 항상 같을 필요가 없다는 것에주의하십시오.
몇몇 질문이 집계 함수를 포함하고 있으면 GROUP BY 절이 없어도, 그룹화는 여전히 발생합니다. 결과는 단일 그룹 행 (또는 HAVING에서 단일 행이 삭제되면 행이 아마 완전히 없어지는)입니다. HAVING 절을 포함하는 경우, 어떤 집계 함수 호출 또는 GROUP BY 절이 존재하지 않더라도 마찬가지입니다.

출처 카빙's 세상살이 | 카빙
원문 http://kngt13.blog.me/80129263749
 

Constraint 제약조건 (primary, foreign , unique,check, default)

1.무결성 제약조건 6가지
 1) primarty key
 2)foreign key
 3)unique
 4)check
 5)default 정의
 6)null 값허용


2.primary key(기본키)
 1)crate 시 생성
 ㄱ)  create table usertb1 (userid nchar(8) not null primary key, ........)--제약조건 자동생성됨
 ㄴ) create table usertb1(userid nchart(8) not null constraint pk_userid primary key, ....) -- 제약조건 이름 강제 설정

2) alter (수정)시 생성
alter table usertb1
add constraint pk_userid --제약조건 이름 설정
primary key (userid) --userid를 기본키로 설정

단, userid(기본키 설정할려는 항목)이  null일경우 에러가남
그럴경우 먼저. not null로 변경해줘야함

예) alter table usertb1
     alter column userid nchar(8) not null

cf)identity 속성으로 지정한경우 자동 not null 임

3.foreign key(외래키)
 1) craete 시 생성
ㄱ)create table buytb1 ( num int not null primary key, userid  nchar(8) not null foreign key reperences usertb1(userid), ...)
ㄴ)create table buytb1 ( num int not null primary key, userid nchar(8) not null  constraint fk_usertb1_buytb1 foreign key reperences usertb1(userid)..)

2)alter 사용
alter table buytb1
add constraint fk_usertb1_buytb1--제약조건 이름 설정
foreign key (userid) - 참조키 설정(buytb1의 항목)
references usertb1(userid) -- 참조할 기본키
on update cascade-- usertb1의 기본키가 변경될시 buytb1의 userid도 자동변경
on delete cascade -- 기준테이블에 삭제일어날경우 외래키테이불도 삭제가 일어나도록 설정


단, 만약 usertb1 의 userid 와 buytb1의 userid 에 일치하지 않은 항목이 있으면. 에러남
그런경우 동일하지 않은 기존데이터를 무시하고 키설정
alter table buytb1 with nocheck -- with nocheck 속성 추가


4.unique 제약조건
중복되지 않는 유일한 값을 입력해야함 (null허용 , 단 중복되면 안됨으로 1개의 null만 허용)

1)create 시 생성
create table usertb1 (userid ............addr nchar(30) null unique)
create table usertb1(userid........ addr nchar(30) null constraint ak_addr unique)
create table usertb1(userid.... addr nchar(30) null, constraint ak_addr unique(addr)) -- 먼저 생성후 별도로 제약조건 추가

2)alter 사용
alter table usertb1
add constraint ak_addr --제약조건 이름 설정

unique(addr)


5.check 제약조건
check 제약조건은 입력되는 데이터를 점검하는 기능을 수행한다
(예 전화번호 국번, 출생년도 조절)

1) 예제1
출생년도가 1900년 이후 그리고 현재의 연도 이전
alter table usertb1
add constraint ck_birthYear
check
(birthyear >= 1900 and birthyear <= year(getdate()))

2)예제2
전화번호 국번 제약
alter table usertb1
add constraint ck_mobile1
check
(mobile1 in ('010', '011', '016', '017', '018', '019'))

3) with nocheck 옵션
전화번호 국번 제약조건을 걸때 이미 012라는 번호가 들어있는경우
국번체크 제약조건에 위배되지만 . 무시하고 넘어갈때 사용
alter table usertb1
with nocheck
add constraint ck_mobile1
check(mobile in ('010', '011', '016', '017', '018', '019'))

6.default 정의
default 정의는 데티너를 입력하지않았을때 자동으로 입력되는 디폴드 값을 정의 하는 방법이다
1)create시 정의
create table usertb1( userid .... birthYear int not null default year(getdate()), addr nchar(2) not null default '서울')

2)alter사용(for 문 사용해야함)
alter table usrtb1
add constraint cd_addr
default year(getdate()) for birthYear
go

3)insert시 default사용
insert into usertb1 valuse('wjn',.......default, defalut) --디폴트값사용
insert into usertb1 (userid, name ) values('wtw'.'우태운') --열이름이 명시되지않으면 default로 설정된값이 해당열에 자동입력됨
insert into usertb1valuse('hyh',......'1965','경기') --  값이 직접 명기되면 default 값은 무시됨


7.제약조건 삭제

alter table usertb1
drop constraint 제약조건이름

단,pk는 fk먼저 삭제해야함




cf)현재 table의  constraint 보기  :  exec sp_help table이름