Create view viewName as <query expression>;
Create view myProfessor as
select pID, name, deptName //salary 숨기기
from professer;
Create view myFaculty as
select pID, name, deptName
from professor
where salary > 50000;
Create view myFacultyCS as
select pID, name
from myFaculty
where deptName = 'CS';
→ 확장Create view myFacultyCS as
select pID, name
from professsor
where deptName = 'CS' and salary > 50000;
Create view myProfessor as
select pID, name, deptName
from professor;
Insert into myProfessor values ('12345', 'Lee', 'CS');
//salary에는 null값 지정
Create view professorInfo as
select pID, name, building
from professor, department
where professor.deptName = department.deptName;
Insert into professorInfo values ('2345', 'White', 'Vision Hall');
//professor, department 어느 테이블에 입력?
//사용자 입력 값에 없는 deptName?
베이스 테이블 수정하는 데에 모호함 존재 → 입력 연산 지원 X
Create view departmentTotalSalary(deptName, totalSalary) as
select deptName, sum(salary)
from professor
group by deptName;
Insert into departmentTotalSalary values ('CS', 100000);
집계함수에 대한 갱신 베이스 테이블에 반영할 방법 X → 변경 연산 지원 X
group by
, having
, distinct
, 집합 연산, 집계 함수, order by
→ view 정의에 포함되지 않아야 한다.Create view CSProfessor as
select *
from professor where deptName='CS';
Insert into CSProfessor values ('255', 'Brown', 'EE');
//CSProfessor view에서 안 보임 'EE'여서
단일 테이블에 적용되는 대표적인 무결성 제약
not null
primary key
unique
check (P), where P is a predicate
Create table teaches (
...
semester varchar(10),
...
check (semester in ('Spring', 'Summer', 'Fall', 'Winter'))
);
구체적인 action없이 선언 가능
참조 무결성이 위반되는 연산은 허용 X
→ 위반할 경우 행동 명시 가능 : `cascade` , `set null`, `set default`
Create table teaches (
...
foreign key(pID) references professor,
on delete cascade,
on update cascade,
);
→ professor 테이블에 대한 delete, update 연산에 대해 cascade
casecade : 연산된 tuple을 참조하는 두 tuple 모두 변경
teaches에서 tuple 삭제 → 참조무결성 제약 위배 X
teaches에서 해당 속성값 변경 → 행동명시와 관련없이 수행 X
데이터 입력 시 외래키에 대한 정보 필요
해결법1. 대규모 데이터 입력
→ 현실적으로 아주 불편
해결법2. 추가적인 갱신 연산 필요
→ 무결성 제약을 연기하여 점검하는 기능 제공 (Deferrable ICs)
initially deferred
무결성 제약 검사 및 행동 연기 가능Create teaches (
pID char(5) check (pID in (select pID from professor))
); //단 teaches.pID가 null값인 경우 제외
→ 무결성 제약 만족 여부를 teaches 테이블에 변화가 있을 때만 한정하여 professor 테이블에 변화가 있어도 무결성 제약을 점검하지 않는 문제 발생사용자 임의의 무결성 제약 유지
Create assertion <assertion-name> check <predicate>;
Create assertion myVerifyTotalCredit check
(not exists
(select s1.sID
from student s1
where s1.totalCredit <> (select sum(credit)
from takes, course
where s1.sID = sID
and course.cID = takes.cID
and grade is not null
and grade <> 'F')
)
);
2023.10.19
Event 사건 : 변경 연산 insert
delete
update
Condition 조건
Action 행동
→ 어떤 사건 발생 시, 주어진 조건 평가하여 조건 만족 시 주어진 행동수행
Update of 속성명 on 테이블명
referencing old row as //delete, update
referencing new row as //insert, update
학점 취득 시 취득한 총 학점을 변경하는 트리거 구성
//trigger명, event 명시
Create trigger myCred after update of grade on takes
referencing new row as nrow
referencing old row as orow
for each row //event, action을 값이 변경된 각 tuple을 기준으로 수행
//condition 명시
when nrow.grade <> 'F' and nrow.grade is not null
and (orow.grade = 'F' or orow.grade is null)
//action 명시
begin
update student
set totalCredit = totalCredit +
(select credit
from course
where cID = nrow.cID)
where sID = nrow.sID;
end;
잔고보다 많은 금액의 수표 발생(overdraft) 시, 대출 계좌를 사용자 명의로 개설하고 대출금을 overdraft된 금액으로 하는 작업
account(aNumber, balance) //계좌번호, 잔고
loan(INumer, amount) //대출번호, 대출금
depositor(cName, aNumber) //고객명, 계좌번호
borrower(cName, INumber) //대출고객명, 대출번호
//trigger명, event 명시
Create trigger myOverdraft after update on account
referencing new row as nrow
for each row //event, action을 값이 변경된 각 tuple을 기준으로 수행
//condition 명시
when nrow.balance < 0
//action 명시
begin atomic //아래 3개의 트랜잭션 all-or-nothing (ACID)
//SQL 문장 하나이면 begin atomic ... end 사용 X
Insert into borrower
(select cName, aNumber
from depositor
where nrow.aNumber = depositor.aNumber);
Insert into loan values (nrow.aNumber, -nrow.balance);
Update account set balance = 0
where account.aNumber = nrow.aNumber;
end;
employee의 salary 속성 변경 시, department의 totalSalary 속성 변경
employee(name, eID, salary, dNumber)
department(dname, dno, totalSalary)
Create trigger myTotalSalary
after update of salary on employee
referencing new row as nrow
referencing old row as orow
for each row
when (nrow.dNumber is not null)
Update department
set totalSalary=totalSalary+nrow.salary-orow.salary
where dno = nrow.dNumber;
Create trigger mySetNull before update on takes
referencing new row as nrow
for each row
when (nrow.grade = ' ')
Update takes set nrow.grade = null;
for each row
for each statement
SQL 문장 단위로 trigger 수행
사건 전후 테이블을 테이블 단위로 참조
trigger 행동으로 인해 많은 tuple에 변화가 있는 경우 유용
referencing old table as otable
referencing new table as ntable
for each statement
전체 테이블에 대해 일괄적으로 totalSalary 속성값 변경
Create trigger myTotalSalaryStateLevel
after update of salary on employee
referencing old table as O
referencing new table as N
for each statement
when exists(select * from N where N.dnumber is not null) or
exists(select * from O where O.dnumber is not null)
Update department as D
set D.totalSalary = D.totalSalary
+ (select sum(N.salary) from N where D.dno=N.dnumber)
- (select sum(O.salary) from O where D.dno=O.dnumber)
where D.dno in ((select dnumber from N) union
(select dnumber from O));
2023.10.26
public
: 모든 사용자를 의미<user list>
: 사용자 id 나열, role 사용 가능with grant option
: 권한을 받는 사용자가 부여 받은 권한을 다른 이에게 부여 가능Grant select on professor to U1, U2, U3;
Grant select on professor to U4 with grant option;
Grant references (deptName) on department to Lee;
권한 취소 시 함께 취소되어야하는 권한 있으면 함께 취소
Revoke select on professor from U1, U2, U3 cascade;
취소하려는 권한으로 인해 다른 권한도 취소되어야하면 취소 연산 수행X
본의 아니게 취소하는 권한 방지하는 기능 제공
사용자가 인지하지 못 했던 권한에 대한 취소 방지
Revoke select on professor from U1, U2, U3 restrict;
public
→ 다른 사용자로부터 동일 권한 이미 받은 경우 그 권한까지 취소 XGrant select on professor to U2;
Revoke select on professor from public;
Revoke grant option for select on professor from U5;
Revoke select on professor from U7 cascade;
Revoke select on professor from U7 restricted;
Create view myTeach as
select name, title
from professor, teaches, course
where teaches.pID = professor.pID and course.cID = teaches.cID
and semester = 'Fall' and year = 2015;
user1> Create view CSProfessor as
(select * from professor where deptName = 'CS');
user1> Grant select on CSProfessor to staff;
staff> Select * from CSProfessor
Create role teller;
Create role manager;
Grant select on branch to teller;
Grant update(balance) on account to teller;
Grant all privileges on account to manager;
Grant teller to manager;
Grant teller to Kim, Park;
Grant manager to Lee;
장점 : 애플리케이션에 의해 개별 튜플에 대한 세밀한 권한 부여 가능
단점 : 권한 부여가 애플리케이션 코드 내에서 수행되어야 하며, 애플리케이션 전반에 걸쳐 분산될 수 있다.
→ 권한 확인이 어려워짐. 애플리케이션 코드의 대량을 읽어야해서
2023.10.30
개념만 알고 있으면 되지 않나 싶어요