'berkeleyDB'에 해당되는 글 2건

  1. 2009.07.08 OpenLDAP 서버 및 클라이언트 설정 (4)
  2. 2008.12.29 MySQL Foreign Key (외래키) 사용하기 (1)
2009.07.08 13:41

OpenLDAP 서버 및 클라이언트 설정

Install : http://www.openldap.org/doc/admin24/quickstart.html

위 메뉴얼을 통해 OpenLADP 설치를 완료합니다.

/etc/openldap 폴더에 slapd.conf.default 를 slapd.conf 로 변경한다.

database bdb
suffix "dc=<MY-DOMAIN>,dc=<COM>"
rootdn "cn=Manager,dc=<MY-DOMAIN>,dc=<COM>"
rootpw secret
directory /usr/local/var/openldap-data

이 부분이 핵심 설정이며 DB 부분이 특히.
BerkeleyDB를 backend로 사용할 수 있고 (파일로 된 DB) MySQL도 backend로 사용할 수 있다.
MySQL backend는 MySQL이 다운되면 전체 통합로그인 환경이 다운되는 것이니까 쓰지 않을 것이다.
BDB는 왠지 그냥 싫다. DB는 꼬일 수 있고, text로 되어있지 않아서 뻑나는 것에 민감함.
performance를 희생하도라도 ldif파일을 쓰기로 했다. 어차피 소규모니까.

Backends : http://www.openldap.org/doc/admin24/backends.html

특히나 suffix, rootdn의 MY-DOMAIN, COM부분을 신경써서, 잘 입력해야 한다.
필자의 경우는 suffix를 "dc=lab,dc=xxx,dc=ac,dc=kr" 이렇게 설정했다.
rootdn은 당연히, suffix와 같지만, 앞체 cn=Manager가 붙는 것만 다르다.

rootpw가 신경쓰이는군. 아무리 600권한 파일이라도 그렇지. 코멘트로, cleartext로 하지 말라고 되어있다.
hash로 해놓을 수 있는 모양이다.

Setup : http://www.redhat.com/docs/manuals/enterprise/RHEL-3-Manual/ref-guide/s1-ldap-quickstart.html

$ slappasswd

명령을 치면 비번을 묻는다.
비번을 두 번 입력하면, hash값이 생성된다. 이것을 rootpw의 secret자리에 대입한다.

directory설정도 거슬린다. 저건 /export의 openldap에 저장하기로 한다.

# zfs create rpool/export/openldap
# chmod 700 /export/openldap

이렇게 하면 아무나 못 들어가는, 그리고 snapshot을 찍을 수 있는 openldap 디렉토리가 생성된다.

결과는 이렇게 보임:

database ldif
suffix "dc=lab,dc=xxx,dc=ac,dc=kr"
rootdn "cn=Manager,dc=lab,dc=xxx,dc=ac,dc=kr"
rootpw {SSHA}SECRET/sdfhsdvohwpr/0W
directory /export/openldap

# service slapd start

$ ldapsearch -x -b '' -s base '(objectclass=*)' namingContexts

namingContexts: dc=lab,dc=xxx,dc=ac,dc=kr
이런 결과가 포함되어 있어야지 된다.

위까지 되었으면, daemon은 도는 것이다. 이제 내용을 넣으면 완성이다.
이제 초기 항목을 넣을 차례.

이런 내용의 파일을 만든다.

dn: dc=<MY-DOMAIN>,dc=<COM>
objectclass: dcObject
objectclass: organization
o: <MY ORGANIZATION>
dc: <MY-DOMAIN>

dn: cn=Manager,dc=<MY-DOMAIN>,dc=<COM>
objectclass: organizationalRole
cn: Manager

필자의 경우 수정하고 나니...

dn: dc=lab,dc=xxx,dc=ac,dc=kr
objectclass: dcObject
objectclass: organization
o: X Lab
dc: lab

이렇게 되었다. 이 파일을 domain.ldif 로 저장하였다.

이제 실제로 추가 한다:

$ ldapadd -x -D "cn=Manager,dc=lab,dc=xxx,dc=ac,dc=kr" -W -f domain.ldif

비번을 치라고 하는데...
-D가 무슨 뜻이냐면, domain 내의 저런 항목의 권한으로 ldap에 접속하겠단 뜻이다. 즉, manager = 관리자 권한으로 접속한다는 것이다.
-W는 비번을 치겠다는 것이고,
-f는 파일을 읽어들여서 그것대로 하라는 것이다.
-x는 simple auth를 사용하겠단 것이다 (SASL대신)

** 퀵스타트 매뉴얼을 보면, Manager항목에 대한 것도 있는데, 이는 절대로 써선 안된다. 왜냐... 그러면 phpLDAPadmin을 못 쓰게 된다. 이것 때문에 꽤 고생했음.

어쨌거나 필자는 여기까지 무사히 성공했다.
어쩌면 M$ 액티브디렉토리만큼 쉬운걸(?) 별로 태클 없이 되었으니.
/export/openldap 안에 뭐가 들었는지, 궁금하면

$ pfexec bash

를 하여 #를 본 상태로, cd해서 들어가보라. 디렉토리와 파일이, dn대로 만들어져 있을 것이다.

우선은 test용 id를 만들것이다?

근데, command line으로 하려면, 머리가 작살나서 안 된다.
http://phpldapadmin.sourceforge.net/
이런 아름다운 것을 써야, 진정한 LDAP이라고 할 수 있다.

말하자면, passwd 파일은 유저를 그냥 쭉 나열했기 때문에 간단한데, ldap은 2차원 구조라 commandline으로는 인간의 상상력을 시험에 들게 하기 때문이다 -_-

의외로 phpLDAPadmin 자료가 없어서 좀 고생했다만... openLDAP을 얹을 때, 생성해서는 안 될 항목이, quick 설정 매뉴얼에 있어서 그것을 제거하니 되었다. cn=Manager항목을 생성하지 않아야만 된다 -ㅠ-;; cookie도 안 먹는 것 같았다. 아마 cn=Manager는 openLDAP의 가상 cn이라 그럴려나... 어쨌거나, 관리의 쉬움과 설치의 쉬움을 위해서, 필자는, 이 manager로 ldapadmin이 접속하도록 했다(!).

그러면, 웹으로 접속하기만 해도, 아무나 막강한 권한을 가지게 되어 곤란하다. 이는 조금 있다 다루기로 하고, 우선은 이런 원시적인 무인증 접속(?) 부터 되게 해야 하겠다.

config.php를 읽기만 해도 문제 없을건데, 막상 자료를 찾아보면, openldap에선 이렇게 config.php파일이 나오더라... 라는 게 없어서 여기 올린다. 전체를 올린 것으로 보이는 것이 없어서 한참 해메었음.

<?php
$config->custom->session['blowfish'] = '어쩌구저쩌구';
$config->custom->jpeg['tmpdir'] = "/tmp";     // Example for Unix systems
 $config->custom->appearance['tree'] = "AJAXTree";

$i=0;
$ldapservers = new LDAPServers;

$ldapservers->SetValue($i,'server','name','LAB LDAP Server');
$ldapservers->SetValue($i,'server','host','127.0.0.1');
$ldapservers->SetValue($i,'server','port','389');
$ldapservers->SetValue($i,'server','base',array('dc=lab,dc=xxx,dc=ac,dc=kr'));
$ldapservers->SetValue($i,'server','auth_type','config');
$ldapservers->SetValue($i,'login','dn','cn=Manager,dc=lab,dc=xxx,dc=ac,dc=kr');
$ldapservers->SetValue($i,'login','pass','secret');
$ldapservers->SetValue($i,'server','tls',false);

$friendly_attrs = array();
$friendly_attrs['facsimileTelephoneNumber'] = 'Fax';
$friendly_attrs['telephoneNumber']          = 'Phone';
$friendly_attrs['uid']                      = 'User ID';

$q=0;
$queries = array();
$queries[$q]['name'] = 'User List';
$queries[$q]['base'] = 'dc=lab,dc=xxx,dc=ac,dc=kr';
$queries[$q]['scope'] = 'sub';
$queries[$q]['filter'] = '(&(objectClass=posixAccount)(uid=*))';
$queries[$q]['attributes'] = 'cn, uid, homeDirectory, telephonenumber, jpegphoto';

$q++;
$queries[$q]['name'] = 'Samba Users';
$queries[$q]['base'] = 'dc=lab,dc=xxx,dc=ac,dc=kr';
$queries[$q]['scope'] = 'sub';
$queries[$q]['filter'] = '(&(|(objectClass=sambaAccount)(objectClass=sambaSamAccount))(objectClass=posixAccount)(!(uid=*$)))';
$queries[$q]['attributes'] = 'uid, smbHome, uidNumber';

$q++;
$queries[$q]['name'] = 'Samba Computers';
$queries[$q]['base'] = 'dc=lab,dc=xxx,dc=ac,dc=kr';
$queries[$q]['scope'] = 'sub';
$queries[$q]['filter'] = '(&(objectClass=sambaAccount)(uid=*$))';
$queries[$q]['attributes'] = 'uid, homeDirectory';
?>

이게 설정의 전부이다. 대부분의 경우 default로 놔두었다. 다만... 아래에 있는 쿼리들... $queries 이 항목을은 바뀔 수도 있다. 디폴트값인데 필자는 얘들을 빼지 않고 그냥 방치하여 두었다.

이제쯤 인증을 하도록 해야겠군. .htaccess파일을 이용한다. phpLDAPadmin에 의존하기 보단 이게 더 간단하고 좋을 듯 하다. 작은 규모의 시스템이면. 혹은 관리자 집단이 작으면. .htaccess 설정을 쓰려면 아파치 설정을 잘 해서... AllowOverride를 FileInfo AuthConfig 로 해두어야 한다.

.htaccess파일:

AuthType Basic
AuthUserFile /export/www/ldapadmin/.htpasswd
AuthName "SSL LDAP admin authorization"
<Limit GET>
    require valid-user
</Limit>

.htpasswd파일은

$ htpasswd -c -m /export/www/ldapadmin/.htpasswd 사용자ID

명령어를 이용해 만들 수 있다. 파일 이름이 .ht로 시작해야만, http client들이 해당 파일을 받아가지 못한다. 반드시 .ht로 파일이름을 시작하도록 하자.

되도록 이 관리자 페이지는 HTTPS로 접속하는게 좋다.

이게 되도록 했으면...
이제 사용자 추가를 해보고 싶다 -ㅠ-


우선은 이렇게 ou=Groups와 ou=People을 만들어 놓는다.
이제 사용자를 추가하고 싶은데... 안 된다 ㅠㅠ 왜냐면...
openLDAP 설정을 잘못했기 때문이다.

slapd.conf를 다시 열어본다.

include     /opt/csw/etc/openldap/schema/core.schema

라는 줄이 첫머리에 있을 것이다.

include     /opt/csw/etc/openldap/schema/cosine.schema
include     /opt/csw/etc/openldap/schema/nis.schema
include     /opt/csw/etc/openldap/schema/inetorgperson.schema

이것을 추가하고, openLDAP서비스를 재시작하라.
nis가 포인트이고, nis는 cosine을 필요로 한다. nis까지 하면, posixAccount class가 추가되긴 하는데, template에 인간 추가 template이 안 보인다.
inetorgperson까지 있어야 사용자 추가가 된다. 이 세개가 minimum이라고 할 수 있다.

  설정을 잘못하기 전에는 휑하던 template가, purge cache를 한 뒤에는,


위와 비슷하게 변할 것이다. (필자가 inetorgperson.schema를 빼놓았던 때 찍은거라 몇개 없다 -_-;;)
PosixAccount를 만들어야 하는데 문제가 있따. 없다는 거...
기존에 잘못 만든 OU를 제거하고, Posix Group을 생성하고 그 안에서 새로 만들기를 하면 보일 것이다.

  ID를 만들어보았다. 채울 칸에 적절한 정보를 채우면 되지 뭐... 근데 shell이 마음에 안 드는군.
  이런 때에는 phpldapadmin/templates/creation 에서, posixAccount.xml 이것을 수정하든지,
  하나 복사해서 customization하든지 하면 된다.
  bash shell을 추가하고, default homedirectory를 적당하게 수정하였다.
  전화번호 같은 추가정보를 저장하고 싶다면, add new attribute기능을 사용하면 된다.

OpenLDAP + Samba

요약:
1. 삼바 서버를 tdbsam 백엔드로, standalone모드로 돌린다. 아래 설정을 긁어붙이든지 하라.
2. pam 을 수정해서, pam_sambapass.so를 쓰자. 이는 ldap계정의 비번으로 삼바의 tdbsam 데이터베이스의 비번을 새로 assign시킨다.

삼바는 LDAP 계정과 연동을 하려면 머리가 빠진다... 왜냐... 삼바는 액티브디렉토리(=LDAP) 이런 것과 연동되면서 복잡한 LDAP 연동 시스템을 갖추었기 때문이다.

그냥 대충 ssh로 OpenLDAP 접속할 수 있는 사람들이 삼바도 아용하게 하면 좋겠다. 간단히 되면 좋겠는데, OpenLDAP에 연동시키려면 Manager 비번도 지정해주고 ldap://어쩌구 하는 URI도 제시해야 하고... 설정이 너무 복잡해진다. 필자는 그런 복잡한 서버는 원치 않는다.

필자는... 간단한 해결책을 찾았다. pam_smbpasswd 를 이용하는 것이다!
http://www.samba.org/samba/docs/man/Samba-HOWTO-Collection/pam.html
이것을 사용하면...
사용자가 비번을 사용하는 서비스를 이용하기만 하면, 그 비밀번호를 이용하여 smbpasswd 명령어를 통해, 삼바의 자체 사용자 DB의 비번을 그 비번으로 assign 해버린다.

즉... 메일클라이언트가 되었든, FTP가 되었든, SSH가 되었든 이런 것들로 한 번만 로그인 하면, 삼바도 곧 이용 가능해지는 것이다!

필자는 삼바의 backend 를 tdbsam 으로 잡았다.

필자의 smb.conf이다:

force@lab:/etc/pam.d$ sudo testparm
Load smb config files from /etc/samba/smb.conf
Processing section "[homes]"
Loaded services file OK.
Server role: ROLE_STANDALONE
Press enter to see a dump of your service definitions

[global]
        workgroup = LAB
        server string = %h server (Samba, Ubuntu)
        map to guest = Bad User
        obey pam restrictions = Yes
        passdb backend = tdbsam
        pam password change = Yes
        passwd program = /usr/bin/passwd %u
        passwd chat = *Enter\snew\s*\spassword:* %n\n *Retype\snew\s*\spassword:* %n\n *password\supdated\ssuccessfully* .
        unix password sync = Yes
        syslog = 0
        log file = /var/log/samba/log.%m
        max log size = 1000
        dns proxy = No
        panic action = /usr/share/samba/panic-action %d
        invalid users = root

[homes]
        comment = Home Directories
        valid users = %S
        read only = No

사용자가 자신의 홈디렉토리를 볼 수 있는 파일서버를, standalone 모드로 돌린다. 유저는 삼바 자체 db로 관리한다. 그냥 이 대로만 하면 새 사용자가 추가될 때마다

$ sudo smbpasswd -a 새사용자ID

를 해주어야 해서 좀 번거로울 것이다.

이제 PAM 모듈을 설정할 차례이다. 필자는 여기서 해메었는데... default로는 pam_smbpass.so가 설치되지 않기 때문이다 -_-^;;;

$ sudo apt-get install libpam-smbpass

이렇게 PAM 모듈을 일단은 설치해주자. 물론, apt-get install samba 는 오래전에 해놓았지;;

이제 PAM모듈을 설정해줄 차례.
/etc/pam.d에 들어가자.
필자의 common-auth 파일이다. 한 줄이 추가되었다. 어느 위치에 들어가야지 제대로 의미가 사는 설정인지 필자는 잘 모르겠다. 하지만 작동하는 것을 올렸다는 점은 알아두라;;

auth       required     pam_env.so
auth       sufficient   pam_unix.so likeauth nullok
auth       optional     pam_smbpass.so migrate
auth       required     pam_group.so use_first_pass
auth       sufficient   pam_ldap.so use_first_pass
auth       required     pam_deny.so

common-password 파일:

password   sufficient   pam_unix.so nullok md5 shadow
password   optional     pam_smbpass.so nullok use_authtok try_first_pass
password   sufficient   pam_ldap.so
password   required     pam_deny.so

요렇다. 역시 한 줄이 추가된 것이다.

안 건드려도 되지만, 참고로
common-account 파일:

account    sufficient   pam_unix.so
account    sufficient   pam_ldap.so
account    required     pam_deny.so

역시 안 건드려도 되지만 그냥 참고로
common-session 파일:

session    required     pam_limits.so
session    required     pam_mkhomedir.so skel=/etc/skel/
session    required     pam_unix.so
session    optional     pam_ldap.so

이 대로 하면 성공할 것이다... 아마도 -_-;; 안 되면... 원인은 잘 모르겠군. 삽질을 해봐야 한다.

OpenLDAP을 사용해서 samba 인증을 연결하려고 한다.

참조한 문서는 http://download.gna.org/smbldap-tools/docs/samba-ldap-howto/, http://wiki.samba.org/index.php/Samba_&_LDAP 이다.

samba가 설치된 상황에서 smb-ldap tool을 설치한다.

소스를 받아서 INSTALL 문서를 보고 설치했다.

/etc/smbldap-tools/smbldap.conf 파일을 수정해서 아래처럼 고친다.

slaveLDAP="127.0.0.1"
masterLDAP="127.0.0.1"

suffix="dc=XXX,dc=com"

usersdn="ou=People,${suffix}"

computersdn="ou=Hosts,${suffix}"

groupsdn="ou=Group,${suffix}"

defaultUserGid="900"
defaultComputerGid="905"

ldapTLS="0"

sambaUnixIdPooldn="cn=NextFreeUnixId,${suffix}"

그리고 smbldap_bind.conf 파일에 root dn정보를 넣고 두 파일을 chmod 600한다.

아래 명령들로 openladp을 위한 samba용 schema파일의 symblock link를 만든다.

 [root@center schema]# pwd
/etc/openldap/schema
[root@center schema]# ln -s /usr/share/doc/samba-3.0.33/LDAP/samba.schema .
[root@center schema]#

/etc/slapd.conf에 아래 내용을 추가한다.

include         /etc/openldap/schema/samba.schema

/etc/samba/smb.conf 파일을 열고 아래와 [global]에 아래와 같이 LDAP연결 부분을 추가한다.

         ldap passwd sync = No
        passdb backend = ldapsam:ldap://127.0.0.1/
        ldap suffix = dc=XXX,dc=com
        ldap user suffix = ou=People
        ldap group suffix = ou=Group
        ldap admin dn = cn=manager,dc=XXX,dc=com

자, 이제 samba를 위해서 필요한 LDAP entry들을 추가해야 한다.

이것은 smbldap-populate명령으로 가능하다.

현재까지 설정이 모두 제대로 되었다면 smbldap-populate가 아무런 에러없이 수행되어야 한다.

만약 에러가 발생하면 뭔가 문제가 있는 것이니 위의 설정을 수정해서 해결하자.

이제 새로운 사용자를 추가하고 과연 제대로 되는지 확인해야 한다.

# smbldap-useradd -m -a testuser
# smbldap-passwd testuser

위의 두 명령으로 testuser를 추가하고 암호를 설정하자.

smbclient로 localhost에접속에 성공하면 제대로 설정된 것이다.

마찬가지로 ssh 로도 접속할 수 있어야 한다.

기존에 등록된 사용자가 있다면 LDAP Admin 프로그램을 통해서 손쉽게 samba 사용자로 전환할 수 있다.

예전 사용자의 정보에서 Samba Account 체크박스를 활성화 시키면 된다.

그리고 change password를 통해서 계정의 암호를 다시 설정해야 한다.


출처 : http://forcecore.tistory.com/


O'REILY 에서 나온 LDAP System Administration 의 9. LDAP Interoperability http://www.linuxjournal.com/node/6266/print

http://www.joinc.co.kr/modules/moniwiki/wiki.php/%B8%AE%B4%AA%BD%BA%BF%A...
리눅스에서 LDAP를 이용한 PAM 구성
http://www.linuxjournal.com/article/5689 OpenLDAP with Linux and Windows
http://www.linuxjournal.com/article/5505 Highly Available LDAP

아래의 KB 와 Article도 참고하세요~

Windows 2000 Authentication [Kerberos components, NTLM, Unix, Errors, etc]:
http://www.windowsitlibrary.com/Content/617/06/1.html

ACD Linux System Administration - Kerberos Notes
http://acd.ucar.edu/~fredrick/linux/kerberos

ACD Linux System Administration - Kerberos Testbed
http://acd.ucar.edu/~fredrick/linux/kerberos/testbed.html

Support WebCast: Services for UNIX 3.0: An Introduction to New
Features
http://support.microsoft.com/default.aspx?scid=kb;en-us;324871&gssnb=1

Active Directory and nss_ldap for Linux: centralized user management
http://www.hut.fi/cc/docs/kerberos/nss_ldap.html

Replacing NIS with Kerberos and LDAP HOWTO
http://www.ofb.net/~jheiss/krbldap/howto.html

Trust Does Not Work Between Windows 2000 and MIT Kerberos [Unix]:
http://support.microsoft.com/default.aspx?scid=kb;EN-US;266082

anonymous queries 를 이용시 
아래 두 KB 를 읽어보세요.

Anonymous LDAP operations to Active Directory are disabled on Windows Server 2003 domain controllers
http://support.microsoft.com/default.aspx?scid=kb;en-us;326690

How to configure Active Directory to allow anonymous queries
http://support.microsoft.com/default.aspx?scid=kb;en-us;320528


Trackback 1 Comment 4
  1. Favicon of http://shapy77.tistory.com 김상민 2010.01.25 14:27 address edit & del reply

    정말 좋은 정보 감사합니다. 제가 LDAP에 관한정보를 찾던중 너무 설명을 잘해놓으신 자료라 많이 도움이 되었습니다. 한가지 궁금한건 저는 인증용이 아니라 아웃룩등의 주소록으로만 사용하고 싶은데 가능한지 궁금합니다. 가능하다면 설정은 어떻게 해야하는지도 부탁 드립니다. 바쁘시지만 답변 주시면 정말 감사하겠습니다. 메일 : shapy77@dsrsys.com

  2. 김현영 2012.01.06 10:18 address edit & del reply

    질문하나 드려도 될까요?

    최종목표는 LDPA가 구현된 서버가 있는데..(이미 구현은 되어있구요)
    거기에 임베디드 리눅스를 사용하는 단말기가 접속이 가능하게 하는건데요^^;

    운영자님 생각에는 임베디드 리눅스에 포팅이 가능할꺼라 생각되시는지요?
    비지박스에 포함이 되어있는가 아니면 소스를 구해서 직접포팅을 해야하나.. 갈피가 안잡히네요

    사용자들의 정보가 LDAP에 저장 되있으면.
    단말기가 LDAP에 접속하여서 그정보를 받아오려고 하고 있답니다^^;;

    • Favicon of https://blog.pages.kr 날으는물고기 2012.01.06 18:38 신고 address edit & del

      가능은 할거라 생각합니다.
      일부 수정이 필요한 부분은 직접 커스터마이징 해서 충분히 활용 가능합니다.

  3. 김석준 2013.02.05 14:27 address edit & del reply

    정말 감사합니다.
    안그래도 사내 openldap 에 samba 를 연동해야 하는데, 고민하신 것처럼, 그냥 계정만 연동해서 쓰고 싶은데, 너무 복잡해져서 이건아닌데.. 하고 있던 찰나에, 좋은 글을 보게 되어 많은 도움이 되었습니다. 정말 밥이라도 한끼 사드리고 싶을 정도고 고맙네요
    정말 감사합니다.!!

2008.12.29 10:17

MySQL Foreign Key (외래키) 사용하기

MySQL에서 InnoDB 테이블은 Foreign 키 제한 검사를 지원한다.

Foreign 키 제한은 단순히 두 테이블을 조인 (join)하기 위해 필요한 것이 아니다. InnoDB가 아닌 스토리지 엔진의 경우, 컬럼이 REFERENCES tbl_name(col_name) 구문을 사용하도록 정의하는 것이 가능한데, 이것은 실제로 아무런 효과도 없으며, 또한 여러분이 지금 정의하는 컬럼은 다른 테이블에 있는 컬럼을 참조하도록 의도된 것이라는 것을 알려주는 메모 또는 코멘트 역할만 하게 된다. 이 신텍스를 다음과 같은 상황에서 사용할 때는 특히 중요하다:

·         MySQLcol_name 이 실제로 tbl_name 에 있는지 (또는 tbl_name 자체가 존재하는지) 확인하기 위한 어떠한 종류의 CHECK도 실행하지 않는다.   

·         MySQL 은 여러분이 정의한 테이블에서 열을 가져와서 삭제하는 것과 같은 행동을 tbl_name 에서는 전혀 하지 않는다; 다른 말로 표현하면, 이 신텍스는 ON DELETE 또는 ON UPDATE 가 구동하는데 아무런 영향을 미치지 않는다. (여러분이ON DELETE 또는 ON UPDATE 구문을 REFERENCES 구문의 일부분으로 작성한다 하더라도, 이것은 무시되어 버린다.)

·         이 신텍스는 column을 만들어 낸다; 이것은 어떤 종류의 인덱스 또는 키를 만들지는 않는다.

·         이 신텍스는 InnoDB 테이블을 정의하기 위해 사용할 때 에러를 발생시킨다.

여러분은 여기에서 보듯이, 컬럼을 만들어서 조인(join) 컬럼으로 사용할 수 있다:

CREATE TABLE person (
    id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
    name CHAR(60) NOT NULL,
    PRIMARY KEY (id)
);
CREATE TABLE shirt (
    id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
    style ENUM('t-shirt', 'polo', 'dress') NOT NULL,
    color ENUM('red', 'blue', 'orange', 'white', 'black') NOT NULL,
    owner SMALLINT UNSIGNED NOT NULL REFERENCES person(id),
    PRIMARY KEY (id)
);
INSERT INTO person VALUES (NULL, 'Antonio Paz'); 
SELECT @last := LAST_INSERT_ID();
INSERT INTO shirt VALUES
(NULL, 'polo', 'blue', @last),
(NULL, 'dress', 'white', @last),
(NULL, 't-shirt', 'blue', @last);
INSERT INTO person VALUES (NULL, 'Lilliana Angelovska');
SELECT @last := LAST_INSERT_ID();
INSERT INTO shirt VALUES
(NULL, 'dress', 'orange', @last),
(NULL, 'polo', 'red', @last),
(NULL, 'dress', 'blue', @last),
(NULL, 't-shirt', 'white', @last); 
SELECT * FROM person;
+----+---------------------+
| id | name                |
+----+---------------------+
|  1 | Antonio Paz         |
|  2 | Lilliana Angelovska |
+----+---------------------+ 
SELECT * FROM shirt;
+----+---------+--------+-------+
| id | style   | color  | owner |
+----+---------+--------+-------+
|  1 | polo    | blue   |     1 |
|  2 | dress   | white  |     1 |
|  3 | t-shirt | blue   |     1 |
|  4 | dress   | orange |     2 |
|  5 | polo    | red    |     2 |
|  6 | dress   | blue   |     2 |
|  7 | t-shirt | white  |     2 |
+----+---------+--------+-------+ 
SELECT s.* FROM person p, shirt s
 WHERE p.name LIKE 'Lilliana%'
   AND s.owner = p.id
   AND s.color <> 'white'; 
+----+-------+--------+-------+
| id | style | color  | owner |
+----+-------+--------+-------+
|  4 | dress | orange |     2 |
|  5 | polo  | red    |     2 |
|  6 | dress | blue   |     2 |
+----+-------+--------+-------+

이러한 형태로 사용될 경우에, REFERENCES 구문은 SHOW CREATE TABLE 또는 DESCRIBE 구문의 결과에는 나타나지 않는다:

SHOW CREATE TABLE shirt\G
*************************** 1. row ***************************
Table: shirt
Create Table: CREATE TABLE `shirt` (
`id` smallint(5) unsigned NOT NULL auto_increment,
`style` enum('t-shirt','polo','dress') NOT NULL,
`color` enum('red','blue','orange','white','black') NOT NULL,
`owner` smallint(5) unsigned NOT NULL,
PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1

여기에서처럼 REFERENCES 를 컬럼 정의문에서 코멘트 형태 또는 리마인더(reminder)”로 사용하는 것은 MyISAM BerkeleyDB 테이블에서도 적용 할 수 있다.


출처 : www.mysqlkorea.co.kr

Trackback 0 Comment 1
  1. 최세민 2009.08.20 17:59 address edit & del reply

    좋은 정보 감사합니다.
    FOREIGN KEY가 적용 되지 않아서 한참 해맸는데 테이블 형식을 innodb로 변경하니깐 바로 적용 되는 군요. ^^