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:
go
create login Minh with password='MINH'
go
create user Minh for login Minh
go
use QLTV
go
create login Huy with password='HUY'
go
create user Huy for login Huy
go
use QLTV
go
create login Le with password='LE'
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
)
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'
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
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
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
--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
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
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>
<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>
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>
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
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>
<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
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>
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
<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
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
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
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>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:
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,
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)
<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
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
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.
<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
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>
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
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
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>
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)
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'
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
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>
Trường hợp 2a
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
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>
<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,
<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
USE QLSach
BEGIN TRAN
SELECT sum(SLTon)
FROM DanhMucSach
WHERE MaNhom = 'N001'
UPDATE DanhMucSach
SET SLTon = SLTon +1
WHERE MaSach = 'S001'
SELECT sum(SLTon)
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
T1 T2
USE QLSach
BEGIN TRAN
SELECT sum(SLTon)
FROM DanhMucSach
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
<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
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>
T1 T2
SET TRANSACTION ISOLATION LEVEL
SNAPSHOT
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
<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>
<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>
{ 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> 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.
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 B:
INSERT INTO Accounts (AccountID ,balance)
VALUES (303,3000);
COMMIT;
- Client A:
SELECT * FROM Accounts WHERE balance > 1000;
COMMIT;
<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
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);
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
<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
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>
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>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
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
<b>/* Encrypt Data using Key and Certificate</b>
<b>Add Columns which will hold the encrypted data in binary */</b>
<b>USE EncryptTest</b>
<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>
<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>
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