Tải bản đầy đủ (.docx) (49 trang)

ngày 231220 c06auditdatabase191017 c07encryptionxmlsecurity audittrongsqlserver20127161 canxemauditingkiemtoanvagiaitrinh hk201 – bm csdl – cd cntt 20 – cklt bài t

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (327.59 KB, 49 trang )

<span class='text_page_counter'>(1)</span><div class='page_container' data-page=1>

<b>Bài Thực Hành Security</b>
<b>Tuần 1-2-3: Login – User – Roles</b>


<b>PHẦN 1: TRẢ LỜI CÁC CÂU HỎI SAU</b>


1. Cho biết các mục tiêu chính của bảo mật? Các mức bảo mật mà SQL Server hỗ trợ.


2. SQL Server hỗ trợ bao nhiêu chế độ chứng thực? Sự khác biệt? Để thay đối chế độ chứng thực
của một thể hiện SQL Server, bạn phải thực hiện như thế nào?


3. Cho biết logins, users là gì?


4. Cho biết Roles là gì? Có mấy loại, mức độ như thế nào? Liệt kê các Roles mà SQL Server có hỗ
trợ, nếu bạn là thành viên của Roles đó thì bạn có quyền hạn thư thế nào? Cho biết Permissions
là gì?


<b>PHẦN 2: THỰC HÀNH </b>
<b>BÀI 1</b>


1. Tạo cơ sở dữ liệu QLTV tham số tùy ý


2. Tạo các users Minh, Huy, Le, Linh, An, và Binh:
a. Password lần lượt là tên username viết hoa.


b. Đảm bảo các user này có thể tạo bất kỳ bảng nào trong tablespace với quota 10M.
Hướng dẫn:


1. Tạo CSDL QLTV
create database QLTV


2. Tạo các users Minh, Huy, Le, Linh, An, và Binh:


a) Password lần lượt là tên username viết hoa.
use QLTV


go


create login Minh with password='MINH'
go


create user Minh for login Minh
go


use QLTV
go


<b>Mục tiêu: </b>



- Tạo, sửa, xóa được các login


- Tạo, sửa, xóa được các user


- Tạo, sửa, xóa được các roles



</div>
<span class='text_page_counter'>(2)</span><div class='page_container' data-page=2>

create login Huy with password='HUY'
go


create user Huy for login Huy
go


use QLTV
go


create login Le with password='LE'


go


create user Le for login Le
go


use QLTV
go


create login Linh with password='LINH'
go


create user Linh for login Linh
go


use QLTV
go


create login An with password='AN'
go


create user An for login An
go


use QLTV
go


create login Binh with password='BINH'
go


create user Binh for login Binh



b) Đảm bảo các user này có thể tạo bất kỳ bảng nào trong tablespace với quota 10M.
Ví dụ minh họa:


go


CREATE USER Hung


IDENTIFIED BY out_standing1
DEFAULT TABLESPACE example
QUOTA 10M ON example


TEMPORARY TABLESPACE temp
QUOTA 10M ON system


PROFILE app_user
PASSWORD 123456;
3. Cho bảng Sach


</div>
<span class='text_page_counter'>(3)</span><div class='page_container' data-page=3>

)


Tạo bảng Sach
Create table Sach
(


ID INT PRIMARY KEY,
Name NVARCHAR(2)
)


Làm các bước sau:



a. Tạo các role sau: DataEntry, Supervisor, và Management.
go


use QLTV
go


create application role DataEntry;
go


use QLTV
go


create application role Supervisor;
go


use QLTV
go


create application role Management;


b. Gán Minh, Huy, và Linh vào role DataEntry, gán Le vào role Supervisor, và gán An và Binh
vào role Management.


go


EXEC sp_addrolemember 'DataEntry','Minh'
go


EXEC sp_addrolemember 'DataEntry','Huy'


go


EXEC sp_addrolemember 'DataEntry','Lym'
--role Supervisor


go


EXEC sp_addrolemember 'Supervisor','Le'
--role Management


go


EXEC sp_addrolemember 'Management','An'
go


EXEC sp_addrolemember 'Management','Binh'


c. Cho role DataEntry các quyền SELECT, INSERT, và UPDATE trên bảng Sach.
go


</div>
<span class='text_page_counter'>(4)</span><div class='page_container' data-page=4>

grant select,insert,update on Sach to DataEntry


d. Cho role Supervisor các quyền SELECT và DELETE trên bảng Sach.
go


use QLTV
go


grant select,delete on Sach to Supervisor



e. Cho role Management quyền SELECT trên bảng Sach.
go


use QLTV
go


grant select on Sach to Management


f. Lần lượt kiểm tra kết quả phân quyền đã cấp cho các role


--Dang nhap bang user Minh thuc hien lenh select , insert, update cua role DataEntry
go


use QLTV
go


select * from Sach
go


insert into Sach values (1,'df')
go


select * from Sach
go


update Sach
set Name='gg'
where ID = 1
go



select * from Sach


--Dang nhap bang user Le thuc hien lenh select, delete cua role Supervisor
go


use Sach
go


select * from Sach
go


delete from Sach where ID=1
go


select * from Sach


--Dang nhap bang user An thuc hien lenh select cua role Management
go


use QLTV
go


</div>
<span class='text_page_counter'>(5)</span><div class='page_container' data-page=5>

4. Tạo một user mới tên NameManager với password là pc123. Gán quyền update cho user này
trên cột TenSach của bảng Sach.


--tao user
go


use QLTV
go



create login NameManager with password='pc123'
go


create user NameManager for login NameManager
--gan quyen


go


use QLTV
go


grant update on Sach(TenSach) to NameManager
--user chay thu quyen dc cap


go


use QLTV
go


update Sach
set TenSach='TD'
where Masach=1
–Lệnh xem các quyền


SELECT


[UserName] = CASE memberprinc.[type]


WHEN 'S' THEN memberprinc.[name]



WHEN 'U' THEN ulogin.[name] COLLATE Latin1_General_CI_AI
END,


[UserType] = CASE memberprinc.[type]
WHEN 'S' THEN 'SQL User'
WHEN 'U' THEN 'Windows User'
END,


[DatabaseUserName] = memberprinc.[name],
[Role] = roleprinc.[name],


[PermissionType] = perm.[permission_name],
[PermissionState] = perm.[state_desc],


[ObjectType] = obj.type_desc,--perm.[class_desc],
[ObjectName] = OBJECT_NAME(perm.major_id)
FROM


--Role/member associations


</div>
<span class='text_page_counter'>(6)</span><div class='page_container' data-page=6>

--Roles


sys.database_principals roleprinc ON roleprinc.[principal_id] = members.
[role_principal_id]


JOIN


--Role members (database users)



sys.database_principals memberprinc ON memberprinc.[principal_id] = members.
[member_principal_id]


LEFT JOIN


--Login accounts


sys.login_token ulogin on memberprinc.[sid] = ulogin.[sid]
LEFT JOIN


--Permissions


sys.database_permissions perm ON perm.[grantee_principal_id] = roleprinc.[principal_id]
LEFT JOIN


--Table columns


sys.columns col on col.[object_id] = perm.major_id
AND col.[column_id] = perm.[minor_id]
LEFT JOIN


sys.objects obj ON perm.[major_id] = obj.[object_id]
5. Thực hiện các bước sau:


a. Gán password cho role DataEntry ở bài 1 là “mgt”
b. Cho phép user Minh quyền cấp quyền cho các user khác


c. Gán tất cả các quyền mà Minh có cho Binh. Binh có quyền INSERT và UPDATE trên bảng
QLTV khơng?



--a.Gán password cho role DataEntry ở bài 1 là “mgt”
go


use QLTV
go


alter application role DataEntry with password = 'mgt'


--b. Cho phép user Minh quyền cấp quyền cho các user khác
go


use QLTV
go


grant select,insert,update on Sach to Minh with grant option
-- Minh gan quyen cho user #


go


use QLTV
go


grant insert on Sach to An
-- An chay thu quyen dc cap


</div>
<span class='text_page_counter'>(7)</span><div class='page_container' data-page=7>

use QLTV
go


insert into Sach values (1,'df')
go



select * from Sach


--c. Gán tất cả các quyền mà Minh có cho Binh. Binh có quyền INSERT và UPDATE trên
bảng Sach không?


--dang nhap bang user Join
go


use QLTV
go


grant select,insert,update on Sach to Binh
--Binh chay thu quyen dc cap


go


use QLTV
go


select * from Sach
go


insert into Sach values (4,'ff')
go


select * from Sach
go


update Sach


set Tensach='gg'
where Masach= 4
go


select * from Sach


--=> Binh có quyền INSERT và UPDATE trên bảng QLTV
<b>BÀI 2</b>


CSDL mẫu: AdventureWorks2008


Hướng dẫn: Attach file AdventureWorks2008_Data.mdf, AdventureWorks2008_Log.ldf để tạo cơ sở
<b>dữ liệu mẫu AdventureWorks2008</b>


</div>
<span class='text_page_counter'>(8)</span><div class='page_container' data-page=8>

<b>I.</b> <b>Tạo các Roles, Logins, gán các quyền bằng thao tác trong SQL Server Management Studio </b>
<b>(SSMS).</b>


<b>1. Tạo login dạng SQL Server Authentication</b>
a. Tạo một login có tên là tên của bạn, login có:


 Chế độ chứng thực là SQL Server Authentication, password tùy ý, CSDL mặc định là
<b>AdventureWorks2008.</b>


 Không thuộc Server Roles nào cả


<b> Chỉ cho truy xuất đến duy nhất CSDL là AdventureWorks2008 và không thuộc Database</b>
<b>Roles nào cả ngoại trừ Public</b>


 Kiểm tra:



<b>- Ở SSMS, kiểm tra xem tên login của bạn có nằm trong nhánh Security\Login khơng? kiểm</b>
<b>tra xem tên login của bạn có nằm trong nhánh User của CSDL AdventureWorks2008</b>
khơng? Xem properties của nó.


- Kết nối vào SSMS bằng login vừa tạo


- Trong mục database bạn có thể nhìn thấy được những database nào? Tại sao?


<b>- Dùng câu lệnh SELECT … FROM… để xem các mẫu tin trong bảng Production.Product, </b>
bạn xem được không? Tại sao?


<b>b. Hiệu chỉnh login ở trên, cho phép login thuộc database Roles tên là db_DataReader trong </b>
<b>CSDL AdventureWorks2008</b>


 Kiểm tra:


<b>- Dùng câu lệnh SELECT … FROM… để xem các mẫu tin trong bảng Production.Product,</b>
bạn xem được không? Tại sao?


- Dùng câu lệnh INSERT … VALUES để chèn một mẫu tin mới vào bảng
<b>Production.Product, bạn có chèn được khơng? Tại sao? Muốn chèn được bạn phải làm gì?</b>
Thực hiện thử xem sao.


c. Tương tự như vậy, lần lược tìm hiểu các database Roles còn lại.
<b>2. Tạo login dạng Windows Authentication</b>


<b>a. Quay về hệ điều hành tạo một local user account hoặc domain user account được phép kết</b>
<b>nối đến máy Server của SQL Server. User account này có tên là Nhanvien1.</b>


<b>b. Cho phép Nhanvien1 trở thành login của SQL Server, login này chỉ thuộc vào database Roles</b>


<i><b>là db_datareader của CSDL là AdventureWorks2008. (Lưu ý: phải chọn Windows</b></i>
<i>Authentication)</i>


c. Bạn hãy thử kết nối Server thông qua công cụ SSMS bằng login vừa tạo và kiểm tra quyền của
<b>login đối với AdventureWorks2008. </b>


</div>
<span class='text_page_counter'>(9)</span><div class='page_container' data-page=9>

3. Login được tạo ở câu 1 và câu 2 có thể thực hiện tạo được Table, view, … trong CSDL
<b>AdventureWorks2008 hay không? Muốn tạo được cần có điều gì?</b>


<b>4. Tạo một Database Role có tên là NVHoaDon của CSDL AdventureWorks2008, Role này có</b>
quyền hạn như sau:


<b>- Được phép chèn, cập nhật dữ liệu trong hai bảng Purchasing.PurchaseOrderHeader và</b>
<b>Purchasing.PurchaseOrderDetail </b>


<b>- Chỉ được phép xem (Select) trên bảng Purchasing.WorkOrder </b>


<b>5. Tạo 3 login dạng SQL Server Authentication, có tên lần lược là NVHD1, NVHD2, NVHD3. Các</b>
<b>Login này chỉ thuộc duy nhất DataBase Role là NVHoaDon đã tạo ở trên. Đăng nhập vào từng</b>
login NVHD1, NVHD2, NVHD3, ứng với mỗi login thực hiện các công việc sau:


- Xem thông tin các bảng <b> Purchasing.PurchaseOrderHeader</b>


<b>Purchasing.PurchaseOrderDetail, Purchasing.WorkOrder</b>


- Chèn vào các bảng <b> Purchasing.PurchaseOrderHeader</b>


<b>Purchasing.PurchaseOrderDetail, Purchasing.WorkOrder, mỗi bảng 1 record với dữ</b>
liệu tùy ý, chú ý các ràng buộc khóa ngoại



<b>- Xóa một record bất kỳ trong mỗi bảng sau Purchasing.PurchaseOrderHeader</b>
<b>Purchasing.PurchaseOrderDetail, Purchasing.WorkOrder.</b>


<b>- Nếu thực hiện lệnh Update cho 3 bảng Purchasing.PurchaseOrderHeader</b>
<b>Purchasing.PurchaseOrderDetail, Purchasing.WorkOrder có thực hiện được khơng?</b>
<b>Giải thích và cho ví dụ minh họa trong cả 2 trường hợp được hoặc không được. </b>


<b>6. Tạo 3 login dạng SQL Server Authentication, có tên lần lược là QLKho1, QLKho2, QLKho3.</b>
Các login này có cùng một quyền hạn là được phép chèn, xóa dữ liệu trên bảng
<b>Production.Product; cập nhật duy nhất cột ListPrice trong bảng Production.Product. Chỉ được</b>
<b>phép xem (Select) trên bảng Production.WorkOrder. Cho ví dụ kiểm tra các trường hợp đã cấp</b>
quyền cho mỗi login thông qua các lệnh insert, update, delete, select


7. Bạn chọn một giải pháp đơn giản nhất để cho phép các login đã tạo ở trên được phép xem thông tin
<b>trong bảng HumanResources.Employee.</b>


<b>8. Tạo hai login thuộc dạng SQL Server Autehtication, có tên lần lược là PTUD1, PTUD. Các login</b>
này có các quyền như sau:


- Được phép tạo các đối tượng của database


- Được phép truy xuất và hiệu chỉnh các đối tượng database
<b>Ứng với mỗi login thực hiện các lệnh sau:</b>


a) Tạo Table UngDung(MaUD int primary key, TenUD nvarchar(30))
b) Thêm cột TacGia nvarchar(30) vào bảng UngDung


</div>
<span class='text_page_counter'>(10)</span><div class='page_container' data-page=10>

e) Tạo thủ tục cho phép xem thông tin của một ứng dụng bất kỳ
f) Xóa dữ liệu có trong bảng UngDung



g) Chạy thủ tục đã tạo ở câu e
h) Xóa thủ tục câu e


<b>II.</b> <b>Tạo các Roles, Logins, gán các quyền bằng T_SQL thông qua các thủ tục hệ thống. </b>
<b>Chú ý sau mỗi câu bạn thực hiện kiểm tra lại các lệnh bạn vừa thực hiện</b>


<b>1. Tạo một login dạng Windows Authentication có tên là GD1 (vào hệ điều hành Window tạo user</b>
GD1 trước khi tạo ).


<b>2. Tạo hai login dạng SQL Server Authentication tên là PGD1 và PGD2 có password tùy ý.</b>


<b>1. Bạn hãy tạo một user-defined role với tên là QLSP có các quyền sau: thêm, xóa, sửa trên bảng</b>
<b>Production.Product. Tạo 3 user ứng với 3 login trên, thực hiện thêm 3 user là thành viên của role</b>
<b>QLSP.</b>


<b>2. Giả sử bạn muốn cấm 1 cách tường minh quyền thêm, xóa, sửa trên bảng Production.Product đối</b>
<b>với user PGD1, cho dù user này là thành viên của role có các quyền trên (quyền thêm, xóa, sửa trên</b>
<b>bảng Production.Product) thì user này cũng bị cấm. Các user khác không bị ảnh hưởng. Bạn thực</b>
hiện thế nào?


<b>3. Ở câu 4 bạn đã cấm quyền thêm, xóa, sửa trên bảng Production.Product đối với user PGD1. Bạn </b>
<b>muốn khơi phục lại quyền thêm, xóa, sửa trên bảng Production.Product đối với user PGD1. Bạn </b>
thực hiện thế nào?


<b>4. Ở câu 3 bạn đã cấp quyền cho role QLSP: thêm, xóa, sửa trên bảng Production.Product. Bạn</b>
<b>muốn cấm quyền thêm, xóa, sửa trên bảng Production.Product đối với role này. Bạn thực hiện thế</b>
<b>nào? Các user là thành viên của role QLSP có các quyền gì ở lúc này?</b>


<b>5. Tạo hai login dạng SQL Server Authentication có tên là NghiepVu1, NghiepVu2. Tạo 2 user</b>
<b>NghiepVu1, NghiepVu2 ứng với 2 login trên, 2 user này có các quyền sau: xem và hiệu chỉnh cột</b>


ListPrice trong bảng Production.Product ; xem, hiệu chỉnh, xóa dữ liệu trong bảng
Production.WorkOrder và Production.Product, chỉ được phép xem (Select) trên bảng
Purchasing.WorkOrder.


<b>BÀI 3: ỨNG DỤNG VÀO BÀI TOÁN CỤ THỂ</b>
<b>Bài 1</b>


<b>Câu 1: Sử dụng tài khoản với quyền quản trị thực hiện tạo login, user và cấp quyền</b>
1.1 Tạo login tên admin1, mật khẩu Abc12345


1.2 Tạo user thuộc cơ sở dữ liệu master (Databases->System Databases->master)
1.3 Cấp quyền tạo cơ sở dữ liệu, tạo bảng và quyền tạo login cho admin1


</div>
<span class='text_page_counter'>(11)</span><div class='page_container' data-page=11>

File Size MaxSize FileGrowth


Data 100 Không giới hạn 50


Log 300 Không giới hạn 100


<b>2.2 Tạo bảng NhanVien và LuongNV thuộc CSDL QuanLyNhanSu</b>
<b>Bảng NhanVien</b>


Tên cột Kiểu dữ liệu Số kí tự Ghi chú


MaNv Varchar 20 Khóa chính


TenNv Nvarchar 100


NgaySinh Varchar 10



NoiSinh Nvarchar 50


<b>Bảng LuongNV</b>


Tên cột Kiểu dữ liệu Số kí tự Ghi chú


MaNv varchar 20


Khóa chính


NamThang varchar 7


Luong Float


<b>2.3 Tạo login chứng thực SQL Server (SQL Server Authencation)</b>


Tên login Mật khẩu


LyNT Abc12345


HungNT Abc12345


<b>2.4 Tạo user</b>


Tên user Tên login


LyNT LyNT


HungNT HungNT



<b>2.5 Cấp quyền</b>


Tên user Tên bảng Quyền được cấp
LyNT NhanVien, LuongNV Thêm, xóa dữ liệu


HungNT NhanVien


Chỉ được phép xem MaNv,TenNV
và cấp quyền


Cập nhật dữ liệu
<b>2.6. Kiểm tra cấp quyền</b>


<b>Thực hiện các lệnh sau với user LyNT và HungNT</b>


</div>
<span class='text_page_counter'>(12)</span><div class='page_container' data-page=12>

3) Sửa dữ liệu nơi sinh cho nhân viên này thành Hà Nội
4) Xóa nhân viên này khỏi bảng nhân viên


Các lệnh trên có thực hiện được khơng? Lệnh nào khơng thực hiện được giải thích tại sao khơng
thực thi được?


5) Thêm quyền cập nhật dữ liệu cho bảng LuongNV cho user HungNT. Sau đó thực hiện lại các
lệnh trên. Nhận xét.


<b>Bài 2:</b>


<b>Câu 1: Tạo database tên QuanLyDaoTao</b>


<b>File</b> <b>Size</b> <b>MaxSize</b> <b>FileGrowth</b>



Data 100 Không giới hạn 10


Log 300 Không giới hạn 30


<b>Câu 2: Tạo các bảng thuộc CSDL QuanLyDaoTao</b>
<b>Bảng Lop</b>


<b>Tên cột</b> <b>Kiểu dữ liệu</b> <b>Số kí tự</b> <b>Ghi chú</b>


MaLop Varchar 20 Khóa chính


TenLop Nvarchar 100
<b>Bảng SinhVien</b>


<b>Tên cột</b> <b>Kiểu dữ liệu</b> <b>Số kí tự</b> <b>Ghi chú</b>


MaSv Varchar 20 Khóa chính


TenSv Nvarchar 100


NgaySinh Varchar 10
NoiSinh Nvarchar 50


MaLop Varchar 20 Khóa ngoại


<b>Bảng MonHoc</b>


<b>Tên cột</b> <b>Kiểu dữ liệu</b> <b>Số kí tự</b> <b>Ghi chú</b>


MaMh Varchar 20 Khóa chính



TenMh Nvarchar 100
SoGio Int


<b>Bảng DiemTP</b>


<b>Tên cột</b> <b>Kiểu dữ liệu</b> <b>Số kí tự</b> <b>Ghi chú</b>


MaSv Varchar 20


Khóa chính


MaMh Varchar 20


Diem Float


</div>
<span class='text_page_counter'>(13)</span><div class='page_container' data-page=13>

<b>Câu 4: Thêm dữ liệu cho các bảng</b>
Bảng Lop


<b>MaLop</b> <b>TenLop</b>


CN0201 Khóa 2001


CN0202 Khóa 2002


<b>Bảng SinhVien</b>


<b>MaSv</b> <b>TenSv</b> <b>NgaySinh(dd/mm/yyyy)</b> <b>NoiSinh</b> <b>MaLop</b>
sv01



Nguyễn Văn


Hưng 12/02/1988


Hồ Chí


Minh CN0201
sv02 Lê Hùng 17/03/1990


Bình


Dương CN0201
sv03 Lê Hùng 02/12/1991


Bình


Dương CN0202
<b>Bảng MonHoc</b>


<b>MaMh</b> <b>TenMh</b> <b>SoGio</b>


THVP Tin học văn phòng 45


THDC Tin học đại cương 45


CSDL Cơ sở dữ liệu 30


<b>Bảng DiemTP</b>


<b>MaSv</b> <b>MaMh</b> <b>Diem</b>



sv01 THVP 8.0


sv01 THDC 7.0


sv01 CSDL 6.0


sv02 THVP 9.0


sv02 THDC 4.0


sv02 CSDL 7.0


sv03 THVP 5.0


sv03 THDC 5.0


sv03 CSDL 5.0


</div>
<span class='text_page_counter'>(14)</span><div class='page_container' data-page=14>

5.1 Tạo các nhóm quyền thuộc CSDL QuanLyDaoTao tương ứng với các phịng ban như mơ tả trên
5.2 Cấp quyền cho các phịng ban trên CSDL QuanLyDaoTao


1. Ban Giam Hiệu được phép xem tất dữ liệu tất cả các bảng của database
2. Khoa Mạng Truyền Thông được phép xem trên bảng SINHVIEN, LOP


3. Khoa Kỹ thuật phần mềm đươc phép xem, thêm, xóa và cập nhật dữ liệu trên bảng SINHVIEN,
LOP, MONHOC


4. Khoa Tài chính kế tốn chỉ được phép xem dữ liệu trên bảng DiemTP



5. Phịng Đào tạo được phép xem,thêm,xóa và cập nhật dữ liệu trên tất cả các bảng của database
<b>5.3 Tạo danh sách nhân sự cho các phòng ban (Lưu ý tất cả tài khoản phải đổi mật khẩu trong lần</b>
<b>đăng nhập đầu tiên)</b>


<b>Ban Giám Hiệu</b>


<b>Tên</b> <b>Mật khẩu</b>


AnhNH Abc12345


HoangNT Abc12345


<b>Khoa Mạng Truyền Thông</b>


<b>Tên</b> <b>Mật khẩu</b>


TrungDM Abc12345


CongND Abc12345


DangNS Abc12345


<b>Khoa Kỹ thuật phần mềm</b>


<b>Tên</b> <b>Mật khẩu</b>


ThuatDV Abc12345


DatDT Abc12345



NguyenTT Abc12345


</div>
<span class='text_page_counter'>(15)</span><div class='page_container' data-page=15>

Tên Mật khẩu


TuanTV Abc12345


DieuNT Abc12345


GiangNN Abc12345


<b>Phòng Đào tạo</b>


Tên Mật khẩu


TramNTH Abc12345


ThuyLT Abc12345


5.4 Chọn một thành viên đại diện cho mỗi phòng ban, bạn thực hiện các lệnh insert, update, delect,
select cho mỗi table, giải thích từng lệnh mà bạn đã thực hiện được.


<b>Tuần 4-5-6: Transaction</b>


<b>PHẦN 1: BACKUP AND RECOVERY</b>


1. Tạo CSDL Qlsach tham số tùy ý. Tạo các table có cấu trúc sau:
<i><b>NhomSach(MaNhom char(5), TenNhom nvarchar(25))</b></i>


<i><b>NhanVien(MaNV char(5), HoLot nvarchar(25), TenNV nvarchar(10), Phai </b></i>
<i> nvarchar(3), NgaySinh Smalldatetime, DiaChi nvarchar(40))</i>



<i><b>DanhMucSach(MaSach char(5), TenSach nvarchar(40), TacGia nvarchar(20), </b></i>
<i>MaNhom char(5), DonGia Numeric(5), SLTon numeric(5))</i>


<i><b>HoaDon(MaHD char(5), NgayBan SmallDatetime, MaNV char(5))</b></i>
<i><b>ChiTietHoaDon(MaHD char(5), MaSach char(5), SoLuong numeric(5))</b></i>
Nhập dữ liệu cho các table trên


NhomSach


<b>MANHOM</b>

<b>TENNHOM</b>



N001

Kỹ thuật trồng trọt


Sach


<b>MaS</b>

<b>Mục tiêu: </b>

<b>TenSach</b>

- Backup and recovery

<b>TacGia</b>

<b>MaN</b>

<b>DonGi</b>

<b>SlTon</b>


- Index



</div>
<span class='text_page_counter'>(16)</span><div class='page_container' data-page=16>

<b>H</b>

<b>H</b>

<b>a</b>


S111

Đèn khơng



hắt bóng



Dzunichi Watanabe


(Cao Xuân Hạo dịch)



N001

55000

45



S112




Kỹ thuật


trồng hoa


phong lan



Nguyễn Lân Hùng

N001

45000

35



S113



Kỹ thuật


chăm sóc hoa


mai



Lê Xuân A

N007

35000

15



S114



Kỹ thuật


chăm sóc cây


cam



Trần Ha

N001

24000

12



Các Table khác sinh viên tự thêm dữ liệu vào


2. Tạo thiết bị backup có tên QuanLySachBackup lưu trong thư mục
T:\backup\QuanLySachBackup.bak


<b>Viết câu lệnh để set CSDL QLSach về chế độ phục hồi là FULL</b>


3. Thực hiện các backup sau cho CSDL QLSach, tất cả backup đều lưu vào thiết bị backup vừa tạo


<b>a. Thực hiện full backup CSDL QLSach</b>


<b>b. Thực hiện việc insert sau:</b>


insert NhomSach values('N007','Truyen ngan')
insert HoaDon values('11',GETDATE(),'NV001')


Bạn muốn backup CSDL QLSach đến thời điểm đã thay đổi trong câu b ( nghĩa là đã có 2
nhóm sách 'N007' và hóa đơn 11), thay vì thực hiện full backup để backup lại CSDL đến
thời điểm ở câu b, bạn sẽ thực hiện loại backup nào kết hợp với full backup ở câu a để thực
hiện yêu cầu trên mà tiết kiệm được dung lượng đĩa? Bạn hãy thực hiện việc backup mà bạn
chọn lựa.


Xóa CSDL, thực hiện phục hồi lại CSDL QLSach đến thời điểm của câu b
Chú ý xem có mẫu tin vừa insert không


<b>c.</b> Thực hiện việc insert sau:


insert NhomSach values('N008','Phap van')
insert HoaDon values('12',GETDATE(),'NV001')


Giả sử đến thời điểm này bị sự cố ( bạn tự giả lập sự cố này cách cho database offline rồi
xóa datafile), hiện tại bạn chỉ có bản backup của câu a, câu b.


Bạn hãy thực hiện việc phục hồi dữ liệu sao cho không mất dữ liệu nào cả (nghĩa là vẫn có
nhóm sách N008 và hóa đơn 12)


<b>d.</b> Thực hiện việc insert sau:


</div>
<span class='text_page_counter'>(17)</span><div class='page_container' data-page=17>

insert HoaDon values('13',GETDATE(),'NV001')



Tạo 1 transaction log backup
Xóa CSDL QLSach


Thực hiện việc restore CSDL QLSach về thời điểm của câu d


<b>e.</b> Xóa CSDL QLSach và phục hồi dữ liệu về thời điểm insert hóa đơn 11 ở câu b


Câu 2: Thực hiện giống như bài 1, thay vì tạo thiết bị backup QuanLySachBackup, các file backup sẽ
được lưu trực tiếp vào file cụ thể (sv tự đặt tên file).


<b>PHẦN 2: INDEX</b>


<b>Cơ sở dữ liệu mẫu: AdventureWork2008</b>


<b>Trong CSDL mẫu trên đã tạo sẵn các chỉ mục sau cho bảng Production.WorkOrder:</b>
CREATE TABLE [Production].[WorkOrder](


[WorkOrderID] [int] IDENTITY(1,1) NOTNULL,
[ProductID] [int] NOTNULL,


[OrderQty] [int] NOTNULL,


[StockedQty] AS (isnull([OrderQty]-[ScrappedQty],(0))),
[ScrappedQty] [smallint] NOTNULL,


[StartDate] [datetime] NOTNULL,
[EndDate] [datetime] NULL,
[DueDate] [datetime] NOTNULL,
[ScrapReasonID] [smallint] NULL,


[ModifiedDate] [datetime] NOTNULL,


CONSTRAINT [PK_WorkOrder_WorkOrderID] PRIMARY KEY CLUSTERED
([WorkOrderID] ASC)


WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF,
IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON,


ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY];


Trong đó:


 PK_WorkOrder_WorkOrderID (clustered)


</div>
<span class='text_page_counter'>(18)</span><div class='page_container' data-page=18>

<b>Table scan: đọc toàn bộ heap</b>


<b>Index scan: đọc toàn bộ mức lá của chỉ mục clustered hay non-clustered</b> ̣


<b>Index seek: định vị dịng dữ liệu thơng qua b-tree và trả về chỉ các dòng được chọn</b>


1. Vào Management Studio  vào màn hình query:
<b>Chọn CSDL mẫu AdventureWorks2008:</b>


Dùng lệnh:


use AdventureWorks2008


(Hoặc thực hiện bằng thao tác chọn database AdventureWorks2008)



<b>Dùng lệnh để xem các chỉ mục đã tạo trong bảng Production.WorkOrder </b>
sp_helpindex 'Production.WorkOrder'


Thực hiện các câu truy vấn sau:
SELECT *


FROM Production.WorkOrder


Câu truy vấn trên sử dụng các chỉ mục nào và sử dụng thao tác gì ?


Bạn hãy sử dụng Query Optimizer để xem cách xử lý câu truy vấn trên bằng cách
bôi đen câu lệnh trên và nhấn vào biểu tượng Execution Plan


<b>Hoặc bôi đen câu lệnh và click chuột phải, chọn Display Estimated Execution Plan</b>
2. SELECT *


FROM Production.WorkOrder
WHERE WorkOrderID = 1234;


Câu truy vấn trên sử dụng các chỉ mục nào và sử dụng thao tác gì?
Bạn hãy sử dụng Query Optimizer để xem cách xử lý câu truy vấn trên
3. SELECT *


FROM Production.WorkOrder


</div>
<span class='text_page_counter'>(19)</span><div class='page_container' data-page=19>

Câu truy vấn trên sử dụng các chỉ mục nào và sử dụng thao tác gì?
Bạn hãy sử dụng Query Optimizer để xem cách xử lý câu truy vấn trên
4. Giả sử bạn có nhu cầu truy vấn thường xuyên câu lệnh sau:


SELECT *



FROM Production.WorkOrder
WHERE StartDate = '2003-06-25';


Bạn hãy thực hiện việc tạo chỉ mục thích hợp cho câu trên?


Bạn hãy sử dụng Query Optimizer để xem cách xử lý câu truy vấn trên
So sánh với trước khi tạo chỉ mục.


5. Giả sử có nhu cầu truy vấn thường xuyên câu sau:
SELECT WorkOrderID, StartDate


FROM Production.WorkOrder
WHERE ProductID = 757


Để giảm chi phí bookmark lookup, nghĩa là thực hiện việc tìm kiếm trên 1 bảng, khơng cần nhảy
sang 1 bảng khác, bạn hãy xóa 1 chỉ mục có sẵn và tạo lại chỉ mục sao cho thích hợp đối với câu
trên?


Bạn hãy sử dụng Query Optimizer để xem cách xử lý câu truy vấn trên, có nhận xét gì so
với trước khi tạo chỉ mục vừa tạo.


<b>Bạn hãy sử dụng Database Tuning Advisor để xem lời khuyên về việc tạo chỉ mục đối với câu </b>
truy vấn trên.


6. Giả sử có nhu cầu truy vấn thường xuyên câu sau:
SELECT WorkOrderID, StartDate


FROM Production.WorkOrder
WHERE ProductID = 757


AND StartDate = '2002-01-04';


Bạn hãy thực hiện việc tạo chỉ mục thích hợp cho câu trên? Nếu có nhiều giải pháp, hãy đưa ra
nhận xét cho từng giải pháp và lựa chọn giải pháp phù hợp nhất.


</div>
<span class='text_page_counter'>(20)</span><div class='page_container' data-page=20>

<b>Bạn hãy sử dụng Database Tuning Advisor để xem lời khuyên về việc tạo chỉ mục đối với câu </b>
truy vấn trên.


7. Thực hiện lệnh để xem tình trạng phân mảnh chỉ mục của các bảng sau:
a. Production.Product


b. HumanResource.Employee


Nếu có phân mảnh hãy viết lệnh để tổ chức lại chỉ mục.
<b>PHẦN 3: TRANSACTION</b>


Cơ sở dữ liệu mẫu: QLSach


1. So sách mức cô lập READ UNCOMMITTED và READ COMMITTED.
Trường hợp 1


T1 T2


USE QLSach
BEGIN TRAN


SELECT sum(SLTon)
FROM DanhMucSach
WHERE MaNhom = 'N001'
UPDATE DanhMucSach


SET SLTon = SLTon +1
WHERE MaSach = 'S001'
waitfor delay '00:00:15‘


USE QLSach
BEGIN TRAN


SELECT sum(SLTon)
FROM DanhMucSach
WHERE MaNhom = 'N001'
COMMIT TRAN


<i>Nhận xét kết quả ? </i>
<i>Giải thích ?</i>


<i>Các vấn đề :</i>


</div>
<span class='text_page_counter'>(21)</span><div class='page_container' data-page=21></div>
<span class='text_page_counter'>(22)</span><div class='page_container' data-page=22>

Trường hợp 1a


T1 T2


USE QLSach


SELECT sum(SLTon)
FROM DanhMucSach
WHERE MaNhom = 'N001'
UPDATE DanhMucSach
SET SLTon = SLTon +1
WHERE MaSach = 'S001'



waitfor delay '00:00:15‘ USE QLSach


BEGIN TRAN


SELECT sum(SLTon)
FROM DanhMucSach
WHERE MaNhom = 'N001'
COMMIT TRAN


</div>
<span class='text_page_counter'>(23)</span><div class='page_container' data-page=23>

Trường hợp 1b


T1 T2


USE QLSach
BEGIN TRAN


SELECT sum(SLTon)
FROM DanhMucSach
WHERE MaNhom = 'N001'
UPDATE DanhMucSach
SET SLTon = SLTon +1
WHERE MaSach = 'S001'
waitfor delay '00:00:15‘


SET TRANSACTION ISOLATION
LEVEL READ UNCOMMITTED
USE QLSach


BEGIN TRAN



SELECT sum(SLTon)
FROM DanhMucSach
WHERE MaNhom = 'N001'
COMMIT TRAN


</div>
<span class='text_page_counter'>(24)</span><div class='page_container' data-page=24>

Trường hợp 2


T1 T2


USE QLSach
BEGIN TRAN


SELECT sum(SLTon)
FROM DanhMucSach
WHERE MaNhom = 'N001'
UPDATE DanhMucSach
SET SLTon = SLTon +1
WHERE MaSach = 'S001'
waitfor delay '00:00:15‘


SET TRANSACTION ISOLATION
LEVEL READ COMMITTED


USE QLSach
BEGIN TRAN


SELECT sum(SLTon)
FROM DanhMucSach
WHERE MaNhom = 'N001'
COMMIT TRAN



<i>Nhận xét kết quả ? </i>
<i>Giải thích ?</i>


</div>
<span class='text_page_counter'>(25)</span><div class='page_container' data-page=25>

Trường hợp 1a


T1 T2


SET TRANSACTION ISOLATION
LEVEL READ COMMITTED
USE QLSach


BEGIN TRAN


SELECT sum(SLTon)
FROM DanhMucSach
WHERE MaNhom = 'N001'
waitfor delay '00:00:15‘


USE QLSach
BEGIN TRAN


SELECT sum(SLTon)
FROM DanhMucSach
WHERE MaNhom = 'N001'
UPDATE DanhMucSach
SET SLTon = SLTon +1
WHERE MaSach = 'S001'
SELECT sum(SLTon)



</div>
<span class='text_page_counter'>(26)</span><div class='page_container' data-page=26>

Trường hợp 1b


T1 T2


SET TRANSACTION ISOLATION
LEVEL READ COMMITTED
USE QLSach


BEGIN TRAN


SELECT sum(SLTon)
FROM DanhMucSach
WHERE MaNhom = 'N001'
waitfor delay '00:00:15‘


USE QLSach
BEGIN TRAN


SELECT sum(SLTon)
FROM DanhMucSach
WHERE MaNhom = 'N001'
UPDATE DanhMucSach
SET SLTon = SLTon +1
WHERE MaSach = 'S001'
SELECT sum(SLTon)
FROM DanhMucSach
WHERE MaNhom = 'N001'


</div>
<span class='text_page_counter'>(27)</span><div class='page_container' data-page=27>

Trường hợp 2



T1 T2


SET TRANSACTION ISOLATION
LEVEL REPEATABLE READ
USE QLSach


BEGIN TRAN


SELECT sum(SLTon)
FROM DanhMucSach
WHERE MaNhom = 'N001'
waitfor delay '00:00:15‘


USE QLSach
BEGIN TRAN


SELECT sum(SLTon)
FROM DanhMucSach
WHERE MaNhom = 'N001'
UPDATE DanhMucSach
SET SLTon = SLTon +1
WHERE MaSach = 'S001'
SELECT sum(SLTon)
FROM DanhMucSach
WHERE MaNhom = 'N001'


<i>Nhận xét kết quả ? </i>
<i>Giải thích?</i>


3. So sách mức cô lập REPEATABLE READ và SERIALIZABLE. Thử nghiệm xem nếu 1


transaction đang đọc có cho phép một transaction khác thực hiện ghi (insert) trên dữ liệu mà
giao tác đọc đang quan tâm không?


</div>
<span class='text_page_counter'>(28)</span><div class='page_container' data-page=28>

T1 T2
SET TRANSACTION ISOLATION


LEVEL REPEATABLE READ
USE QLSach


BEGIN TRAN


SELECT sum(SLTon)
FROM DanhMucSach
WHERE MaNhom = 'N001'
waitfor delay '00:00:15‘


SELECT sum(SLTon)
FROM DanhMucSach
WHERE MaNhom = 'N001'


USE QLSach
BEGIN TRAN


INSERT DanhMucSach values('S011',N'Hợp
ngữ và LT


Điều kiển thiết bị',N'Nguyễn Minh
Tuấn','N001',25000,20)


<i>Nhận xét kết quả ? </i>


<i>Giải thích ?</i>


Trường hợp 2a


</div>
<span class='text_page_counter'>(29)</span><div class='page_container' data-page=29>

SET TRANSACTION ISOLATION
LEVEL


SERIALIZABLE
USE QLSach
BEGIN TRAN


SELECT sum(SLTon)
FROM DanhMucSach
WHERE MaNhom = 'N001'
waitfor delay '00:00:15‘


USE QLSach
BEGIN TRAN


INSERT DanhMucSach values('S011',N'Hợp
ngữ và LT


<i>Nhận xét kết quả ? </i>
<i>Giải thích ?</i>


Trường hợp 2b


</div>
<span class='text_page_counter'>(30)</span><div class='page_container' data-page=30>

SET TRANSACTION ISOLATION
LEVEL



SERIALIZABLE
USE QLSach
BEGIN TRAN


SELECT sum(SLTon)
FROM DanhMucSach
WHERE MaNhom = 'N001'
waitfor delay '00:00:15‘


USE QLSach
BEGIN TRAN


INSERT DanhMucSach
values('S011',N'Hợp ngữ và


LT Điều kiển thiết bị',N'Nguyễn Minh
Tuấn ,


'N001',25000,20)
<i>Nhận xét kết quả ? </i>


</div>
<span class='text_page_counter'>(31)</span><div class='page_container' data-page=31>

<b>Bài 2:</b>


+ Nội dung kiến thức thực hành:


+Transaction: Chỉ định khoá trực tiếp trong từng lệnh


Thay vì các mức cơ lập read uncommitted, read committed, repeatable read, serializable, trở
lại mức cô lập mặc định, hãy đặt khóa trực tiếp vào các lệnh sao cho có thể giải quyết các
vấn đề trên thay cho mức cô lập read uncommitted, read committed, repeatable read,


serializable.


<b>Bài 3:</b>


+ Nội dung kiến thức thực hành:


+Transaction: mức cô lập Optimistic


<b>Mức cô lập Read Committed ( Snapshot Isolation ) : chỉ thiết lập ở database</b>
Thiết lập mức cơ lập:


ALTER DATABASE <Tên Database>


SET READ_COMMITTED_SNAPSHOT ON
Ví dụ:


ALTER DATABASE QLSach


SET READ_COMMITTED_SNAPSHOT ON


</div>
<span class='text_page_counter'>(32)</span><div class='page_container' data-page=32>

USE QLSach
BEGIN TRAN


SELECT sum(SLTon)
FROM DanhMucSach
WHERE MaNhom = 'N001'
UPDATE DanhMucSach
SET SLTon = SLTon +1
WHERE MaSach = 'S001'
SELECT sum(SLTon)


FROM DanhMucSach
WHERE MaNhom = 'N001'
waitfor delay '00:00:15‘


USE QLSach
BEGIN TRAN


SELECT sum(SLTon)
FROM DanhMucSach
WHERE MaNhom = 'N001'
waitfor delay '00:00:15‘
<b>Nhận xét kết quả ? Giải thích ?</b>


<b>Mức cơ lập Snapshot Isolation (SI): Thiết lập ở 2 nơi: ở database và ở connection</b>
Thiết lập mức cô lập:


ALTER DATABASE <Tên Database>


SET ALLOW_SNAPSHOT_ISOLATION ON
Ví dụ:


ALTER DATABASE QLSach


</div>
<span class='text_page_counter'>(33)</span><div class='page_container' data-page=33>

T1 T2
USE QLSach


BEGIN TRAN


SELECT sum(SLTon)
FROM DanhMucSach


WHERE MaNhom = 'N001'
UPDATE DanhMucSach
SET SLTon = SLTon +1
WHERE MaSach = 'S001'
SELECT sum(SLTon)
FROM DanhMucSach
WHERE MaNhom = 'N001'
waitfor delay '00:00:15‘


COMMIT TRAN


SET TRANSACTION ISOLATION
LEVEL SNAPSHOT


USE QLSach
BEGIN TRAN


SELECT sum(SLTon)
FROM DanhMucSach
WHERE MaNhom = 'N001'
waitfor delay '00:00:15‘


SELECT sum(SLTon)
FROM DanhMucSach


</div>
<span class='text_page_counter'>(34)</span><div class='page_container' data-page=34>

<b>Sự xung đột khi 2 transaction cùng cập nhật ở mức cô lập Snapshot Isolation </b>


T1 T2


SET TRANSACTION ISOLATION LEVEL


SNAPSHOT


BEGIN TRAN
USE QLSach
BEGIN TRAN


SELECT sum(SLTon)
FROM DanhMucSach
WHERE MaNhom = 'N001'
waitfor delay '00:00:10'


UPDATE DanhMucSach
SET SLTon = SLTon +1
WHERE MaSach = 'S001'


USE QLSach
BEGIN TRAN


UPDATE DanhMucSach
SET SLTon = SLTon +1
WHERE MaSach = 'S001'
waitfor delay '00:00:15'


<b>Nhận xét kết quả ? Giải thích ?</b>


</div>
<span class='text_page_counter'>(35)</span><div class='page_container' data-page=35>

T1 T2
SET TRANSACTION ISOLATION LEVEL
SNAPSHOT


BEGIN TRAN


USE QLSach
BEGIN TRAN


SELECT sum(SLTon)


FROM DanhMucSach WITH (UPDLOCK)
WHERE MaNhom = 'N001'


waitfor delay '00:00:10'


UPDATE DanhMucSach
SET SLTon = SLTon +1
WHERE MaSach = 'S001'


USE QLSach
BEGIN TRAN


UPDATE DanhMucSach
SET SLTon = SLTon +1
WHERE MaSach = 'S001'
waitfor delay '00:00:15'


<b>BÀI TẬP LÀM THÊM</b>
<b>SINGLE TRANSACTION</b>


<b>Autocommit mode là chế độ quản lý giao dịch mặc định của SQL Server Database</b>
<b>Engine. Mỗi lệnh Transact-SQL được commit hoặc Rollback khi nó hồn thành.</b>
<b>1) Thêm vào bảng Department một dòng dữ liệu tùy ý bằng câu lệnh</b>


INSERT..VALUES.



1) Thực hiện lệnh chèn thêm vào bảng Department một dịng dữ liệu tùy ý bằng
Giữ khóa cho đến


</div>
<span class='text_page_counter'>(36)</span><div class='page_container' data-page=36>

<b>cách thực hiện lệnh Begin tran và rollback, dùng câu lệnh Select*from</b>
Department xem kết quả.


<b>2) Thực hiện câu lệnh trên với lệnh commit và kiểm tra kết quả.</b>


<b>2) Tắt chế độ autocommit của SQL Server (SET IMPLICIT_TRANSACTIONS</b>
<b>ON). Tạo đoạn batch gồm các thao tác:</b>


Thêm một dòng vào bảng


 <b>Department</b>


Tạo một bảng


 <b>Test (id int, name nvarchar(10))</b>
Thêm một dòng vào


 <b>Test</b>


ROLLBACK;




Xem dữ liệu ở bảng


 <b>Department và Test để kiểm tra dữ liệu, giải thích kết</b>


quả.


<b>Mục tiêu:</b>


<i> Sinh viên hiểu khái niệm về transaction, 4 thuộc tính cơ bản của</i>
<i>transaction, cơ chế hoạt động của transaction</i>


<i> Hiện thực được transaction trong một ngữ cảnh cụ thể</i>


3) Viết đoạn batch thực hiện các thao tác sau (lưu ý thực hiện lệnh SET


XACT_ABORT ON: nếu câu lệnh T-SQL làm phát sinh lỗi run-time, toàn bộ giao
dịch được chấm dứt và Rollback)


Câu lệnh SELECT với phép chia 0 :SELECT 1/0 as Dummy




Cập nhật một dòng trên bảng


 <b>Department với id=’9’ (id này khơng tồn tại)</b>
Xóa một dịng khơng tồn tại trên bảng


 <b>Department (id=’66’)</b>


Thêm một dòng bất kỳ vào bảng


 <b>Department</b>


COMMIT;





Thực thi đoạn batch, quan sát kết quả và các thông báo lỗi và giải thích kết quả.
4) Thực hiện lệnh SET XACT_ABORT OFF (những câu lệnh lỗi sẽ rollback,


transaction vẫn tiếp tục) sau đó thực thi lại các thao tác của đoạn batch ở câu 3. Quan
sát kết quả và giải thích kết quả?


<b>II. CONCURRENT TRANSACTIONS</b>


<b>1) Tạo bảng Accounts (AccountID int NOT NULL PRIMARY KEY,</b>
balance int NOT NULL


CONSTRAINT unloanable_account CHECK (balance >= 0)
Chèn dữ liệu:


INSERT INTO Accounts (acctID,balance) VALUES (101,1000);
INSERT INTO Accounts (acctID,balance) VALUES (202,2000);
<b>2) SET TRANSACTION ISOLATION LEVEL</b>


</div>
<span class='text_page_counter'>(37)</span><div class='page_container' data-page=37>

{ READ UNCOMMITTED
| READ COMMITTED
| REPEATABLE READ
| SNAPSHOT


| SERIALIZABLE
}[ ; ]


<b> READ UNCOMMITTED: có thể đọc những dịng đang được hiệu chỉnh</b>


bởi các transaction khác nhưng chưa commit


<b> READ COMMITTED: không thể đọc những dòng đang hiệu chỉnh bởi</b>
những transaction khác mà chưa commit


3) Mở 2 cửa sổ Query của SQL server, thiết lập SET TRANSACTION ISOLATION
<b>LEVEL READ COMMITTED ở cả 2 cửa sổ (tạm gọi là clients A bên trái, và</b>
client B bên phải).


<b> Client A, client B: cùng thực hiện lệnh SELECT trên bảng Accounts với</b>
<b>AccountID =101</b>


<b> Clients A cập nhật account trên AccountID =101, balance =1000-200</b>
<b> Client B cập nhật account trên AccountID =101, balance =1000-500</b>
<b> Client A: SELECT trên Accounts với AccountID =101; COMMIT;</b>
<b> Client B: SELECT trên Accounts với AccountID =101; COMMIT;</b>
Quan sát kết quả hiển thị và giải thích.


4) Thiết lập ISOLATION LEVEL REPEATABLE READ (khơng thể đọc được dữ
<i>liệu đã được hiệu chỉnh nhưng chưa commit bởi các transaction khác và khơng có</i>
<i>transaction khác có thể hiệu chỉnh dữ liệu đã được đọc bởi các giao dịch hiện tại</i>
<i>cho đến transaction hiện tại hoàn thành) ở 2 client. Thực hiện yêu cầu sau:</i>
<b> Client A, client B: cùng thực hiện lệnh SELECT trên bảng Accounts với</b>
<b>AccountID =101</b>


<b> Clients A cập nhật accounts trên AccountID =101, balance =1000-200</b>
<b> Client B cập nhật accounts trên AccountID =101, balance =1000-500.</b>
<b> Client A: SELECT trên Accounts với AccountID =101; COMMIT;</b>
Quan sát kết quả hiển thị và giải thích.





5) Giả sử có 2 giao dịch chuyển tiền từ tài khoản 101 và 202 như sau:
Client A chuyển 100$ từ tài khoản 101 sang 202




Client B chuyển 200$ từ tài khoản 202 sang 101.




</div>
<span class='text_page_counter'>(38)</span><div class='page_container' data-page=38>

INSERT INTO Accounts (AccountID ,balance) VALUES (202,2000);
<b> Client A: cập nhật balance của account giảm đi 100 cho AccountID =101,</b>
<b>cập nhật balance của account tăng lên 100 cho AccountID =202</b>


<b> Client B: thiết lập ISOLATION LEVEL READ UNCOMMITTED</b>
SELECT * FROM Accounts;


COMMIT;
<b> Client A:</b>
ROLLBACK;


SELECT * FROM Accounts;
COMMIT;


Quan sát kết quả và giải thích.


<b>7) Xóa tất cả dữ liệu của bảng Account, thêm lại các dòng mới</b>
INSERT INTO Accounts (AccountID ,balance) VALUES (101,1000);
INSERT INTO Accounts (AccountID ,balance) VALUES (202,2000);


- Client A: thiết lập ISOLATION LEVEL REPEATABLE READ;
Lấy ra các Accounts có Balance>1000


- Client B:


INSERT INTO Accounts (AccountID ,balance)
VALUES (303,3000);


COMMIT;
- Client A:


SELECT * FROM Accounts WHERE balance > 1000;
COMMIT;


</div>
<span class='text_page_counter'>(39)</span><div class='page_container' data-page=39>

<b>Tuần 7-8: Audting</b>


Bài tập 1 :


Tạo giám sát sự đăng nhập thông qua window application log
1. Tạo Audit server (lưu file trong application)


CREATE SERVER AUDIT KiemTraDoiTuong


TO FILE(FILEPATH='T:\BMCSDL\AUdit\AuditFile') /* substitute in here
network drive */


WITH (ON_FAILURE=FAIL_OPERATION, QUEUE_DELAY=0);
2. Bật lên (Enable) Audit Server


ALTER SERVER AUDIT KiemTraDoiTuong WITH (STATE=ON);



3. Tạo Server Specificatetionc


CREATE SERVER AUDIT SPECIFICATION ThucThiKiemTraDoiTuong
FOR SERVER AUDIT KiemTraDoiTuong


add (AUDIT_CHANGE_GROUP)
4. Bật lên Server Specificatetion


ALTER SERVER AUDIT SPECIFICATION ThucThiKiemTraDoiTuong
WITH (STATE=ON);


5. Thay đổi đường dẫn


ALTER SERVER AUDIT KiemTraDoiTuong WITH (STATE=OFF);
ALTER SERVER AUDIT KiemTraDoiTuong TO


FILE(FILEPATH='D:\Audit');


ALTER SERVER AUDIT KiemTraDoiTuong WITH (STATE=ON);


6. Test


drop server audit Giam_Sat_Tong //thử xóa hay tạo audit thì sẽ ghi lại

<b>Mục tiêu: </b>



</div>
<span class='text_page_counter'>(40)</span><div class='page_container' data-page=40>

7. Truy cập file


SELECT * FROM sys.server_file_audits



SELECT * FROM sys.fn_get_audit_file('D:\Audit\*',NULL,NULL);
SELECT * FROM sys.dm_server_audit_status


Hình của ví dụ 1
Bài tập 2 :


Tạo giám sát về sự thay đổi dữ liệu trong một bảng nào đó (lưu trong file và đọc từ
file ra )


1. Tạo audit sever


CREATE SERVER AUDIT KiemTraTao_Them


TO FILE(FILEPATH='D:\Audit1') /* substitute in here network drive */
WITH (ON_FAILURE=FAIL_OPERATION, QUEUE_DELAY=0);


2. Enable


ALTER SERVER AUDIT KiemTraTao_Them WITH (STATE=ON);


</div>
<span class='text_page_counter'>(41)</span><div class='page_container' data-page=41>

CREATE DATABASE AUDIT SPECIFICATION KiemTraTao_Them
FOR SERVER AUDIT KiemTraTao_Them


ADD (SELECT , INSERTON [dbo].[NguoiLaoDong] BY dbo )
WITH (STATE = ON) ;


GO
4. Test thử


select * from NguoiLaoDong



Insert into NguoiLaoDong(maNLD,hoTen) values ('NLD5000','Hoai-Yen')
Insert into NguoiLaoDong(maNLD,hoTen) values ('NLD6000','Hoai-Yen sua
cua user')


5. Đọc file


SELECT * FROM sys.dm_server_audit_status


</div>
<span class='text_page_counter'>(42)</span><div class='page_container' data-page=42></div>
<span class='text_page_counter'>(43)</span><div class='page_container' data-page=43>

<b>Tuần 9-10: Mã hóa và giải mã</b>


<b>BÀI 1: Encryption</b>
USE master


GO


CREATE DATABASE EncryptTest
go


USE EncryptTest
GO


CREATE TABLE TestTable (FirstCol INT, SecondCol VARBINARY(256))
go


/* Create Database Master Key */


CREATE MASTER KEY ENCRYPTION
BY PASSWORD = 'SQLAuthority'



GO


/* Create Encryption Certificate */


CREATE CERTIFICATE EncryptTestCert
WITH SUBJECT = 'SQLAuthority'


GO


/* Create Symmetric Key */


CREATE SYMMETRIC KEY TestTableKey


WITH ALGORITHM = TRIPLE_DES ENCRYPTION
BY CERTIFICATE EncryptTestCert


GO


<b>Mục tiêu: </b>



</div>
<span class='text_page_counter'>(44)</span><div class='page_container' data-page=44>

OPEN SYMMETRIC KEY TestTableKey DECRYPTION BY CERTIFICATE
EncryptTestCert


GO


--UPDATE TestTable


--SET EncryptSecondCol = ENCRYPTBYKEY(KEY_GUID('TestTableKey'),SecondCol)
--GO



INSERT INTO TestTable


values(1,ENCRYPTBYKEY(KEY_GUID('TestTableKey'),'Hello'))
INSERT INTO TestTable


values(2,ENCRYPTBYKEY(KEY_GUID('TestTableKey'),'123456'))
INSERT INTO TestTable


values(3,ENCRYPTBYKEY(KEY_GUID('TestTableKey'),'gogogo'))
go


SELECT * FROM TestTable
GO


/* Decrypt the data of the SecondCol */


OPEN SYMMETRIC KEY TestTableKey DECRYPTION BY CERTIFICATE
EncryptTestCert


SELECT CONVERT(VARCHAR(50),DECRYPTBYKEY(SecondCol)) AS
DecryptSecondCol


FROM TestTable
GO


CLOSE SYMMETRIC KEY TestTableKey
GO


<b>BÀI 2</b>



<b>/* Create Database */</b>
<b>USE master</b>


<b>GO</b>


<b>CREATE DATABASE EncryptTest</b>


</div>
<span class='text_page_counter'>(45)</span><div class='page_container' data-page=45>

First, let’s create a sample table and then populate it with sample data. We will now encrypt
one of the two columns of the table.


<b>/* Create table and insert data in the table */</b>
<b>USE EncryptTest</b>


<b>GO</b>


<b>CREATE TABLE TestTable (FirstCol INT, SecondCol VARCHAR(50))</b>
<b>GO</b>


<b>INSERT INTO TestTable (FirstCol, SecondCol)</b>
<b>SELECT 1,'First'</b>


<b>UNION ALL</b>


<b>SELECT 2,'Second'</b>
<b>UNION ALL</b>


<b>SELECT 3,'Third'</b>
<b>UNION ALL</b>


<b>SELECT 4,'Fourth'</b>


<b>UNION ALL</b>


<b>SELECT 5,'Fifth'</b>
<b>GO</b>


<b>/* Check the content of the TestTable */</b>
<b>USE EncryptTest</b>


<b>GO</b>


<b>SELECT *</b>


<b>FROM TestTable</b>
<b>GO</b>


The preceding code will return the result depicted in the subsequent figure.


Result of the SQL query


</div>
<span class='text_page_counter'>(46)</span><div class='page_container' data-page=46>

Triple DES algorithm together with user-provided password to encrypt the keys.
<b>/* Create Database Master Key */</b>


<b>USE EncryptTest</b>
<b>GO</b>


<b>CREATE MASTER KEY ENCRYPTION</b>
<b>BY PASSWORD = 'SQLAuthority'</b>


<b>GO</b>



Certificates are used to safeguard encryption keys, which are used to encrypt data in the
database. SQL Server 2005 has the capability to generate self-signed X.509 certificates.
<b>/* Create Encryption Certificate */</b>


<b>USE EncryptTest</b>
<b>GO</b>


<b>CREATE CERTIFICATE EncryptTestCert</b>
<b>WITH SUBJECT = 'SQLAuthority'</b>


<b>GO</b>


The symmetric key can be encrypted by using various options such as certificate, password,
symmetric key, and asymmetric key. A number of different algorithms can be employed for
encrypting key. The supported algorithms are DES, TRIPLE_DES, RC2, RC4, RC4_128,
DESX, AES_128, AES_192, and AES_256.


<b>/* Create Symmetric Key */</b>
<b>USE EncryptTest</b>


<b>GO</b>


<b>CREATE SYMMETRIC KEY TestTableKey</b>


<b>WITH ALGORITHM = TRIPLE_DES ENCRYPTION</b>
<b>BY CERTIFICATE EncryptTestCert</b>


<b>GO</b>


Now add a column of type varbinary to the original table, which will store the encrypted


value for the SecondCol.


<b>/* Encrypt Data using Key and Certificate</b>


<b>Add Columns which will hold the encrypted data in binary */</b>
<b>USE EncryptTest</b>


</div>
<span class='text_page_counter'>(47)</span><div class='page_container' data-page=47>

<b>ALTER TABLE TestTable</b>


<b>ADD EncryptSecondCol VARBINARY(256)</b>
<b>GO</b>


Before the key is used, it needs to be decrypted using the same method that was used for
encrypting it. In our example, we have used a certificate for encrypting the key. Because of
the same reason, we are using the same certificate for opening the key and making it


available for use. Subsequent to opening it and making it available for use, we can use the
encryptkey function and store the encrypted values in the database, in the


EncryptSecondCol column.


<b>/* Update binary column with encrypted data created by certificate and key */</b>
<b>USE EncryptTest</b>


<b>GO</b>


<b>OPEN SYMMETRIC KEY TestTableKey DECRYPTION</b>
<b>BY CERTIFICATE EncryptTestCert</b>


<b>UPDATE TestTable</b>



<b>SET EncryptSecondCol =ENCRYPTBYKEY(KEY_GUID('TestTableKey'),SecondCo</b>
<b>l)</b>


<b>GO</b>


We can drop the original SecondCol column, which we have now encrypted in the
EncryptSecondCol column. If you do not want to drop the column, you can keep it for
future comparison of the data when we decrypt the column.


<b>/* DROP original column which was encrypted for protect the data */</b>
<b>USE EncryptTest</b>


<b>GO</b>


<b>ALTER TABLE TestTable</b>
<b>DROP COLUMN SecondCol</b>
<b>GO</b>


We can run a SELECT query on our database and verify if our data in the table is well
protected and hackers will not be able to make use of it even if they somehow manage to
reach the data.


<b>/* Check the content of the TestTable */</b>
<b>USE EncryptTest</b>


</div>
<span class='text_page_counter'>(48)</span><div class='page_container' data-page=48>

<b>SELECT *</b>


<b>FROM TestTable</b>
<b>GO</b>



Result of the previous SQL query


Authorized user can use the decryptbykey function to retrieve the original data from the
encrypted column. If Symmetric key is not open for decryption, it has to be decrypted using
the same certificate that was used to encrypt it. An important point to bear in mind here is
that the original column and the decrypted column should have the same data types. If their
data types differ, incorrect values could be reproduced. In our case, we have used a


VARCHAR data type for SecondCol and EncryptSecondCol.
<b>/* Decrypt the data of the SecondCol */</b>


<b>USE EncryptTest</b>
<b>GO</b>


<b>OPEN SYMMETRIC KEY TestTableKey DECRYPTION</b>
<b>BY CERTIFICATE EncryptTestCert</b>


<b>SELECT CONVERT(VARCHAR(50),DECRYPTBYKEY(EncryptSecondCol)) ASDe</b>
<b>cryptSecondCol</b>


<b>FROM TestTable</b>
<b>GO</b>


</div>
<span class='text_page_counter'>(49)</span><div class='page_container' data-page=49>

certificates are used only once or their use is over, they can be dropped as well. Dropping a
database will drop everything it contains – table, keys, certificates, all the data, to name a
few.


<b>/* Clean up database */</b>
<b>USE EncryptTest</b>



<b>GO</b>


<b>CLOSE SYMMETRIC KEY TestTableKey</b>
<b>GO</b>


<b>DROP SYMMETRIC KEY TestTableKey</b>
<b>GO</b>


<b>DROP CERTIFICATE EncryptTestCert</b>
<b>GO</b>


<b>DROP MASTER KEY</b>
<b>GO</b>


<b>USE [master]</b>
<b>GO</b>


<b>DROP DATABASE [EncryptTest]</b>
<b>GO</b>


<b>Summary</b>


Encryption is a very important security feature of SQL Server 2005. Long keys and


</div>

<!--links-->

×