사용자 관리¶
데이터베이스 사용자¶
사용자 이름 작성 원칙은 식별자 절을 참고한다.
CUBRID는 기본적으로 DBA 와 PUBLIC 두 종류의 사용자를 제공한다. 처음 제품을 설치했을 때에는 비밀번호가 설정되어 있지 않다.
모든 사용자는 PUBLIC 사용자에게 부여된 권한을 소유한다. 데이터베이스의 모든 사용자는 PUBLIC 의 멤버가 된다. 사용자에게 권한을 부여하는 방법은 PUBLIC 사용자에 대한 권한을 부여하는 것이다.
DBA 는 데이터베이스 관리자를 위한 권한을 소유한다. DBA 는 자동으로 모든 사용자와 그룹의 멤버가 된다. 즉, DBA 는 모든 테이블에 대한 접근 권한을 갖는다. 따라서 DBA 와 DBA 의 멤버에게 명시적으로 권한을 부여할 필요는 없다. 데이터베이스 사용자는 고유한 이름을 갖는다. 데이터베이스 관리자는 cubrid createdb 유틸리티를 이용하여 일괄적으로 사용자를 생성할 수 있다(자세한 내용은 cubrid 유틸리티 참조). 데이터베이스 사용자는 동일한 권한을 갖는 멤버를 소유할 수 없다. 사용자에게 권한이 부여되면 해당 사용자의 모든 멤버는 자동으로 동일한 권한을 소유한다.
CREATE/ALTER/DROP USER¶
DBA 와 DBA 의 멤버는 SQL 문을 사용하여 사용자를 생성, 변경, 삭제할 수 있다.
CREATE USER user_name
[PASSWORD password]
[GROUPS user_name [{, user_name } ... ]]
[MEMBERS user_name [{, user_name } ... ]]
[COMMENT 'comment_string'];
ALTER USER user_name PASSWORD password;
DROP USER user_name;
user_name: 생성, 삭제, 변경할 사용자 이름을 지정한다.
password: 생성 혹은 변경할 사용자의 비밀번호를 지정한다.
comment_string: 사용자에 대한 커멘트를 지정한다.
다음은 사용자 Fred 를 생성하고 비밀번호를 변경한 후에 Fred 를 삭제하는 예제이다.
CREATE USER Fred;
ALTER USER Fred PASSWORD '1234';
DROP USER Fred;
다음은 사용자를 생성하고 생성된 사용자에 멤버를 추가하는 예제이다. 다음 문장을 통해 company 는 engineering, marketing, design 을 멤버로 가지는 그룹이 된다. marketing 은 smith, jones 를, design 은 smith 를, engineering 은 brown 을 멤버로 가지는 그룹이 된다.
CREATE USER company;
CREATE USER engineering GROUPS company;
CREATE USER marketing GROUPS company;
CREATE USER design GROUPS company;
CREATE USER smith GROUPS design, marketing;
CREATE USER jones GROUPS marketing;
CREATE USER brown GROUPS engineering;
다음은 위와 동일한 그룹을 생성하는 예이지만 GROUPS 대신 MEMBERS 문을 사용하는 예제이다.
CREATE USER smith;
CREATE USER brown;
CREATE USER jones;
CREATE USER engineering MEMBERS brown;
CREATE USER marketing MEMBERS smith, jones;
CREATE USER design MEMBERS smith;
CREATE USER company MEMBERS engineering, marketing, design;
사용자의 커멘트¶
사용자에 대한 커멘트는 다음과 같이 지정한다.
CREATE USER designer GROUPS dbms, qa COMMENT 'user comment';
사용자에 대한 커멘트는 ALTER USER 문을 사용하여 다음과 같이 변경이 가능하다.
ALTER USER DESIGNER COMMENT 'new comment';
다음 구문으로 사용자에 대한 커멘트를 확인할 수 있다.
SELECT name, comment FROM db_user;
GRANT¶
CUBRID에서 권한 부여의 최소 단위는 테이블이다. 자신이 만든 테이블에 다른 사용자(그룹)의 접근을 허용하려면 해당 사용자(그룹)에게 적절한 권한을 부여해야 한다.
권한이 부여된 그룹에 속한 모든 멤버는 같은 권한을 소유하므로 모든 멤버에게 개별적으로 권한을 부여할 필요는 없다. PUBLIC 사용자가 생성한 (가상) 테이블은 모든 사용자에게 접근이 허용된다. GRANT 문을 사용하여 사용자에게 접근 권한을 부여할 수 있다.
GRANT operation [ { ,operation } ... ] ON [schema_name.]table_name [ { , [schema_name.]table_name } ... ]
TO user [ { ,user } ... ] [ WITH GRANT OPTION ] ;
operation: 권한을 부여할 때 사용 가능한 연산을 나타낸다.
SELECT: 테이블 정의 내용을 읽을 수 있고 인스턴스 조회가 가능. 가장 일반적인 유형의 권한.
INSERT: 테이블의 인스턴스를 생성할 수 있는 권한.
UPDATE: 테이블에 이미 존재하는 인스턴스를 수정할 수 있는 권한.
DELETE: 테이블의 인스턴스를 삭제할 수 있는 권한.
ALTER: 테이블의 정의를 수정할 수 있고, 테이블의 이름을 변경하거나 삭제할 수 있는 권한.
INDEX: 검색 속도의 향상을 위해 칼럼에 인덱스를 생성할 수 있는 권한.
EXECUTE: 테이블 메서드 혹은 인스턴스 메서드를 호출할 수 있는 권한.
ALL PRIVILEGES: 앞서 설명한 7가지 권한을 모두 포함.
schema_name: 테이블 혹은 뷰의 스키마 이름을 지정한다. 생략하면 현재 세션의 스키마 이름을 사용한다.
table_name: 권한을 부여할 테이블 혹은 뷰의 이름을 지정한다.
user: 권한을 부여할 사용자나 그룹의 이름을 지정한다. 데이터베이스 사용자의 로그인 이름을 입력하거나 시스템 정의 사용자인 PUBLIC 을 입력할 수 있다. PUBLIC 이 명시되면 데이터베이스의 모든 사용자는 부여한 권한을 가진다.
WITH GRANT OPTION: WITH GRANT OPTION 을 이용하면 권한을 부여받은 사용자가 부여받은 권한을 다른 사용자에게 부여할 수 있다.
다음은 smith (smith 의 모든 멤버 포함)에게 olympic 테이블의 검색 권한을 부여한 예제이다.
GRANT SELECT ON olympic TO smith;
다음은 brown 와 jones (두 사용자에 속한 모든 멤버)에게 nation 과 athlete 테이블에 대해 SELECT, INSERT, UPDATE, DELETE 권한을 부여한 예제이다.
GRANT SELECT, INSERT, UPDATE, DELETE ON nation, athlete TO brown, jones;
다음은 모든 사용자(public)에게 tbl1, tbl2 테이블에 대해 모든 권한을 부여하는 예제이다.
CREATE TABLE tbl1 (a INT);
CREATE TABLE tbl2 (a INT);
GRANT ALL PRIVILEGES ON tbl1, tbl2 TO public;
다음 GRANT 문은 brown 에게 record, history 테이블에 대한 검색 권한을 부여하고 brown 이 다른 사용자에게 검색 권한을 부여하는 것을 허용하도록 WITH GRANT OPTION 절을 사용한 예제이다. 이후 brown 은 다른 사용자에게 자신이 받은 권한 내에서 권한을 부여할 수 있다.
GRANT SELECT ON record, history TO brown WITH GRANT OPTION;
Note
권한을 부여하는 사용자는 권한 부여 전에 나열된 모든 테이블의 소유자이거나, WITH GRANT OPTION 을 가지고 있어야 한다.
뷰에 대한 SELECT, UPDATE, DELETE, INSERT 권한을 부여하기 전에 뷰의 소유자는 뷰의 질의 명세부에 포함되어 있는 모든 테이블에 대해서 SELECT 권한과 GRANT 권한을 가져야 한다. DBA 사용자와 DBA 그룹에 속한 멤버는 자동적으로 모든 테이블에 대한 모든 권한을 가진다.
TRUNCATE 문을 수행하려면 ALTER, INDEX, DELETE 권한이 필요하다.
REVOKE¶
REVOKE 문을 사용하여 권한을 해지할 수 있다. 사용자에게 부여된 권한은 언제든지 해지가 가능하다. 한 사용자에게 두 종류 이상의 권한을 부여했다면 권한 중 일부 또는 전부를 해지할 수 있다. 또한 하나의 GRANT 문으로 여러 사용자에게 여러 테이블에 대한 권한을 부여한 경우라도 일부 사용자와 일부 테이블에 대해 선택적인 권한 해지가 가능하다.
권한을 부여한 사용자에게서 권한(WITH GRANT OPTION)을 해지하면, 권한을 해지당한 사용자로부터 권한을 받은 사용자도 권한을 해지당한다.
REVOKE operation [{, operation}] ON [schema_name.]table_name [{, [schema_name.]table_name}]
FROM user [{, user}] ;
operation: 권한을 부여할 때 부여할 수 있는 연산의 종류이다(자세한 내용은 GRANT 참조).
schema_name: 테이블 혹은 뷰의 스키마 이름을 지정한다. 생략하면 현재 세션의 스키마 이름을 사용한다.
table_name: 권한을 부여할 테이블 혹은 뷰의 이름을 지정한다.
user: 권한을 부여할 사용자나 그룹의 이름을 지정한다.
다음은 smith, jones 사용자에게 nation, athlete 두 테이블에 대해 SELECT, INSERT, UPDATE, DELETE 권한을 부여하는 예제이다.
GRANT SELECT, INSERT, UPDATE, DELETE ON nation, athlete TO smith, jones;
다음은 jones 에게 조회 권한만을 부여하기 위해 REVOKE 문장을 수행하는 예제이다. 만약 jones 가 다른 사용자에게 권한을 부여했다면 권한받은 사용자 또한 조회만 가능하다.
REVOKE INSERT, UPDATE, DELETE ON nation, athlete FROM jones;
다음은 smith 에게 부여한 모든 권한을 해지하기 위해 REVOKE 문을 수행하는 예제이다. 이 문장이 수행되면 smith 는 nation, athlete 테이블에 대한 어떠한 연산도 허용되지 않는다.
REVOKE ALL PRIVILEGES ON nation, athlete FROM smith;
ALTER … OWNER¶
데이터베이스 관리자(DBA) 또는 DBA 그룹의 멤버는 다음의 질의를 통해 테이블, 뷰, 트리거, Java 저장 함수/프로시저의 소유자를 변경할 수 있다.
ALTER (TABLE | CLASS | VIEW | VCLASS | TRIGGER | PROCEDURE | FUNCTION) [schema_name.]name OWNER TO user_id;
schema_name: 객체의 스키마 이름을 지정한다. 생략하면 현재 세션의 스키마 이름을 사용한다.
name: 소유자를 변경할 스키마 객체의 이름
user_id: 사용자 ID
ALTER TABLE test_tbl OWNER TO public;
ALTER VIEW test_view OWNER TO public;
ALTER TRIGGER test_trigger OWNER TO public;
ALTER FUNCTION test_function OWNER TO public;
ALTER PROCEDURE test_procedure OWNER TO public;