A transaction consists of a sequence of query and/or update statements and is a "unit" of work
transaction은 끝날 때 다음 중 하나로 끝나야 한다
즉, 완전히 수행 완료 되거나, 다시 원상태로 돌아가거나 둘 중 하나다.
ex). ATM에서 돈 인출하다가 기계가 죽어. 현금은 안나오고 통장에서 돈은 나가는 상황이 발생하면 안된다. -> 초기 상태로 돌아가야지
Atomic transaction
: either fully executed or rolled back as if it never occurred
또한 동시에 발생하는 transaction에도 각각 순서를 매겨주어야 한다.
: sequential isolation
database에 대한 사고를 막는다. database에 대해 허가된 변화가 data consistency(일관성)을 잃어버리게 하지 못하게 한다
example
무결성 제약조건, Integrity Constraints는 이론적으로 DB에 아무 형태로든 사용 가능하다. 보통 적당히 허용한다(?)
name varchar(20) not null
budget numeric(12,2) not null
unique(A1, A2, ..., Am)
create table section
(course_id varchar(8),
sec_id varchar(8),
semester varchar(6),
year numeric(4, 0),
building varchar(15),
room_number varchar(7),
time_slot_id varchar(4),
primary key(course_id, sec_id, semester, year),
check(semester in ('Fall', 'Winter', 'Spring', 'Summer') ) )
(foreign key constraint)가 referential integrity의 special case라고 생각하면 된다
주어진 속성들의 모임에 대해 한 relation에서 등장한 값이, 다른 relation의 특정 속성 모임에서 등장하도록 한다
(Ensure that a value that appears in one relation for a given set of attributes also appears for a certain set of attributes in another relation.)
Let A be a set of attributes.
Let R and S be two relations that contain attributes A,
and where A is the primary key of S.
A said to be a foreign key of R
if for any values of A appearing in R these values also appear in S
foreign key는 create table statement에서 지정될 수 있다.
foreign key (dept_name) references department
// dept_name이라는 속성은 department의 primary key 역할을 한다.
// foreign key가 여러개 될 수도 있다.
create table course
(...
dept_name varchar(20),
foreign key (dept_name) references department
on delete cascade
on update cascase, // 2번에 대한 내용
...)
create table person(
ID char(10),
name char(40),
mother char(10),
father char(10),
primary key ID,
foreign key father references person,
foreign key mother references person)
check (time_slot_id in (select time_slot_id from time_slot) )
// section relation에 있는 각 tuple의 time_slot_id는
// time_slot relation의 time slot의 identifier 역할을 한당.
create assertion <assetion-name> check (<predicate>);
create assertion credits_earned_constraint check
(not exist (select ID
from student
where tot_cred <> (select coalesce(sum(credits, 0)
from takes natural join course
where student.ID = takes.ID
and gradt is not null
and grade <> 'F' ) ) )
date : Dates, containing a (4 digit) year, month and date
date '2023-3-25'
time : Time of day, in hours minutes and seconds
time '09:00:30'
time '09:00:30.75'
timestamp : date plus time of day
timestamp '2005-7037 09:00:30.75'
interval : period of time
interval '1' day
Large object(photo, video, CAD file, etc.)는 large object로 저장된다
blob : binary large object
clob : character large object
query가 large object를 리턴할 때, large object 자체를 리턴하기보단, 그 주소(pointer)가 리턴된다.
create type Dollars as numeric(12, 2) final
// final 의미 : 더 이상 얘 가지고 다른 type 정의할 수 없다.
create table department
(dept_name varchar(20),
building varchar(15),
budget Dollars);
create domain person_name char(20) not null
create domain degree_level varchar(10)
constraint degree_level_test
check (value in ('Barchelors', 'Masters', 'Doctorate'));
create index <name> on <relation-name> (attribute);
create table student
(ID varchar(5),
name varchar(20) not null,
dept_name varchar(20),
tot_cred numeric(3, 0) default 0,
primary key(ID) )
create index studentID_index on student(ID)
select *
from student
where ID = '12345'
권한 on parts of the database
권한 to modify the database schema
grant <privilege list> on <relation or view> to <user list>
grant select on department to Amit, Satoshi
// department에서 select할 수 있는 권한을 부여한다.
revoke <privilege list> on <relation or view> from <user list>
revoke select on student from U1, U2, U3
user들의 group
A role is a way to distinguish among various users as far as what these users can access/update in the database
create a role <name>
create role instructor
grant <role> to <users>
// users를 role에 포함시킨다
create role instructor;
grant instructor to Amit;
// role에 권한을 주면 그 member들이 모두 권한을 받는다
grant select on takes to instructor;
// role은 user 뿐만 아니라, 다른 role에도 부여할 수 있다
create role teaching_assistant
grant teaching_assistant to instructor;
// 이렇게 하면, instructor는 teachint_assistant의 모든 privilege를 상속받는다
// Chain of roles
create role dean;
grant instructor to dean;
grant dean to Satoshi;
// Satoshi는 dean에도 속하고, instructor에도 속한다
// instructor의 privilege가 바뀌면 dean의 previlege도 바뀐다.
여기 내용부터 잘 이해가 안된다..
create view geo_instructor as
(select *
from instructor
where dept_name = 'Geology');
grant select on geo_instructor to geo_staff
// geo_instructor(view)에 대한 select(권한)을 geo_staff에게 준다
// Suppose that a geo_staff member issues
select *
from geo_instructor;
grant referenct (dept_name) on department to Mariano;
grant select on department to Amit with grant option;
// 다른 사람들에게 준 select 권한도 다 회수한다
revoke select on department from Amit, Satoshi cascade;
// 얘네한테만 회수하고 다른 사람들은 내버려 둔다
revoke select on department from Amit, Satoshi restrict;