Chương 2-HQTCSDL

You might also like

Download as docx, pdf, or txt
Download as docx, pdf, or txt
You are on page 1of 14

Chương 2.

1. Ràng buộc toàn vẹn là gì?


Ràng buộc toàn vẹn là điều kiện, quy tắc không thể vi phạm nhằm đảm bảo
tính toàn vẹn của CSDL.
2. Tại sao các quan hệ phải có ràng buộc toàn vẹn?
- Bảo đảm tính kết dính của các thành phần tạo nên CSDL
- Bảo đảm tính nhất quán của dữ liệu
- Bảo đảm CSDL luôn biểu diễn đúng ngữ nghĩa thực tế
3. Khóa chính (primary key) của một quan hệ Q
- Khoá chính của một quan hệ (Primary Key-PK) là một hoặc một
nhómthuộc tính xác định duy nhất một bộ trong quan hệ.
4. Khóa ngoại (foreign key) của một quan hệ Q
- Một hay nhiều thuộc tính (khóa chính hay thuộc tính có ràng buộc unique)
trong một quan hệ A xuất hiện trong một quan hệ B khác được gọi là khóa
ngoại trong quan hệ B.
5. Ràng buộc về miền giá trị của 1 thuộc tính
- Ràng buộc về miền giá trị của 1 thuộc tính là các giá trị trong cột phải nằm
trong miền giá trị của cột.
6. Một thuộc tính có ràng buộc Unique?
- Một thuộc tính có ràng buộc Unique thì mỗi giá trị trong cột có ràng buộc
này phải là duy nhất trong cột đó.
7. Một thuộc tính có ràng buộc not null nghĩa là?
- Các ô trong cột có ràng buộc này bắt buộc phải có giá trị khác null
8. Một thuộc tính có ràng buộc Check (điều kiện) nghĩa là?
- CHECK là ràng buộc miền giá trị, nghĩa là nó chỉ cho phép giá trị của bạn
nhập vào chỉ trong 1 phạm vi nhất định.
9. Câu lệnh khai báo, thêm và xóa các ràng buộc của quan hệ Q.
- Cú pháp thêm ràng buộc khóa chính:
Alter table [tên bảng]
Add constrain [tên khóa chính]
PRIMARY KEY ([Danh sách các thuộc tính của khóa chính])
- Cú pháp thêm ràng buộc khóa ngoại
Alter table [tên bảng]
Add constraint[tên khóa ngoại]
FOREIGN KEY([Danh sách các thuộc tính của khóa ngoại])
REFERENCES[Tên bảng tham chiếu] ([Danh sách các thuộc tính khóa chính
của bảng tham chiếu tới])
- Xóa ràng buộc
Alter table [tên bảng] drop constraint[Tên ràng buộc]
- Thêm ràng buộc miền giá trị
Alter table [tên bảng]
Add constraint [tên ràng buộc miền giá trị]
Check([Biểu thức điều kiện])
10.Cho Q1(A int, B int), Q2(A int, C int). A trong Q2 là khóa ngoại tham chiếu
qua A của Q1. Thao tác nào dưới đây không thực hiện được
(1) Thêm 1 dòng có A = 1 vào Q2, nhưng trong Q1 chưa có dòng nào có A = 1.
(2) Sửa 1 dòng trong Q2 có A = 1 thành A=0, nhưng trong Q1 chưa có dòng nào
có A = 0.
(3) Cả (1) và (2) đều đúng
(4) Cả (1) và (2) đều sai
11.Trigger là gì?
- Trigger là 1 loạt các hành động được liên kết với các sự kiện nhất định và
được thực hiện bất cứ khi nào các sự kiện này phát sinh.
12.Ý nghĩa của biến cố, điều kiện và hành động trong trigger
- Trigger được gọi khi xảy ra 1 số sự kiện nhất định, do người lập trình cơ sở
dữ liệu chỉ định (thường là chèn, xóa hoặc cập nhật).Sau khi được gọi bởi sự
kiện kích hoạt của nó, trình kích hoạt sẽ kiểm tra một điều kiện.Nếu điều kiện
của trình kích hoạt được thỏa mãn, thì hành động được liên kết với trình kích
hoạt sẽ được thực hiện bởi DBMS.
13.Ý nghĩa của For và After trong câu lệnh tạo trigger
- For: ngay lúc biến cố xảy ra thì thực hiện trigger
- After: sau khi biến cố xảy ra mới thực hiện trigger
14.Ý nghĩa của câu lệnh dưới
Create trigger AA on Q after delete as declare @new int, @old int
select @old=ol.B from deleted ol if (@old >2) print ('Notify Customer
Relations');
-> Sau khi người dùng xóa, nếu giá trị ol.B >2 thì sẽ in ra thông báo 'Notify
Customer Relations'
15.Instead of trigger là gì?
- Là 1 loại trigger đặc biệt
- Cho phép bỏ qua câu lệnh như INSERT, UPDATE hay DELETE trên một
table hoặc view.

16.Ý nghĩa của câu lệnh dưới


Create trigger AA on Q after delete as declare @old int select
@old=ol.B from deleted ol if (@old >2) Begin print ('Notify
Customer Relations'); Rollback; end

=> Tạo một trigger tên là AA sau khi người dùng thực hiện một câu lệnh xóa trên
bảng nếu giá trị xóa lớn hơn 2 thì in ra câu 'Notify Customer Relations' và phục hồi
lại bảng ban đầu trước khi xóa Rollback.

17.Cho
Create trigger AA on Q after delete as declare @old int select
@old=ol.B from deleted ol if (@old >2) Begin print ('Notify
Customer Relations'); Rollback; end

Từ khóa “after” trong câu lệnh trên có nghĩa là gì?


=> Sau khi thực thi câu lệnh trigger sẽ được thực hiện và kiểm tra giá trị đã xóa có
lớn hơn 2 không nếu lớn hơn thì in ra dòng Notify Customer Relations và phục hồi
lại dữ liệu cũ bằng ROLLBACK.
18.Cho
Create trigger AA on Q for delete as declare @old int select
@old=ol.B from deleted ol if (@old >2) Begin print ('Notify
Customer Relations');

Từ khóa “for” trong câu lệnh trên có nghĩa là gì?


=> FOR hoặc AFTER chỉ định rằng trình kích hoạt DML chỉ kích hoạt khi tất cả
các hoạt động được chỉ định trong câu lệnh SQL kích hoạt đã khởi chạy thành
công. Tất cả các hành động phân tầng tham chiếu và kiểm tra ràng buộc cũng phải
thành công trước khi trình kích hoạt này kích hoạt.
19.Ý nghĩa của câu lệnh dưới
Create trigger BB on Q1 instead of insert as Declare @newA int, @newB
int Select @newA = n.A, @newB = n.B From Inserted n Insert into Q2
values(@newA, @newB)

=> Tạo một trigger tên BB trên bảng Q1 có tác dụng khi người dùng thực hiện
chèn một dữ liệu vào bảng Q2 thì nó sẽ chèn vào bảng Q1.
20.View là gì?
- View giúp tạo ra các bảng ảo chứa các thông tin, dữ liệu đã được lưu trữ sẵn
cho người dùng sử dụng. Nhưng view không tồn tại như một cấu trúc lưu trữ
dữu liệu trong CSDL.
21.Mục đích của sử dụng view
- Sử dụng View để tập trung trên dữ liệu được xác định.
- Sử dụng View để đơn giản hóa thao tác dữ liệu
- Sử dụng View để tùy biến dữ liệu.
- Sử dụng View để trích xuất dữ liệu tạo báo cáo.
- Sử dụng View để bảo mật dữ liệu, che giấu thông tin.
22.Trong SQL server, cú pháp câu lệnh tạo, xóa, sửa view?
- Cú pháp tạo view:
CREATE VIEW [tên của view] AS
SELECT [tên cột]
FROM [tên bảng]
WHERE [điều kiện];
- Cú pháp xóa view:
DROP VIEW [tên view]
- Cú pháp sửa view:
ALTER VIEW [tên view] AS
SELECT [tên cột]
FROM [tên bảng]
WHERE [điều kiện];
23.Phân loại View?
- Standard View => được tạo bao gồm các cột là các cột của các bảng hoặc các
view khác.
- Indexed View => được tạo và đặt chỉ mục Unique Clustered.
- Partitioned View => được tạo bao gồm các dữ liệu được phân cụm ngang từ
một hoặc nhiều bảng.
24.Ý nghĩa của câu lệnh
Create view cc as Select A, max(B) as ln from Q1 group by A;

=> Tạo view có tên là cc gồm cột A từ bảng Q1 và cột ln chứa giá trị lớn nhất của
cột B trong bảng Q1 khi gộp bởi cột A.
25.Cho PBan(MaPB int, TenPB char(20), MaNQL int). Viết câu lệnh thêm ràng
buộc đảm bảo mỗi phòng ban có 1 người quản lý
ALTER TABLE Pban
ADD CONSTRAINT QL
CHECK(MaNQL = 1)
26. Cho NV(MaNV int, Hoten char(30), Luong int) và câu lệnh alter table Emp
add constraint chk_luong_min check (salary > 10000). Giải thích ý nghĩa của
câu lệnh này.
Sửa cấu trúc bảng NV bằng cách thêm một ràng buộc có tên là chk_luong_min
kiểm tra lương có >10000 hay không.
27.Cho NV(MaNV int, Hoten char(30), Luong int, MaPB int) và view được định
nghĩa như sau Create view V_NV(MaPB, SoNV, TongLg, LgTB) as Select
MaPB, Count(*), Sum(Luong), Avg(Luong) From NV Group by MaPB;
Các câu SQL nào thực hiện được trên view V_NV
(1) Select * From V_NV
(2) Delete from V_NV Where MaPB = 1
(3) Cả (1) và (2) đều đúng
(4) Cả (1) và (2) đều sai

Assignment
Exercise 1. What is a foreign key constraint? Why are such constraints important?
What is referential integrity? (Ràng buộc khóa ngoại là gì? Tại sao các ràng buôc
như vậy là quan trọng? Tính toàn vẹn tham chiếu là gì?)
Ràng buộc khóa ngoại ( ràng buộc tham chiếu ) là quy tắt, quy luật của DBMS về
việc INSERT, DELETE, UPDATE dữ liệu giữa hai bảng có mối quan hệ ràng
buộc khóa ngoại với nhau, để đảm bảo tính đúng đắn của dữ liệu. Các thuộc tính
được tham chiếu của quan hệ thứ hai phải được khai báo DUY NHẤT hoặc KHÓA
CHÍNH cho quan hệ của chúng.
Ràng buộc khóa ngoại trong bảng cơ sở dữ liệu quan trọng là vì giúp ngăn cản
chèn thêm bất kỳ dữ liệu không hợp lệ trong trường khóa ngoại vì trường khóa
ngoại chỉ chấp nhận những giá trị đã có trong trường khóa chính.
Tính toàn vẹn tham chiếu là đảm bảo tính đúng đắn của dữ liệu trong quá trình
insert, delete, update của các bảng có ràng buộc khóa ngoại
Exercise 2. Answer each of the following questions briefly. The questions are
based on the following relational schema:
Emp(eid: integer, ename: string, age: integer, salary: real)
Works(eid: integer, did: integer, pct_time: integer)
Dept(did: integer, dname: string, budget: real, managerid: integer)
1. Give an example of a foreign key constraint that involves the Dept relation. What are the
options for enforcing this constraint when a user attempts to delete a Dept tuple?

Một ví dụ về ràng buộc khóa ngoại liên quan đến bảng Dept có thể là ràng buộc
khóa ngoại managerid trong bảng Dept, tham chiếu đến trường eid trong bảng
Emp, đại diện cho ID của quản lý của mỗi phòng ban. Khi người dùng cố gắng xóa
một bản ghi từ bảng Dept, các tùy chọn để thực hiện ràng buộc này bao gồm:
- Từ chối xóa: Nếu có bản ghi con trong bảng Emp đang tham chiếu đến bản ghi
mục tiêu trong bảng Dept, hệ thống có thể từ chối việc xóa bản ghi đó.
- Xóa các bản ghi con: Nếu có tùy chọn, hệ thống có thể xóa các bản ghi con trong
bảng Emp mà có khóa ngoại tham chiếu đến bản ghi mục tiêu trong bảng Dept
trước khi xóa bản ghi mục tiêu đó.
2. Write the SQL statements required to create the preceding relations,
including appropriate versions of all primary and foreign key integrity
constraints.
CREATE TABLE Emp (
eid INTEGER PRIMARY KEY,
ename VARCHAR(255),
age INTEGER,
salary REAL
);

CREATE TABLE Dept (


did INTEGER PRIMARY KEY,
dname VARCHAR(255),
budget REAL,
managerid INTEGER,
FOREIGN KEY (managerid) REFERENCES Emp(eid)
);

CREATE TABLE Works (


eid INTEGER,
did INTEGER,
pct_time INTEGER,
PRIMARY KEY (eid, did),
FOREIGN KEY (eid) REFERENCES Emp(eid),
FOREIGN KEY (did) REFERENCES Dept(did)
);
3. Define the Dept relation in SQL so that every department is guaranteed to
have a manager.
ALTER TABLE Dept
ADD CONSTRAINT ManagerConstraint
FOREIGN KEY (managerid)
REFERENCES Emp(eid)
ON DELETE RESTRICT;

4. Write an SQL statement to add John Doe as an employee with eid = 101, age
= 32 and salary = 15, 000
INSERT INTO Emp (eid, ename, age, salary)
VALUES (101, 'John Doe', 32, 15000);
5. Write an SQL statement to give every employee a 10 percent raise
UPDATE Emp
SET salary = salary * 1.1;
6. Write an SQL statement to delete the Toy department. Given the referential integrity
constraints you chose for this schema, explain what happens when this statement is
executed.

DELETE FROM Dept


WHERE dname = 'Toy';
Exercise 3. Consider the following relations:

1. List all the foreign key constraints among these relations.


sid : - là khóa chính trong bảng Students, nhưng lại xuất hiện trong bảng Enrolled
đóng vai trò là khóa ngoại kết nối 2 bảng.
fid : - là khóa chính trong bảng Faculty, nhưng lại xuất hiện trong bảng Teaches
đóng vàitrò là khóa ngoại kết nối 2 bảng.
cid : là khóa chính trong bảng Course, nhưng lại xuất hiện trong bảng Teaches và
bảng Enrolled đóng vai trò là khóa ngoại.
rno : là khóa chính trong bảng Rooms, nhưng lại xuất hiện trong bảng Meets_In
đóng vai trò là khóa ngoại kết nối giữa 2 bảng.
2. Give an example of a (plausible) constraint involving one or more of these
relations that is not a primary key or foreign key constraint.
Vd: Không có môn nào vượt quá 10 tín chỉ
3. Create the above database with their constraints.
CREATE DATABASE School;
use School;
CREATE TABLE Students (
sid nvarchar(10) primary key,
name nvarchar(max),
login varchar(50),
age int,
gpa float
);
CREATE TABLE Faculty (
fid nvarchar(10) primary key,
fname nvarchar(max),
sal float
);
CREATE TABLE Courses (
cid nvarchar(10) primary key,
cname nvarchar(50),
credits int,
check(credits < 10)
);
CREATE TABLE Rooms (
rno int primary key,
raddress nvarchar(200),
capacity int
);

CREATE TABLE Enrolled (


studentid nvarchar(10) FOREIGN KEY REFERENCES
Students(studentid),
cid nvarchar(10) FOREIGN KEY REFERENCES Courses(cid),
grade varchar(10)
);
CREATE TABLE Teaches (
fid nvarchar(10) FOREIGN KEY REFERENCES Faculty(fid),
cid nvarchar(10) FOREIGN KEY REFERENCES Courses(cid),
);
CREATE TABLE Meets_In (
cid nvarchar(10) FOREIGN KEY REFERENCES Courses(cid),
rno int FOREIGN KEY REFERENCES Rooms(rno),
time varchar(20)
);
Exercise 4. Consider the following relational schema and briefly answer the questions that
follow:
Emp(eid: integer, ename: string, age: integer, salary: real)
Works(eid: integer, did: integer, pct_time: integer)
Dept(did: integer, budget: real, managerid: integer)
1. Define a constraint on Emp that will ensure that every employee makes at least $10,000.
ALTER TABLE Emp
ADD CONSTRAINT MinSalaryCheck CHECK (salary >= 10000);
2. Define a constraint on Dept (using trigger) that will ensure that all managers have age >
30
CREATE TRIGGER ManagerAgeCheck
ON Dept
AFTER INSERT, UPDATE
AS
BEGIN
UPDATE Dept
SET age = (SELECT MAX(age) FROM Emp WHERE Emp.eid = Dept.managerid)
WHERE Dept.managerid IN (SELECT eid FROM Emp)
AND (SELECT MAX(age) FROM Emp WHERE Emp.eid = Dept.managerid) > 30;
END;
3. Write SQL statements to delete all information about employees whose salaries exceed
that of the manager of one or more departments that they work in. Be sure to ensure that
all the relevant integrity constraints are satisfied after your updates.
DELETE FROM Emp
WHERE salary > (SELECT MAX(salary) FROM Emp e INNER JOIN Works w ON
e.eid = w.eid WHERE w.did = Emp.did);

Exercise 5. Discuss the strengths and weaknesses of the trigger mechanism. Contrast triggers
with other integrity constraints supported by SQL.

Cơ chế trigger trong SQL có những ưu và nhược điểm sau:


Ưu điểm của cơ chế trigger:
- Tính linh hoạt cao: Trigger cho phép thực hiện các hành động tự động khi có sự
thay đổi dữ liệu trong cơ sở dữ liệu, như INSERT, UPDATE hoặc DELETE, mà
không cần sự can thiệp trực tiếp từ người quản trị.
- Kiểm soát logic phức tạp: Trigger cho phép triển khai logic phức tạp và xử lý dữ
liệu phức tạp mà không cần phải thực hiện nhiều truy vấn từ phía ứng dụng.
- Giám sát và kiểm soát dữ liệu: Trigger có thể được sử dụng để kiểm soát và giám
sát dữ liệu trong thời gian thực, đảm bảo tính toàn vẹn dữ liệu và tuân thủ các ràng
buộc.
Nhược điểm của cơ chế trigger:
- Khả năng gây hiệu suất kém: Sử dụng trigger có thể làm giảm hiệu suất của hệ
thống do các hành động tự động được kích hoạt mỗi khi có thay đổi dữ liệu.
- Khó khăn trong quản lý: Khi sử dụng nhiều trigger trong cơ sở dữ liệu, việc quản
lý và hiểu rõ hành vi của hệ thống có thể trở nên phức tạp.
- Rủi ro về bảo mật: Trigger có thể được sử dụng để triển khai các hành động
không mong muốn, và việc kiểm soát quyền truy cập vào trigger là rất quan trọng
để đảm bảo bảo mật.
So sánh trigger với các ràng buộc toàn vẹn khác trong SQL:
- Ràng buộc khóa chính (Primary Key): Đảm bảo tính duy nhất của các giá trị khóa
chính trong một bảng.
- Ràng buộc ngoại (Foreign Key): Đảm bảo tính toàn vẹn của các liên kết giữa các
bảng thông qua các khóa ngoại.
- Ràng buộc CHECK: Kiểm tra ràng buộc cho các giá trị cột để đảm bảo rằng
chúng tuân thủ các điều kiện cụ thể.
- Ràng buộc UNIQUE: Đảm bảo tính duy nhất của các giá trị trong một cột hoặc
nhóm cột cụ thể.
- Ràng buộc DEFAULT: Xác định giá trị mặc định cho một cột khi không có giá
trị nào được cung cấp trong lệnh INSERT.
- Ràng buộc NOT NULL: Đảm bảo rằng một cột không chấp nhận giá trị NULL.
Trong khi các ràng buộc toàn vẹn được thực hiện tại cấp cơ sở dữ liệu, trigger cung
cấp một cơ chế mạnh mẽ cho phép triển khai các logic phức tạp và xử lý dữ liệu tự
động mà không phụ thuộc vào ứng dụng hoặc người sử dụng. Tuy nhiên, cần phải
cân nhắc kỹ lưỡng khi sử dụng trigger để tránh gây ảnh hưởng đến hiệu suất và
tính bảo mật của hệ thống.

Exercise 6. Consider the following relational schema. An employee can work in more than one
department; the pct_time field of the Works relation shows the percentage of time that a given
employee works in a given department.
Emp(eid: integer, ename: string, age: integer, salary: real)
Works(eid: integer, did: integer, pct_time: integer)
Dept(did: integer, budget: real, managerid: integer)
Write integrity constraints (domain, key, foreign key, or CHECK constraints; or triggers to
ensure each of the following requirements, considered independently.
1. Employees must make a minimum salary of $1000.
ALTER TABLE Emp
ADD CONSTRAINT MinSalaryCheck CHECK (salary >= 1000);
2. Every manager must be also be an employee.
ALTER TABLE Dept
ADD CONSTRAINT ManagerEmpFK FOREIGN KEY (managerid) REFERENCES
Emp(eid);
3. The total percentage of all appointments for an employee must be under 100%.
ALTER TABLE Works
ADD CONSTRAINT TotalTimeCheck CHECK (SELECT SUM(pct_time) FROM
Works WHERE eid = Emp.eid) <= 100);
4. A manager must always have a higher salary than any employee that he or she
manages.
CREATE TRIGGER ManagerSalaryCheck
ON Emp
AFTER INSERT, UPDATE
AS
BEGIN
UPDATE Emp
SET salary = (SELECT MAX(salary) FROM Emp e INNER JOIN Works w ON e.eid =
w.eid WHERE w.did = Emp.eid)
WHERE Emp.eid IN (SELECT did FROM Dept);
END;
5. Whenever an employee is given a raise, the manager’s salary must be increased to
be at least as much.
CREATE TRIGGER ManagerSalaryIncrease
ON Emp
AFTER UPDATE
AS
BEGIN
UPDATE Emp
SET salary = (SELECT MAX(salary) FROM Emp e INNER JOIN Works w ON e.eid
= w.eid WHERE w.did = Emp.eid)
WHERE Emp.eid IN (SELECT did FROM Dept)
AND EXISTS (SELECT * FROM inserted WHERE inserted.eid = Emp.eid);
END;
6. Whenever an employee is given a raise, the manager’s salary must be increased
to be at least as much. Further, whenever an employee is given a raise, the department’s
budget must be increased to be greater than the sum of salaries of all employees in the
department.
CREATE TRIGGER BudgetIncrease
ON Emp
AFTER UPDATE
AS
BEGIN
UPDATE Dept
SET budget = (SELECT SUM(salary) FROM Emp WHERE eid IN (SELECT did
FROM Works WHERE did = Dept.did))
WHERE Dept.did IN (SELECT did FROM Works WHERE eid IN (SELECT eid
FROM inserted));
END;

Exercise 7. Briefly answer the following questions based on this schema:


Emp(eid: integer, ename: string, age: integer, salary: real)
Works(eid: integer, did: integer, pct time: integer)
Dept(did: integer, budget: real, managerid: integer)
1. Suppose you have a view SeniorEmp defined as follows:
CREATE VIEW SeniorEmp (sname, sage, salary)
AS SELECT E.ename, E.age, E.salary
FROM Emp E
WHERE E.age > 50
Explain what the system will do to process the following query:
SELECT S.sname
FROM SeniorEmp S
WHERE S.salary > 100,000

Hệ thống sẽ truy cập vào view SeniorEmp và áp dụng điều kiện WHERE để
lọc ra các nhân viên có tuổi lớn hơn 50 và mức lương lớn hơn 100.000 đô la.
Sau đó, hệ thống sẽ trả về các tên của những nhân viên thỏa mãn điều kiện
từ view SeniorEmp.
2. Give an example of a view on Emp that could be automatically updated by updating Emp.
CREATE VIEW HighPaidEmp AS
SELECT eid, ename, age, salary
FROM Emp
WHERE salary > 50000;
3. Give an example of a view on Emp that would be impossible to update (automatically)
and explain why your example presents the update problem that it does.
CREATE VIEW EmpSummary AS
SELECT ename, COUNT(*) AS NumWorks
FROM Emp INNER JOIN Works ON Emp.eid = Works.eid
GROUP BY ename;

You might also like