캠핑과 개발

SQL Developer에서 변수를 사용할 일이 있어 방법을 정리한다.

 

 

1. 테이블에 변수 선언 예시

--변수 선언
DEFINE PARAM_TABLE_NM = 'TB_USER';

--쿼리 질의
SELECT * 
FROM &PARAM_TABLE_NM;

--변수 해제
UNDEFINE PARAM_TABLE_NM;

 

2. 테이블 & 컬럼명 변수 예시

-- 변수 선언
DEFINE PARAM_TABLE_NM = 'TB_USER';
DEFINE PARAM_COLUMN_NM = 'USER_NAME';

--쿼리 질의
SELECT &PARAM_COLUMN_NM
FROM &PARAM_TABLE_NM;

--변수 해제
UNDEFINE PARAM_TABLE_NM;
UNDEFINE PARAM_COLUMN_NM;

 

3. 테이블 & 컬럼명 & 값에 변수 지정 예시

조건 값의 문자열 변수를 사용할 경우 ''로 감싸서 사용한다.

--변수 선언
DEFINE PARAM_TABLE_NM = 'TB_USER';
DEFINE PARAM_COLUMN_NM = 'USER_INNB';
DEFINE PARAM_USER_IDX = 11;

--쿼리 질의
SELECT &PARAM_COLUMN_NM
FROM &PARAM_TABLE_NM
WHERE &PARAM_COLUMN_NM = '&PARAM_USER_IDX';

--변수 해제
UNDEFINE PARAM_TABLE_NM;
UNDEFINE PARAM_COLUMN_NM;
UNDEFINE PARAM_USER_IDX;

SQL Developer Data Modeler 명명 표준은 모든 이름에 사용 된 용어 (부분)는 용어집에 정의되어 있습니다. 용어집은 유효성 검증 및 이름 변환 프로세스 중에 사용됩니다. 정의 된 용어가 없으면 번역이 수행되지 않습니다.


용어 정의

하나 이상의 용어집을 유효성 검사 용어집으로 정의 할 수 있습니다. 둘 이상의 용어집이있는 경우 정의 된 용어집 중 하나를 사용하여 유효성을 검사 할 수있는 경우 이름은 유효한 것으로 간주됩니다.

서로 다른 용어집을 사용하여 개별 도메인 (영역)을 나타낼 수 있습니다.

그러나 많은 용어집을 함께 사용하면 예측 프로세스에서 약어를 사용할 때 예기치 않은 결과가 발생할 수 있습니다.

예 : AP는 'Accounts-Payable'일 수 있지만 다른 용어집에 정의 된 경우 '실제 게재 위치'와 일치 할 수 있습니다.

유효성 검사 프로세스에 사용되는 용어집을 추가하려면 추가 단추를 선택하고 추가 용어집을 포함하십시오.



용어집 편집기 사용

새 또는 기존 용어집을 이름 지정 표준 목록에 추가하여 사용할 수 있습니다.

SQL Developer Data Modeler는 Glossary Editor를 사용하여 새로운 용어집을 작성하는 기능을 제공합니다.

편집기를 호출하려면 Tools -> Glossary Editor를 선택합니다. 편집기를 사용하여 독창적 인 용어로 고유 한 용어집을 가져 오거나 정의 할 수 있으며 한 단어 또는 여러 단어를 사용하여 각 용어를 기본 또는 클래스 단어, 수정 자 또는 한정자 또는 이들의 조합으로 분류 할 수 있습니다.

각 용어에 대한 약어, 대체 약어 및 간단한 설명을 정의 할 수도 있습니다.

편집기를 사용할 때 처음부터 용어집을 작성하거나 다른 SQL Developer Data Modeler 용어집 파일에서 정의를 가져 와서 수정할 수 있습니다.

이름과 설명 외에도 다음 옵션을 설정할 수 있습니다.


Incomplete Modifiers: 기본 가정은 이름에 사용 된 모든 용어가 용어집에 정의되어야한다는 것입니다.

이 옵션을 선택하면 수식어와 한정어를 용어집에 정의해야하는 것은 아닙니다.

즉, 용어집에서 찾을 수없는 이름 부분이 이름 구조의 수정 자 또는 한정자와 일치하는 경우 이름 유효성 검사가 성공 함을 의미합니다.


Case Sensitive: 이것은 유효성 검증이 대소 문자를 구분하는지 여부를 정의합니다.

예 : '대소 문자 구분'을 선택하면 Code와 CODE가 다릅니다.


Unique Abbreviations: 약어의 고유성은 강제되지 않으므로 하나의 약어를 모든 단어 형식에 사용할 수 있습니다.

예 : ADMIN = Administrator, Administration, Administrative 또는 같은 약어로 세 가지 용어를 사용할 수 있습니다.

이러한 정의는 이름 유효성 검사와 이름 변환이 올바른 모든 용어가 동일한 분류 설정을 갖는 경우에만 결과가 나타납니다.

상태가 선택되지 않음에서 확인 됨으로 변경되면 다음 정보가 포함 된 보고서가 표시됩니다.


• 고유하지 않은 약어

• 대체 약어

• 약어가없는 단어


Separator: 이것은 다중 단어 용어에 대한 단어 분리 기호를 정의합니다. 용어집이 용어집 편집기에로드되면 구분 기호 설정이 검사됩니다.

구분 기호가 공백 문자가 아닌 경우 이름에 공백이있는 모든 용어를 나타내는 보고서가 표시됩니다.

공간을 정의 된 용어집 구분 기호로 바꾸는 옵션도 있습니다.


Apply new separator: 이렇게하면 여러 단어로 된 기존 구분 기호가 대체됩니다.



용어 속성 정의

Name : 논리적 모델에서 사용되는 표준 용어를 기술

Plural :  복수형

Abbreviation : 영문 약어명

Alt. Abb. : 영문명을 기술

Prime Word: Prime Word는 정의되는 객체 또는 요소를 식별합니다. 

일반적으로 이러한 객체는 조직에서 정보를 유지하고자하는 사람, 장소, 사물 또는 이벤트를 나타냅니다.

Prime Word는 데이터베이스 시스템을 쿼리 할 때 기본 검색 식별자로 사용되며 비즈니스 용도에 따라 일반 대 특정 분류 체계를 개발하기위한 기본 키워드 목록을 제공합니다.

Customer Address의 CUSTOMER는 Prime Word의 예입니다.

Class Word: Class Word는 데이터 요소 이름에서 가장 중요한 명사입니다.

Class Word는 데이터 요소의 사용 또는 용도를 식별합니다.

Class Word는 데이터 요소 이름의 객체 (Prime Word)에 대해 유지되는 정보 유형을 지정합니다.

고객 주소의 ADDRESS는 Class Word의 예입니다.

Modifier:  Class Word 또는 Prime Word에 대한 추가 정보를 제공합니다.

수식어는 형용사 또는 명사 일 수 있습니다.

Customer Delivery Address(고객 배달 주소)의 DELIVERY(배달)은 Modifier의 예입니다.

그외 Modifier 예제 : 연간, 분기 별, 최소 및 최소

Qualifier :  Class Word와 함께 값 도메인 내의 클래스 단어의 특성을 더 자세히 설명하거나 객체에 첨부 할 수있는 정보 유형을 지정하는 특수한 종류의 수정 자입니다. 예 : FEET, METERS, SECONDS, and WEEKS.



datamodelernamingstandards-167685.pdf

Data Modeler User's Guide.pdf


Oracle Sql Developer Data Modeler 툴을 사용하기 전에 설정하는 정보다.


1. 언어 변경


Oracle Sql Developer Data Modeler를 한글로 설정하면 엔티티의 속성이 제대로 반영되지 않는 경우가 있다. 이를 해결 하기 위해서는 영문으로 변경하여 사용한다.

영문으로 변경하는 방법은 "datamodeler/datamodeler/bin/datamodeler.conf" 파일을 편집기로 연 후 맨 아래에 아래 항목을 입력한 후 저장한다.

 

AddVMOption -Duser.language=en

AddVMOption -Duser.country=US


영문으로 바꿔도 한글 사용은 가능하다.

원문 : http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/

번역 : 구글번역



소개(Intorduction)


한 번에 또는 대부분의 사용자는 SQL 데이터베이스에서 계층 적 데이터를 처리했으며 계층 적 데이터의 관리는 관계형 데이터베이스의 의도와 다르다는 것을 알게되었습니다. 관계형 데이터베이스의 테이블은 XML과 같은 계층 적 구조는 아니지만 단순한 플랫 목록입니다. 계층 적 데이터는 관계형 데이터베이스 테이블에서 자연스럽게 표현되지 않는 부모 - 자식 관계를가집니다.


우리의 목적을 위해 계층 적 데이터는 각 항목이 하나의 부모와 0 개 이상의 자식을 가진 데이터 모음입니다 (상위 항목이없는 루트 항목 제외). 계층 적 데이터는 포럼 및 메일 목록 스레드, 비즈니스 조직도, 콘텐츠 관리 범주 및 제품 범주를 비롯한 다양한 데이터베이스 응용 프로그램에서 찾을 수 있습니다. 우리의 목적을 위해 가상의 전자 제품 상점에서 다음과 같은 제품 카테고리 계층 구조를 사용합니다.




이 범주는 위에 인용 된 다른 예제와 동일한 방식으로 계층 구조를 형성합니다. 이 기사에서는 전통적인 adjacency list 모델부터 시작하여 MySQL의 계층 적 데이터를 다루는 두 가지 모델을 살펴 보겠습니다.




인접 목록 모델(The Adjacency List Model)


일반적으로 위에 표시된 예제 카테고리는 다음과 같은 테이블에 저장됩니다 (전체 CREATE 및 INSERT 문을 포함하므로 따라갈 수 있습니다).


CREATE TABLE category(
        category_id INT AUTO_INCREMENT PRIMARY KEY,
        name VARCHAR(20) NOT NULL,
        parent INT DEFAULT NULL
);

INSERT INTO category VALUES(1,'ELECTRONICS',NULL),(2,'TELEVISIONS',1),(3,'TUBE',2),
        (4,'LCD',2),(5,'PLASMA',2),(6,'PORTABLE ELECTRONICS',1),(7,'MP3 PLAYERS',6),(8,'FLASH',7),
        (9,'CD PLAYERS',6),(10,'2 WAY RADIOS',6);

SELECT * FROM category ORDER BY category_id;
+-------------+----------------------+--------+
| category_id | name                 | parent |
+-------------+----------------------+--------+
|           1 | ELECTRONICS          |   NULL |
|           2 | TELEVISIONS          |      1 |
|           3 | TUBE                 |      2 |
|           4 | LCD                  |      2 |
|           5 | PLASMA               |      2 |
|           6 | PORTABLE ELECTRONICS |      1 |
|           7 | MP3 PLAYERS          |      6 |
|           8 | FLASH                |      7 |
|           9 | CD PLAYERS           |      6 |
|          10 | 2 WAY RADIOS         |      6 |
+-------------+----------------------+--------+
10 rows in set (0.00 sec)

인접성 목록 모델에서 테이블의 각 항목에는 상위 항목에 대한 포인터가 포함됩니다. 최상위 요소 (이 경우 electronics)는 상위 요소에 대해 NULL 값을가집니다. 인접 목록 모델은 아주 간단하다는 장점이 있으며, FLASH가 mp3 플레이어의 하위 항목 인 전자 제품의 하위 항목 인 휴대용 전자 제품의 하위 항목임을 쉽게 알 수 있습니다. 인접 목록 모델은 클라이언트 측 코드에서 상당히 쉽게 처리 할 수 있지만 모델로 작업하는 것은 순수 SQL에서 더 문제가 될 수 있습니다.



풀 트리 검색하기(RETRIEVING A FULL TREE)


계층 적 데이터를 처리 할 때 첫 번째로 공통적으로 수행해야 할 작업은 일반적으로 들여 쓰기의 형태로 전체 트리를 표시하는 것입니다. 이 작업을 수행하는 가장 일반적인 방법은 순수한 SQL에서 자체 조인을 사용하는 것입니다.


SELECT t1.name AS lev1, t2.name as lev2, t3.name as lev3, t4.name as lev4
FROM category AS t1
LEFT JOIN category AS t2 ON t2.parent = t1.category_id
LEFT JOIN category AS t3 ON t3.parent = t2.category_id
LEFT JOIN category AS t4 ON t4.parent = t3.category_id
WHERE t1.name = 'ELECTRONICS';

+-------------+----------------------+--------------+-------+
| lev1        | lev2                 | lev3         | lev4  |
+-------------+----------------------+--------------+-------+
| ELECTRONICS | TELEVISIONS          | TUBE         | NULL  |
| ELECTRONICS | TELEVISIONS          | LCD          | NULL  |
| ELECTRONICS | TELEVISIONS          | PLASMA       | NULL  |
| ELECTRONICS | PORTABLE ELECTRONICS | MP3 PLAYERS  | FLASH |
| ELECTRONICS | PORTABLE ELECTRONICS | CD PLAYERS   | NULL  |
| ELECTRONICS | PORTABLE ELECTRONICS | 2 WAY RADIOS | NULL  |
+-------------+----------------------+--------------+-------+
6 rows in set (0.00 sec)


모든 잎사귀 찾기(FINDING ALL THE LEAF NODES)


LEFT JOIN 쿼리를 사용하여 트리에있는 모든 리프 노드 (자식이없는 노드)를 찾을 수 있습니다.


SELECT t1.name FROM
category AS t1 LEFT JOIN category as t2
ON t1.category_id = t2.parent
WHERE t2.category_id IS NULL;

+--------------+
| name         |
+--------------+
| TUBE         |
| LCD          |
| PLASMA       |
| FLASH        |
| CD PLAYERS   |
| 2 WAY RADIOS |
+--------------+



단일 경로 검색(RETRIEVING A SINGLE PATH)


자체 조인은 또한 우리가 계층 구조를 통해 완전한 경로를 볼 수있게 해줍니다 :


SELECT t1.name AS lev1, t2.name as lev2, t3.name as lev3, t4.name as lev4
FROM category AS t1
LEFT JOIN category AS t2 ON t2.parent = t1.category_id
LEFT JOIN category AS t3 ON t3.parent = t2.category_id
LEFT JOIN category AS t4 ON t4.parent = t3.category_id
WHERE t1.name = 'ELECTRONICS' AND t4.name = 'FLASH';

+-------------+----------------------+-------------+-------+
| lev1        | lev2                 | lev3        | lev4  |
+-------------+----------------------+-------------+-------+
| ELECTRONICS | PORTABLE ELECTRONICS | MP3 PLAYERS | FLASH |
+-------------+----------------------+-------------+-------+
1 row in set (0.01 sec)

이러한 접근 방식의 주된 한계는 계층 구조의 모든 수준에 대해 하나의 자체 조인이 필요하며 조인이 복잡해지면서 각 수준이 추가 될 때마다 성능이 자연스럽게 저하된다는 것입니다.



부작용 목록 모델의 제한(LIMITATIONS OF THE ADJACENCY LIST MODEL)


순수 SQL에서 인접성 목록 모델로 작업하는 것은 기껏해야 어려울 수 있습니다. 카테고리의 전체 경로를 표시되기 전에, 우리는 존재하는 레벨을 알 수있다. 그 과정에서 전체 서브 트리를 orphaning에 대한 때문에 가능성의 노드를 삭제하는 경우 또한, 특별한주의는 (휴대용 전자 제품 카테고리와 분리되어 자식을 모두 삭제)주의해야합니다. 이러한 제한 중 일부는 클라이언트 측 코드 나 저장 프로 시저를 사용하여 해결할 수 있습니다. 절차 언어로 우리는 나무의 아래에서 시작하여 전체 트리 또는 단일 경로를 반환 위쪽으로 반복 할 수 있습니다. 프로 시저 프로그래밍을 사용하여 하나의 자식 요소를 승격시키고 나머지 자식을 새로운 부모를 가리 키도록 다시 정렬함으로써 전체 하위 트리를 고아없이 노드를 삭제할 수도 있습니다.



중첩 세트 모델(The Nested Set Model)


이 기사에서 중점을두고 자하는 것은 일반적으로 중첩 세트 모델이라고하는 다른 접근 방식입니다. 중첩 세트 모델에서는 노드와 라인이 아닌 중첩 된 컨테이너로 새로운 방식으로 계층 구조를 볼 수 있습니다. 다음과 같이 전자 제품 범주를 묘사 해보십시오.



부모 범주가 자녀를 감싸고 있기 때문에 우리 계층 구조가 어떻게 유지되고 있는지 주목하십시오. 우리는 노드의 중첩을 나타 내기 위해 왼쪽 및 오른쪽 값을 사용하여 테이블에서이 계층 구조를 나타냅니다.


CREATE TABLE nested_category (
        category_id INT AUTO_INCREMENT PRIMARY KEY,
        name VARCHAR(20) NOT NULL,
        lft INT NOT NULL,
        rgt INT NOT NULL
);

INSERT INTO nested_category VALUES(1,'ELECTRONICS',1,20),(2,'TELEVISIONS',2,9),(3,'TUBE',3,4),
 (4,'LCD',5,6),(5,'PLASMA',7,8),(6,'PORTABLE ELECTRONICS',10,19),(7,'MP3 PLAYERS',11,14),(8,'FLASH',12,13),
 (9,'CD PLAYERS',15,16),(10,'2 WAY RADIOS',17,18);

SELECT * FROM nested_category ORDER BY category_id;

+-------------+----------------------+-----+-----+
| category_id | name                 | lft | rgt |
+-------------+----------------------+-----+-----+
|           1 | ELECTRONICS          |   1 |  20 |
|           2 | TELEVISIONS          |   2 |   9 |
|           3 | TUBE                 |   3 |   4 |
|           4 | LCD                  |   5 |   6 |
|           5 | PLASMA               |   7 |   8 |
|           6 | PORTABLE ELECTRONICS |  10 |  19 |
|           7 | MP3 PLAYERS          |  11 |  14 |
|           8 | FLASH                |  12 |  13 |
|           9 | CD PLAYERS           |  15 |  16 |
|          10 | 2 WAY RADIOS         |  17 |  18 |
+-------------+----------------------+-----+-----+

왼쪽과 오른쪽은 MySQL에서 예약어이기 때문에 lft와 rgt를 사용합니다. 예약어 전체 목록은 http://dev.mysql.com/doc/mysql/en/reserved-words.html을 참조하십시오.


그렇다면 우리는 어떻게 좌우 값을 결정합니까? 바깥 쪽 노드의 가장 왼쪽에 번호를 매기고 오른쪽으로 계속합니다.





이 디자인은 일반적인 트리에도 적용 할 수 있습니다.



트리를 사용하여 작업 할 때 우리는 왼쪽에서 오른쪽으로 한 번에 한 레이어 씩 작업하고 각 노드의 하위 노드로 내림차순 번호를 할당하고 오른쪽으로 이동합니다. 이 접근법을 수정 된 선주문 트리 순회 알고리즘이라고합니다.




풀 트리 검색하기(RETRIEVING A FULL TREE)


우리는 노드의 lft 값이 부모의 lft와 rgt 값 사이에 항상 존재한다는 것을 기반으로 부모를 노드와 연결하는 자체 조인을 사용하여 전체 트리를 검색 할 수 있습니다.


SELECT node.name
FROM nested_category AS node,
        nested_category AS parent
WHERE node.lft BETWEEN parent.lft AND parent.rgt
        AND parent.name = 'ELECTRONICS'
ORDER BY node.lft;

+----------------------+
| name                 |
+----------------------+
| ELECTRONICS          |
| TELEVISIONS          |
| TUBE                 |
| LCD                  |
| PLASMA               |
| PORTABLE ELECTRONICS |
| MP3 PLAYERS          |
| FLASH                |
| CD PLAYERS           |
| 2 WAY RADIOS         |
+----------------------+


인접성 목록 모델을 사용한 이전 예제와 달리이 쿼리는 트리의 깊이에 관계없이 작동합니다. rgt 값은 항상 lft 값과 같은 부모 내에 속하기 때문에 우리는 BETWEEN 절의 노드의 rgt 값에 신경 쓰지 않습니다.




모든 잎사귀 찾기(FINDING ALL THE LEAF NODES)


인접 목록 모델에서 사용 된 LEFT JOIN 방법보다 훨씬 단순한 중첩 된 집합 모델의 모든 리프 노드 찾기. nested_category 테이블을 보면 리프 노드의 lft 및 rgt 값이 연속 된 숫자임을 알 수 있습니다. 리프 노드를 찾기 위해 rgt = lft + 1 인 노드를 찾는다.


SELECT name
FROM nested_category
WHERE rgt = lft + 1;

+--------------+
| name         |
+--------------+
| TUBE         |
| LCD          |
| PLASMA       |
| FLASH        |
| CD PLAYERS   |
| 2 WAY RADIOS |
+--------------+



단일 경로 검색(RETRIEVING A SINGLE PATH)


중첩 된 집합 모델을 사용하면 여러자가 조인을 사용하지 않고도 단일 경로를 검색 할 수 있습니다.


SELECT parent.name
FROM nested_category AS node,
        nested_category AS parent
WHERE node.lft BETWEEN parent.lft AND parent.rgt
        AND node.name = 'FLASH'
ORDER BY parent.lft;

+----------------------+
| name                 |
+----------------------+
| ELECTRONICS          |
| PORTABLE ELECTRONICS |
| MP3 PLAYERS          |
| FLASH                |
+----------------------+


NODES의 깊이 찾기(FINDING THE DEPTH OF THE NODES)


우리는 이미 전체 트리를 표시하는 방법을 살펴 보았지만 트리의 각 노드의 깊이를 표시하여 각 노드가 계층 구조에 어떻게 들어 맞는지 더 잘 식별하려는 경우 어떻게해야할까요? 이것은 전체 트리를 표시하기 위해 COUNT 함수와 GROUP BY 절을 기존 쿼리에 추가하여 수행 할 수 있습니다.


SELECT node.name, (COUNT(parent.name) - 1) AS depth
FROM nested_category AS node,
        nested_category AS parent
WHERE node.lft BETWEEN parent.lft AND parent.rgt
GROUP BY node.name
ORDER BY node.lft;

+----------------------+-------+
| name                 | depth |
+----------------------+-------+
| ELECTRONICS          |     0 |
| TELEVISIONS          |     1 |
| TUBE                 |     2 |
| LCD                  |     2 |
| PLASMA               |     2 |
| PORTABLE ELECTRONICS |     1 |
| MP3 PLAYERS          |     2 |
| FLASH                |     3 |
| CD PLAYERS           |     2 |
| 2 WAY RADIOS         |     2 |
+----------------------+-------+

depth 값을 사용하여 범주 이름을 CONCAT 및 REPEAT 문자열 함수로 들여 쓸 수 있습니다.


SELECT CONCAT( REPEAT(' ', COUNT(parent.name) - 1), node.name) AS name
FROM nested_category AS node,
        nested_category AS parent
WHERE node.lft BETWEEN parent.lft AND parent.rgt
GROUP BY node.name
ORDER BY node.lft;

+-----------------------+
| name                  |
+-----------------------+
| ELECTRONICS           |
|  TELEVISIONS          |
|   TUBE                |
|   LCD                 |
|   PLASMA              |
|  PORTABLE ELECTRONICS |
|   MP3 PLAYERS         |
|    FLASH              |
|   CD PLAYERS          |
|   2 WAY RADIOS        |
+-----------------------+

물론 클라이언트 측 응용 프로그램에서는 깊이 값을 직접 사용하여 계층 구조를 표시 할 가능성이 높습니다. 웹 개발자는 깊이 번호가 증가하거나 감소 할 때 <li> </ li> 및 <ul> </ ul> 태그를 추가하여 트리를 반복 할 수 있습니다.



서브 트리의 깊이(DEPTH OF A SUB-TREE)


하위 트리에 대한 깊이 정보가 필요하면 결과를 손상시킬 수 있으므로 자체 조인에서 노드 또는 부모 테이블을 제한 할 수 없습니다. 대신 세 번째 자체 조인을 하위 쿼리와 함께 추가하여 하위 트리의 새로운 시작점이 될 깊이를 결정합니다.


SELECT node.name, (COUNT(parent.name) - (sub_tree.depth + 1)) AS depth
FROM nested_category AS node,
        nested_category AS parent,
        nested_category AS sub_parent,
        (
                SELECT node.name, (COUNT(parent.name) - 1) AS depth
                FROM nested_category AS node,
                nested_category AS parent
                WHERE node.lft BETWEEN parent.lft AND parent.rgt
                AND node.name = 'PORTABLE ELECTRONICS'
                GROUP BY node.name
                ORDER BY node.lft
        )AS sub_tree
WHERE node.lft BETWEEN parent.lft AND parent.rgt
        AND node.lft BETWEEN sub_parent.lft AND sub_parent.rgt
        AND sub_parent.name = sub_tree.name
GROUP BY node.name
ORDER BY node.lft;

+----------------------+-------+
| name                 | depth |
+----------------------+-------+
| PORTABLE ELECTRONICS |     0 |
| MP3 PLAYERS          |     1 |
| FLASH                |     2 |
| CD PLAYERS           |     1 |
| 2 WAY RADIOS         |     1 |
+----------------------+-------+

이 기능은 루트 노드를 포함한 모든 노드 이름과 함께 사용할 수 있습니다. 깊이 값은 항상 명명 된 노드를 기준으로합니다.



NODE의 즉각적인 소굴 찾기(FIND THE IMMEDIATE SUBORDINATES OF A NODE)


소매업 자 웹 사이트에서 전자 제품 범주를 보여주고 있다고 가정 해보십시오. 사용자가 카테고리를 클릭하면 해당 카테고리의 제품을 표시하고 그 바로 아래의 하위 카테고리는 나열하지만 하위 카테고리의 전체 트리는 나열하지 않을 수 있습니다. 이를 위해 우리는 노드와 노드의 즉각적인 하위 노드를 보여줄 필요가 있지만 트리를 더 내려 가지 않아야합니다. 예를 들어 휴대용 전자 제품 카테고리를 표시 할 때 MP3 플레이어, CD 플레이어 및 2 가지 라디오를 표시하려고하지만 플래시는 표시하지 않을 것입니다.


이는 이전 쿼리에 HAVING 절을 추가하여 쉽게 수행 할 수 있습니다.


SELECT node.name, (COUNT(parent.name) - (sub_tree.depth + 1)) AS depth
FROM nested_category AS node,
        nested_category AS parent,
        nested_category AS sub_parent,
        (
                SELECT node.name, (COUNT(parent.name) - 1) AS depth
                FROM nested_category AS node,
                        nested_category AS parent
                WHERE node.lft BETWEEN parent.lft AND parent.rgt
                        AND node.name = 'PORTABLE ELECTRONICS'
                GROUP BY node.name
                ORDER BY node.lft
        )AS sub_tree
WHERE node.lft BETWEEN parent.lft AND parent.rgt
        AND node.lft BETWEEN sub_parent.lft AND sub_parent.rgt
        AND sub_parent.name = sub_tree.name
GROUP BY node.name
HAVING depth <= 1
ORDER BY node.lft;

+----------------------+-------+
| name                 | depth |
+----------------------+-------+
| PORTABLE ELECTRONICS |     0 |
| MP3 PLAYERS          |     1 |
| CD PLAYERS           |     1 |
| 2 WAY RADIOS         |     1 |
+----------------------+-------+


상위 노드를 표시하지 않으려면, HAVING depth <= 1 행을 HAVING depth = 1로 변경하십시오.



중첩 된 기능의 전체 기능(AGGREGATE FUNCTIONS IN A NESTED SET)


집계 함수를 설명하는 데 사용할 수있는 제품 표를 추가해 보겠습니다.


CREATE TABLE product
(
        product_id INT AUTO_INCREMENT PRIMARY KEY,
        name VARCHAR(40),
        category_id INT NOT NULL
);

INSERT INTO product(name, category_id) VALUES('20" TV',3),('36" TV',3),
('Super-LCD 42"',4),('Ultra-Plasma 62"',5),('Value Plasma 38"',5),
('Power-MP3 5gb',7),('Super-Player 1gb',8),('Porta CD',9),('CD To go!',9),
('Family Talk 360',10);

SELECT * FROM product;

+------------+-------------------+-------------+
| product_id | name              | category_id |
+------------+-------------------+-------------+
|          1 | 20" TV            |           3 |
|          2 | 36" TV            |           3 |
|          3 | Super-LCD 42"     |           4 |
|          4 | Ultra-Plasma 62"  |           5 |
|          5 | Value Plasma 38"  |           5 |
|          6 | Power-MP3 128mb   |           7 |
|          7 | Super-Shuffle 1gb |           8 |
|          8 | Porta CD          |           9 |
|          9 | CD To go!         |           9 |
|         10 | Family Talk 360   |          10 |
+------------+-------------------+-------------+



이제 각 카테고리의 제품 수와 함께 카테고리 트리를 검색 할 수있는 쿼리를 생성 해 보겠습니다.


SELECT parent.name, COUNT(product.name)
FROM nested_category AS node ,
        nested_category AS parent,
        product
WHERE node.lft BETWEEN parent.lft AND parent.rgt
        AND node.category_id = product.category_id
GROUP BY parent.name
ORDER BY node.lft;

+----------------------+---------------------+
| name                 | COUNT(product.name) |
+----------------------+---------------------+
| ELECTRONICS          |                  10 |
| TELEVISIONS          |                   5 |
| TUBE                 |                   2 |
| LCD                  |                   1 |
| PLASMA               |                   2 |
| PORTABLE ELECTRONICS |                   5 |
| MP3 PLAYERS          |                   2 |
| FLASH                |                   1 |
| CD PLAYERS           |                   2 |
| 2 WAY RADIOS         |                   1 |
+----------------------+---------------------+


이것은 COUNT 및 GROUP BY가 추가 된 일반적인 트리 전체 쿼리와 WHERE 절의 노드와 product 테이블 간의 조인 및 product 테이블에 대한 참조입니다. 보시다시피 각 카테고리에 대한 개수가 있으며 하위 카테고리의 수는 상위 카테고리에 반영됩니다.



새로운 노드 추가하기(ADDING NEW NODES)


이제 트리를 쿼리하는 방법을 배웠으므로 새 노드를 추가하여 트리를 업데이트하는 방법을 살펴보아야합니다. 중첩 된 집합 다이어그램을 다시 살펴 보겠습니다.




TELEVISIONS 노드와 PORTABLE ELECTRONICS 노드 사이에 새로운 노드를 추가하고자한다면, 새로운 노드는 lft와 rgt 값이 10과 11이 될 것이고, 오른쪽 노드는 lft와 rgt 값이 2만큼 증가 할 것입니다. 그런 다음 적절한 lft 및 rgt 값을 가진 새 노드를 추가합니다. 이 작업은 MySQL 5의 저장 프로 시저에서 수행 할 수 있지만 가장 안정적인 버전이므로 대부분의 독자가 4.1을 사용하고 있다고 가정하고 대신 LOCK TABLES 문으로 쿼리를 분리합니다.


LOCK TABLE nested_category WRITE;

SELECT @myRight := rgt FROM nested_category
WHERE name = 'TELEVISIONS';

UPDATE nested_category SET rgt = rgt + 2 WHERE rgt > @myRight;
UPDATE nested_category SET lft = lft + 2 WHERE lft > @myRight;

INSERT INTO nested_category(name, lft, rgt) VALUES('GAME CONSOLES', @myRight + 1, @myRight + 2);

UNLOCK TABLES;

우리는 들여 쓰기 트리 쿼리를 사용하여 중첩을 확인할 수 있습니다.


SELECT CONCAT( REPEAT( ' ', (COUNT(parent.name) - 1) ), node.name) AS name
FROM nested_category AS node,
        nested_category AS parent
WHERE node.lft BETWEEN parent.lft AND parent.rgt
GROUP BY node.name
ORDER BY node.lft;

+-----------------------+
| name                  |
+-----------------------+
| ELECTRONICS           |
|  TELEVISIONS          |
|   TUBE                |
|   LCD                 |
|   PLASMA              |
|  GAME CONSOLES        |
|  PORTABLE ELECTRONICS |
|   MP3 PLAYERS         |
|    FLASH              |
|   CD PLAYERS          |
|   2 WAY RADIOS        |
+-----------------------+



기존의 자식이없는 노드의 자식으로 노드를 추가하려면이 절차를 약간 수정해야합니다. 2 WAY RADIOS 노드 아래에 새 FRS 노드를 추가해 보겠습니다.


LOCK TABLE nested_category WRITE;

SELECT @myLeft := lft FROM nested_category

WHERE name = '2 WAY RADIOS';

UPDATE nested_category SET rgt = rgt + 2 WHERE rgt > @myLeft;
UPDATE nested_category SET lft = lft + 2 WHERE lft > @myLeft;

INSERT INTO nested_category(name, lft, rgt) VALUES('FRS', @myLeft + 1, @myLeft + 2);

UNLOCK TABLES;

이 예제에서 우리는 자랑스러운 새로운 부모 노드의 왼쪽 숫자의 오른쪽으로 모든 것을 확장 한 다음 노드를 왼쪽 값의 오른쪽에 배치합니다. 보시다시피 새 노드가 제대로 중첩되었습니다.


SELECT CONCAT( REPEAT( ' ', (COUNT(parent.name) - 1) ), node.name) AS name
FROM nested_category AS node,
        nested_category AS parent
WHERE node.lft BETWEEN parent.lft AND parent.rgt
GROUP BY node.name
ORDER BY node.lft;

+-----------------------+
| name                  |
+-----------------------+
| ELECTRONICS           |
|  TELEVISIONS          |
|   TUBE                |
|   LCD                 |
|   PLASMA              |
|  GAME CONSOLES        |
|  PORTABLE ELECTRONICS |
|   MP3 PLAYERS         |
|    FLASH              |
|   CD PLAYERS          |
|   2 WAY RADIOS        |
|    FRS                |
+-----------------------+


노드 삭제(DELETING NODES)


중첩 된 세트를 사용하여 작업하는 마지막 기본 작업은 노드를 제거하는 것입니다. 노드를 삭제할 때 수행하는 과정은 계층 구조에서 노드의 위치에 따라 달라집니다. 분리 된 노드를 처리해야하기 때문에 리프 노드를 삭제하는 것이 자식 노드를 삭제하는 것보다 쉽습니다.


잎 노드를 삭제할 때, 새로운 노드를 추가하는 것과 정반대의 과정을 거치면 모든 노드에서 오른쪽으로 노드와 노드의 너비가 삭제됩니다.


LOCK TABLE nested_category WRITE;

SELECT @myLeft := lft, @myRight := rgt, @myWidth := rgt - lft + 1
FROM nested_category
WHERE name = 'GAME CONSOLES';

DELETE FROM nested_category WHERE lft BETWEEN @myLeft AND @myRight;

UPDATE nested_category SET rgt = rgt - @myWidth WHERE rgt > @myRight;
UPDATE nested_category SET lft = lft - @myWidth WHERE lft > @myRight;

UNLOCK TABLES;

그리고 다시 한번 들여 쓰기 트리 쿼리를 실행하여 노드가 계층 구조를 손상시키지 않고 삭제되었음을 확인합니다.


SELECT CONCAT( REPEAT( ' ', (COUNT(parent.name) - 1) ), node.name) AS name
FROM nested_category AS node,
        nested_category AS parent
WHERE node.lft BETWEEN parent.lft AND parent.rgt
GROUP BY node.name
ORDER BY node.lft;

+-----------------------+
| name                  |
+-----------------------+
| ELECTRONICS           |
|  TELEVISIONS          |
|   TUBE                |
|   LCD                 |
|   PLASMA              |
|  PORTABLE ELECTRONICS |
|   MP3 PLAYERS         |
|    FLASH              |
|   CD PLAYERS          |
|   2 WAY RADIOS        |
|    FRS                |
+-----------------------+


이 접근법은 노드와 그 모든 자식 노드를 삭제하는 것과 똑같이 잘 작동합니다.


LOCK TABLE nested_category WRITE;

SELECT @myLeft := lft, @myRight := rgt, @myWidth := rgt - lft + 1
FROM nested_category
WHERE name = 'MP3 PLAYERS';

DELETE FROM nested_category WHERE lft BETWEEN @myLeft AND @myRight;

UPDATE nested_category SET rgt = rgt - @myWidth WHERE rgt > @myRight;
UPDATE nested_category SET lft = lft - @myWidth WHERE lft > @myRight;

UNLOCK TABLES;

다시 한번 전체 하위 트리를 성공적으로 삭제했는지 쿼리합니다.


SELECT CONCAT( REPEAT( ' ', (COUNT(parent.name) - 1) ), node.name) AS name
FROM nested_category AS node,
        nested_category AS parent
WHERE node.lft BETWEEN parent.lft AND parent.rgt
GROUP BY node.name
ORDER BY node.lft;

+-----------------------+
| name                  |
+-----------------------+
| ELECTRONICS           |
|  TELEVISIONS          |
|   TUBE                |
|   LCD                 |
|   PLASMA              |
|  PORTABLE ELECTRONICS |
|   CD PLAYERS          |
|   2 WAY RADIOS        |
|    FRS                |
+-----------------------+

우리가 처리해야하는 또 다른 시나리오는 부모 노드는 삭제하지만 자식 노드는 삭제하지 않는 것입니다. 어떤 경우에는 감독자가 해고 될 때와 같이 대체가 표시 될 때까지 이름을 자리 표시 자로 바꿀 수도 있습니다. 다른 경우, 자식 노드는 모두 삭제 된 부모 수준까지 이동해야합니다.


LOCK TABLE nested_category WRITE;

SELECT @myLeft := lft, @myRight := rgt, @myWidth := rgt - lft + 1
FROM nested_category
WHERE name = 'PORTABLE ELECTRONICS';

DELETE FROM nested_category WHERE lft = @myLeft;

UPDATE nested_category SET rgt = rgt - 1, lft = lft - 1 WHERE lft BETWEEN @myLeft AND @myRight;
UPDATE nested_category SET rgt = rgt - 2 WHERE rgt > @myRight;
UPDATE nested_category SET lft = lft - 2 WHERE lft > @myRight;

UNLOCK TABLES;

이 경우 노드의 오른쪽에있는 모든 요소에서 2를 뺍니다 (자식이 없으므로 너비가 2가되기 때문에). 자식 노드가 하나 인 노드에서 하나를 뺍니다 (부모의 왼쪽 손실로 인해 생성 된 간격을 닫습니다. 값). 다시 한번, 우리는 요소가 홍보되었음을 확인할 수 있습니다.


SELECT CONCAT( REPEAT( ' ', (COUNT(parent.name) - 1) ), node.name) AS name
FROM nested_category AS node,
        nested_category AS parent
WHERE node.lft BETWEEN parent.lft AND parent.rgt
GROUP BY node.name
ORDER BY node.lft;

+---------------+
| name          |
+---------------+
| ELECTRONICS   |
|  TELEVISIONS  |
|   TUBE        |
|   LCD         |
|   PLASMA      |
|  CD PLAYERS   |
|  2 WAY RADIOS |
|   FRS         |
+---------------+

노드를 삭제할 때의 다른 시나리오는 자식 노드 중 하나를 부모 위치로 승격시키고 부모 노드의 형제 노드 아래에 자식 노드를 이동시키는 것입니다. 그러나 공간을 위해이 시나리오는이 기사에서 다루지 않습니다.




최종 생각(Final Thoughts)


이 기사의 정보가 사용자에게 유용하기를 희망하지만 SQL에서 중첩 된 집합의 개념은 10 년 이상되어 왔으며 책과 인터넷에서 사용할 수있는 많은 추가 정보가 있습니다. 제 생각에 계층 적 정보를 관리하는 데있어 가장 포괄적 인 정보원은 고급 SQL, Joe Celko 분야에서 매우 존경받는 저자가 작성한 Joe Celko의 "Smarties 용 SQL의 Trees and Hierarchies"입니다. 조 셀코 (Joe Celko)는 중첩 된 세트 모델로 종종 공로를 인정 받았으며이 주제에 관한 가장 많은 저술가입니다. Celko의 저서가 저의 연구에서 귀중한 자원이라는 것을 알았습니다. 이 기사에서는이 기사에서 다루지 않은 고급 항목에 대해 설명하고 인접 목록 및 중첩 세트 모델 외에도 계층 적 데이터를 관리하기위한 추가 방법을 제공합니다.


참고 자료 / 참고 자료 섹션에서 나는 MySQL에서 중첩 된 세트를 처리하기 위해 미리 빌드 된 PHP 라이브러리를 포함하는 한 쌍의 PHP 관련 리소스를 포함하여 계층 적 데이터 관리 연구에 사용할 수있는 웹 리소스를 나열했다. 현재 인접 목록 모델을 사용 중이며 중첩 된 세트 모델을 실험하고 싶은 사용자는 아래에 나열된 데이터베이스 리소스의 계층 적 데이터 저장에서 둘 사이의 변환을위한 샘플 코드를 찾을 수 있습니다.







오라클에서 데이터를 저장하다 보면 한 테이블 내에 부모 자식 관계(상하위 관계)로 표현하는 데이터가 발생될 때가 있다. 예를 들어

게시판 ↳ 공지사항 게시판 ↳ 사용자 게시판

와 같이 메뉴를 저장하는 테이블이 있다면 상위 게시판이라는 메뉴는 하위에 공지사항 게시판 메뉴, 사용자 게시판 메뉴를 하위로 가진다면, 데이터 구조는 다음과 같이 생성될 것이다.

MENUIDNAMEURLPARENTMENUID
1공지사항 게시판/notice.html2
2게시판/index.htmlnull
3사용자 게시판/user.html2

만약 쿼리를 상위 메뉴 데이터를 먼저 나오게 하고 그 뒤에 하위 메뉴들을 나오게 하려면 어떻게 해야할까? 이때 Oracle에서는 start with, connect by prior를 사용하여 데이터를 셀렉트 할수 있다.

1
2
3
4
5
6
SELECT
    menuid, name, url, parentmenuid
FROM menu
START WITH parentmenuid is null /*상위(부모)의 조건을 명시*/
CONNECT BY PRIOR menuid = parentmenuid  /*상위의 키와 하위의 키를 열결시킴*/
ORDER SIBLINGS BY menuid ASC;   /*하위데이터 정렬 조건*/

이렇게 쿼리를 사용하게 되면 다음과 같이 셀렉팅이 된다.

MENUIDNAMEURLPARENTMENUID
2게시판/index.htmlnull
1공지사항 게시판/notice.html2
3사용자 게시판/user.html2

[원문출처]http://krespo.net/171

Oracle 11g에 LISTAGG라는 function이 추가되었습니다. 이 function은 group by로 그룹핑된 문자열 row들을 하나의 컬럼으로 결합시키는 역할을 하게 됩니다. 간단하게 예를 들어보도록 하겠습니다.



 DEPTNO

 NAME

 1

 김태희

 1

 전지현

 2

 성나정

 3

 고아라 


위의 데이터에서 부서번호(DEPTNO)가 1인 사원들의 이름을 한번에 뽑고 싶을 경우에는 아래와 같은 쿼리를 사용하면 됩니다.

1
2
3
4
5
6
SELECT
    deptno, LISTAGG(name, ',') within group (order by name) name
FROM
    test_tb
where deptno = 1
group by deptno;

LISTAGG(결합시킬 컬럼, ROW 사이의 결합 문자) within group (해당 그룹 사이의 정렬조건)

으로 간단하게 사용할 수 있습니다


위 쿼리를 실행하면 결과값은 아래처럼 나오게 됩니다.


DEPTNO 

NAME 

김태희, 전지현 


[원문출처]http://krespo.net/195




-- 패스워드 기간 확인
select * from dba_profiles where profile = 'DEFAULT';

-> Password life cycle 이 180 이 기본 설정임.

alter profile default limit password_life_time unlimited;
-> 기간제한 없이 변경해 준다.


alter user 계정이름 identified by 패스워드 ;

-> 계정에 대한 패스워드를 다시 설정해 준다.


--계정 잠금

ALTER USER "계정명" ACCOUNT LOCK;

 

--계정 잠금 해제

ALTER USER "계정명" ACCOUNT UNLOCK;

 

--계정 비밀번호 만료

ALTER USER "계정명" PASSWORD EXPIRE;

 

--계정 비밀번호 만료해제 or 변경

ALTER USER "계정명" IDENTIFIED BY "비밀번호";


-- 계정 조회

SELECT USERNAME, ACCOUNT_STATUS, EXPIRY_DATE, PROFILE FROM DBA_USERS

WHERE ACCOUNT_STATUS = 'OPEN';


-- 만료기간 무제한 profile 변경

ALTER PROFILE DEFAULT LIMIT

  FAILED_LOGIN_ATTEMPTS UNLIMITED

  PASSWORD_LIFE_TIME UNLIMITED;


-- 만료기간 제한 profile 변경

ALTER PROFILE DEFAULT LIMIT

  FAILED_LOGIN_ATTEMPTS 20

  PASSWORD_LIFE_TIME 365;

  

--Profile 변경

SQL> ALTER PROFILE default LIMIT

  2  > FAILED_LOGIN_ATTEMPTS 3

  3  > PASSWORD_LIFE_TIME 60

  4  > PASSWORD_GRACE_TIME  10; 

  

-- profile 파라메터 설명

PASSWORD history    : 이전 암호를 기억해 놓았다가 다음에 변경시 동일한 암호사용을 금지함 password_reuse_time : 동일한 password를 적용한 기간동안 사용금지 

password_reuse_max : 입력된 value값만큼만 사용가능한 횟수를 제한 ex: 3이라고 입력하면 3번만 사용가능 password_life_time     : password 생명주기 ex : 30 -> 30일마다 변경해야함 

password_grace_time : password 변경 만료 알림을 value일 전부터 알림 

failed_login_attempts   :password 입력실패시 재시도 가능횟수 최종 실패시 계정 lock걸림 

password_lock_time   : lock걸렸을때 value값만큼 잠겨있음 1일단위임 1/24는 1시간 1/1440은 1분 

password complexity verification(패스워드 복잡성)password설정시 제약조건


-- 파라미터 정보

Parameter: FAILED_LOGIN_ATTEMPTS

Default Setting:  10

Description:  Sets the maximum times a user login is allowed to fail before locking the account.

 

Parameter: PASSWORD_LIFE_TIME

Default Setting:  180

Description:  Sets the number of days the user can use his or her current password.


[출처] http://aspopark.tistory.com/31

서버가 가동중이면 서버를 중지한다.


shell> "C:\Program Files\MySQL\MySQL Server 5.0\bin\mysqladmin" -u root shutdown


서비스 등록

shell> "C:\Program Files\MySQL\MySQL Server 5.0\bin\mysqld" --install


설정파일을 지정하여 서비스 등록

shell> "C:\Program Files\MySQL\MySQL Server 5.0\bin\mysqld" --install MySQL --defaults-file=C:\my-opts.cnf


자동으로 서비스를 시작되게 하지 않고 수동으로 실행하기를 원한다면

shell> "C:\Program Files\MySQL\MySQL Server 5.0\bin\mysqld" --install-manual


서비스 삭제

shell> "C:\Program Files\MySQL\MySQL Server 5.0\bin\mysqld" --remove



참고 : http://dev.mysql.com/doc/refman/5.0/en/windows-start-service.html


1. 다운로드


해당 페이지로 가서 http://www.mongodb.org/downloads OS에 맞는 설치 버전을 다운로드 한다.



여기에선 64bit 윈도우에 설치를 하기 위해서 윈도우 버전을 다운로드 한다.

msi혁식의 설치 버전은 별로 선호하지 않기 때문에 zip로된 파일로 한다.


2. 설치


다운로드 받은 파일은 mongodb-win32-x86_64-2008plus-2.6.7.zip 파일로 압축을 풀어서 c:\에 옮겨 놓는다

해당 위치는 c:\mongodb-win32-x86_64-2008plus-2.6.7




몽고 db의 기본 디렉터리는 c:\data\db로 잡혀 있기때문에 해당 경로를 만들어 주도록 한다.

변경을 위해서는 시작시 옵션을 통해서 해당 db 경로를 지정 해줄 수 있다.




3. 실행


해당 디렉터리를 만들었다면 서버를 실행해본다.


서버를 실행하기 위해서는 cmd 창으로 들어가는데 서버 실행을 위해서는 일반 권한으로 들어가도 되지만 

추후 서비스 등록을 위해서 관리자 권한으로 cmd.exe 명령을 실행한다.


윈도우 시작 -> 모든프로그램 -> 보조프로그램 -> 명령프롬프트 메뉴를 마우스 우클릭하여 관리자 권한으로 실행을 선택한다.


실행 파일은 모두 설치경로\bin에 있으므로 해당 bin 폴더로 이동하거나 전체 경로로 입력한다.


cd C:\mongodb-win32-x86_64-2008plus-2.6.7\bin


여기에서는 c:\mongodb-win32-x86_64-2008plus-2.6.7\bin으로 이동했다고 가정하고

다음 명령어를 실행한다.


mongod


혹은 기본 db 저장경로를 변경하였다면 


mongod --dbpath c:\변경된 db경로



다음과 같은 창이 나타났다면 정상적으로 실행이 됐다.




4. 종료

실행이 정상적으로 된다면 종료도 해봐야 한다. 종료 하는 방법은 다음과 같다.

창을 닫거나..

Ctrl + C 혹은 Ctrl + D로 종료 한다.



5. 설정

해당 정보들을 설정파일로 관리를 할 수도 있는데 설정 파일은 config.cfg라는 파일을 만들어서 해당 내용을 복사하여 

C:\mongodb-win32-x86_64-2008plus-2.6.7\ 폴더에 config 폴더를 만들고 거기에 넣는다.


최종 config.cfg 위치는 C:\mongodb-win32-x86_64-2008plus-2.6.7\config\config.cfg가 된다


#db folder

dbpath = C:\data\db


#port

port = 27017


#log 

logpath = C:\data\logs\mongo.log


#web admin

rest = true



이렇게 설정된 config.cfg 파일은 다음가 같은 명령어로 실행을 하게 되면 해당 설정파일의 정보를 읽어 들여서 실행 할 수 있다.

실행 하기 전에는 설정 파일이 있는 경로가 정상적으로 존재 해야 한다. 


C:\mongodb-win32-x86_64-2008plus-2.6.7\bin>mongod -f C:\mongodb-win32-x86_64-2008plus2.6.7\config\config.cfg



정상적으로 구동이 되었다면 웹 브라우저에 
http://127.0.0.1:28017/를 통하여 로그 및 상태정보를 모니터링 할 수 있다.




6. 서비스 등록
윈도우 서비스를 등록하기 위해서는 다음과 같은 명령어로 서비스를 등록한다. 해당 서비스를 등록하기 위해서는 반드시 관리자 권한으로 실행을 해야 한다.

C:\mongodb-win32-x86_64-2008plus-2.6.7\bin>mongod -f C:\mongodb-win32-x86_64-2008plus-2.6.7\config\config.cfg -install



서비스가 정상적으로 등록이 되었다면 서비스에 정상적으로 등록이 된다.



6. 서비스 해제

등록된 서비스는 다음과 같이 해제할 수 있다.

C:\mongodb-win32-x86_64-2008plus-2.6.7\bin>mongod -f C:\mongodb-win32-x86_64-2008plus-2.6.7\config\config.cfg -remove



설치과정은 이렇게 하면 되고 설치가 정상적으로 완료되고 서비스가 실행이 되었다면 실제 쉘을 실행해 본다.
bin 폴더에 있다면 다음 명령어를 사용하요 접속한다.

monog




위에 화면과 같이 > 형태의 명령어를 입력 받을 수 있도록 되면 정상적으로 설치가 된 것이다.

help

db

show dbs 등의 명령으로 정상적으로 되는지 확인해본다. 

exit 명령어로 나온다.







./sqlplus /nolog //sqlplus 접속


SQL>connect /as sysdba

SQL>shutdown abort

SQL>startup

SQL>exit 


./lsnrctl stop 리스너 종료

./lsnrctl start 리스너 시작

./lsnrctl status 리스너 상태보기



* oracle shutdown option

default : 작업이 완료되기를 기다린다. 수시간이 걸릴수 있다.

Immediate : 모든 세션을 종료하고 커밋되지 않은 트랜잭션은 모두 롤백한다.

abort : 롤백을 필요로 현재 DML을 떠나, 모든 세션을 중단, SGA를 드 - 할당하고 백그라운드 프로세스를 종료합니다. 종료 중단 악 또는 위험하지 않습니다. "취소"는 단순히 오라클은 대부분의 사람들이 종료하는 동안 원하는 모든 활성 작업을 종료된다는 것을 의미