database.sarang.net
UserID
Passwd
Database
ㆍDBMS
MySQL
PostgreSQL
Firebird
Oracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
DBMS Q&A 892 게시물 읽기
No. 892
씨샵에서 DBMS를 만들고 있습니다. DB관련부분에서 질문드립니다.
작성자
InsaneE(insanee)
작성일
2003-12-06 03:14
조회수
7,213

예를 들어, member테이블을 만들었습니다.

그리고 그 안에 회원가입을 하면, 테이블안으로 몇개의 데이터가 입력되구요.

입력된 데이터를 기본으로 하여 로그인을 하면 로그인성공과 함께

로그인한 사용자가 자기가 직접 테이블을 만들고, 수정하고, 삭제하는 등의

작업을 할 수 있는 윈도우 폼을 만듭니다.

 

여기서 사용자가 테이블을 만들려면 쿼리를 create table로 만들면 되겠....죠?-_-+

문제는 사용자가 만든 테이블을 어떤 식으로 자기 테이블만 볼 수 있도록 해야 할까요?

 

사용자 a가 로그인 해서 어떤 테이블을 만들었습니다.

또 사용자 b가 로그인 해서 어떤 테이블을 만들었습니다.

사용자 a는 자신이 만든 테이블만 보고,

그 안에서 작업을 하거나 또 다른 테이블을 만들 수 있어야 하는 거죠.

 

이렇게 하려면 어떤 방법으로 해야 할까요?

SQL쪽은 안가르쳐 주고 DBMS를 만들어오라고 해서 ㅠ_ㅠ

나름대로 SQL뒤져본 거 같은데 여기는 잘 모르겠네요.

 

 

혹시, SQL문 중에서 테이블이 아니라 DB를 생성할 수 있는 구문이 있나요?

그리고, 사용자의 정보를 입력해 놓은 member테이블에 생성한 해당 DB를 연결할 수 있을까요?

 

이 글에 대한 댓글이 총 3건 있습니다.

어떤 DB서버를 사용하시는지 잘 모르겠네요.

하지만 테이블이나 데이터베이스를 만들려면 먼저 권한이 있어야겠지요.
그런데 로그인한 회원의 정보는 member 테이블에 들어가 있고, 그 회원들은 데이터베이스에 대한 어떤 권한도 없는것 같네요.
결국엔 데이터베이스 생성권한이 있는 어떤 사용자(mssql의 sa나, mysql의 root등)의 권한으로 대신 데이터베이스나 테이블을
생성해야 겠네요.

먼저 member 테이블의 각 회원은 고유의 아이디를 가질 것이므로 아이디 중복이 발생하지 않는 것은 당연하겠죠.

제게 얼핏 생각나는 두가지 방법을 아래에 적어 보겠습니다.

첫번째 방법은 하나의 데이터베이스(여기서 데이터베이스명은 tempDBMS라고 가정하죠) 안에서 모든 회원들이 테이블을 생성할 수
있는 방법입니다. 이 방법을 사용하려면 tempDBMS에 대한 모든 권한을 가진 사용자가 각 회원이 하는 일을 대행해 주는 형식이어야
합니다.

1. tempDBMS 내의 모든 테이블을 관리할 수 있는 테이블을 하나 만듭니다.

SQL문 => create table rootTable(
  table_name varchar(255) not null,
  ownerID varchar(20) not null,
  primary key(table_name, ownerID)
 )

위의 SQL문에서 table_name은 회원이 만들기를 원하는 테이블명을 의미하고, ownerID는 회원 아이디를 의미합니다.
그런데 서로 다른 회원들이 동일한 테이블명으로 테이블을 생성할 수도 있겠죠. 그러면 당연히 늦게 생성되는 테이블은 생성이
안되겠죠. 하나의 데이터베이스 안에는 동일한 테이블명이 두개 존재할 수 없으니까요. 그래서 rootTable에 저장될 table_name은
회원이 만들려는 테이블 명을 그대로 저장하고 실제로 만들어질 테이블은 회원아이디_테이블명 처럼 만들어야 되겠네요.

1. 회원이 로그인하면 tempDBMS로 데이터베이스를 이동시킵니다. 이때 회원 아이디 정보는 계속 유지되어야 겠네요.
(웹폼일 경우는 쿠키나 세션을 사용하면 되는데.. 윈폼일 경우는 글쎄요.. 전역 변수에 담아두면 될것 같네요.)

SQL문 => use tempDBMS

2. 회원이 만들고 싶은 테이블 생성 쿼리를 윈폼의 richTextBox등에 적은후 생성 버튼등을 눌렀을때 발생하는 이벤트 내에서
다음의 동작을 취해야겠네요.
먼저 입력된 문자열중 create table과 여는 괄호 사이의 단어를 찾아내야겠네요. 그래야 테이블명을 얻을 수 있겠죠.
C#에는 문자열에 대한 정규표현식 클래스들이 있습니다. System.Text.RegularExpression 네임스페이스내에 존재하는데요..
아마 여기서 찾아보시면 해답을 얻지 않을까 싶네요.
어쨌든 얻어온 테이블명과 유지되고 있는 ownerID를 rootTable에 저장합니다. 이때 테이블명과 ownerID 모두가 같은 데이터가 이미
저장되어 있다면 Exception 처리등을 통해 회원이 이미 생성한 테이블이라는 걸 알려줘야 겠네요.

3. rootTable에 저장이 잘 되었다면 이젠 테이블을 실제로 생성해야죠. richTextBox에서 넘겨받은 테이블 생성 쿼리중에 테이블명만을
회원아이디_테이블명으로 바꿔서 테이블을 생성하면 되겠네요. 물론 이때도 정규표현식을 사용해야 겠군요.

4. 이렇게 생성까지 다 되면 이젠 rootTable 테이블을 통해서 제어가 가능하겠죠. 회원이 자신이 만든 테이블을 검색하고 싶다면
rootTable 테이블내의 ownerID와 회원의 아이디가 동일한 table_name의 값들을 구해서 그 앞에 회원아이디_까지 붙여서 검색하면
되겠네요.. 물론 데이터 삽입, 삭제, 갱신등에서 모두 정규표현식을 사용해야 하니깐 이런 일을 대신해 주는 클래스를 하나 만드셔야
겠네요.

조금 짜증나는 일이죠.
그래서 두번째 방법은 회원 아이디별 서로 다른 데이터베이스를 생성해 주는것입니다.

1. 회원 가입과 동시에 그 회원 아이디명의 데이터베이스를 만들어 주어야겠네요.
(이때 데이터베이스를 만들어주는 대행자는 당연히 데이터베이스 생성권한이 있는 사용자겠지요)

sql문 => create database 회원아이디

2. 회원이 로그인할 때 사용할 데이터베이스를 회원의 아이디명을 사용해서 이동해야 겠네요.

sql문 => use 회원아이디

3. 이제 회원아이디와 동일한 이름을 가진 데이터베이스로 변경되었으니  여기서 테이블명을 출력하면 모두 그 회원의 테이블이겠죠.
물론 로그인할 때 그 회원 이름의 데이터베이스로 이동했으니 테이블을 생성해도 그 회원의 테이블이란 걸 쉽게 판단할 수 있겠죠.

근데 위의 방법은 좀 쉽기는 한데 회원이 늘어나면 데이터베이스 수도 늘어나는 현상이 발생합니다.
데이터베이스 수가 늘어나도 별 문제 없다면 이렇게 하는 것도 괜찮겠죠...

허접해서 이것 밖에 생각이 안 나네요... ^^;;

 

허접상욱님이 2003-12-07 06:36에 작성한 댓글입니다.
이 댓글은 2003-12-07 06:49에 마지막으로 수정되었습니다. Edit

상욱님 자세한 설명 고맙습니다.

두번째 방법으로 했더니 대략 성공했네요^ㅡ^

 

InsaneE님이 2003-12-07 20:44에 작성한 댓글입니다. Edit

DBMS를 만드신다고 하셨는데요..

궁금해서 그러는데요..

작은 DBMS를 만드신다는 얘긴가요?

아니면 DBMS를 이용해서 프로그램을 하신다는 건지?

박성태님이 2004-01-06 15:10에 작성한 댓글입니다. Edit
[Top]
No.
제목
작성자
작성일
조회
896메인프레임에서 오픈시스템으로 마이그레이션후 검증에 대한 질문 [1]
개거품
2003-12-12
6616
894데이터베이스 시스템 책과 관련해서...
김진년
2003-12-04
6793
893Access하고.. Visual Basic하고... [1]
호이리~^^
2003-12-07
6736
892씨샵에서 DBMS를 만들고 있습니다. DB관련부분에서 질문드립니다. [3]
InsaneE
2003-12-06
7213
891병렬처리와 분산처리에 대해... [1]
김진년
2003-12-04
6692
890DB Tuning
최옥현
2003-12-02
6659
889데이타베이스 예제 하나만 보내주세요...리플부탁
바보멍팅
2003-11-23
6425
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.023초, 이곳 서비스는
	PostgreSQL v16.4로 자료를 관리합니다