You are on page 1of 7

Tài liệu ôn thi

Cho một phần lược đồ CSDL quan hệ quản lý đề án trong công ty gồm:
NHANVIEN(MANV, HOTEN, NGSINH, DCHI, DT)
Mô tả: Mỗi nhân viên phải có mã số (MANV) duy nhất để phân biệt với các nhân
viên khác, có họ tên
(HOTEN), ngày sinh (NGSINH), địa chỉ (DCHI) và điện thoại(DT).
DEAN(MADA, TENDA, DIADIEMDA)
Mô tả: Mỗi đề án có mã số (MADA) duy nhất để phân biệt với các đề án khác, có
tên đề án (TENDA) và
có địa điểm để thực hiện đề án (DIADIEMDA).
PHANCONG(MANV, MADA, SOBUOILV)
Mô tả: Để thực hiện đề án thì phải phân công cho từng nhân viên (MANV) làm đề
án (MADA) nào và có
số buổi làm việc (SOBUOILV) cho đề án đó.
Sinh viên thực hiện các yêu cầu sau:
Câu 1: (2.5 điểm) Thêm vào bảng NHANVIEN (Nhân viên) một cột: Số đề án đã thực
hiện (SODATH).
Viết 1 Stored Procedure có sử dụng cơ chế Cursor để cập nhật vào cột số đề án đã
thực hiện (SODATH)
với tổng số đề án mà mỗi nhân viên đã được phân công làm.
Câu 2: (2.5 điểm) Viết 1 Function với 1 tham số truyền vào là mã nhân viên (MANV),
trả về là Tổng số
đề án mà nhân viên này đã được phân công làm.
Câu 3: (2.5 điểm) Viết 1 Stored Procedure với các tham số truyền vào: mã nhân viên
(MANV), mã đề án
(MADA), số buổi làm việc (SOBUOILV). Trước khi chèn (Insert) dữ liệu vào
bảng PHANCONG phải
kiểm tra MANV có trong bảng nhân viên chưa? Phải kiểm tra MADA có trong
bảng đề án chưa? Kiểm
tra dữ liệu trùng? Nếu sai thì thông báo lỗi, ngược lại cho chèn dữ liệu.
Câu 4: (2.5 điểm) Viết 1 Trigger kiểm tra khi chèn dữ liệu vào bảng NHANVIEN thì cần
phải kiểm tra
tuổi của nhân viên, những nhân viên có tuổi từ 25 đến 50 tuổi mới được chèn,
ngược lại không cho chèn
dữ liệu và thông báo lỗi.
/*Câu 1: (2.5 điểm) Thêm vào bảng NHANVIEN (Nhân viên) một cột: Số đề án đã thực hiện
(SODATH).
Viết 1 Stored Procedure có sử dụng cơ chế Cursor để cập nhật vào cột số đề án đã thực hiện
(SODATH) với tổng số đề án mà mỗi nhân viên đã được phân công làm.*/
ALTER TABLE NHANVIEN ADD SODATH INT
GO
CREATE PROC SP_CAU1
AS
BEGIN

DECLARE TEO CURSOR FOR SELECT MANV,COUNT(MADT) ASSODATH


FROM PHANCONG
GROUP BY MANV
OPEN TEO

DECLARE @MANV INT,


@SODATH INT

FETCH NEXT FROM TEO INTO @MANV, @SODATH


WHILE @@FETCH_STATUS=0
BEGIN
UPDATE NHANVIEN --cập nhật vào cột số đề án đã thực hiện
(SODATH)
SET @SODATH = SODATH
WHERE MANV = @MANV --mỗi nhân viên đã được phân công
làm
FETCH NEXT FROM TEO INTO @MANV, @SODATH
END
CLOSE TEO
DEALLOCATE TEO
END

/*Câu 2: (2.5 điểm) Viết 1 Function với 1 tham số truyền vào là mã nhân viên (MANV), trả về là
Tổng số đề án mà nhân viên này đã được phân công làm*/
CREATE FUNCTION F_CAU2
(
@MANV INT --truyền vào là mã nhân viên (MANV)
)
RETURNS INT
AS
BEGIN
DECLARE @TONGSODA INT
SELECT @TONGSODA=COUNT(MADA)
FROM PHANCONG
WHERE MANV=@MANV
GROUP BY MANV
RETURN @TONGSODA
END
/*Câu 3: (2.5 điểm) Viết 1 Stored Procedure với các tham số truyền vào: mã nhân viên (MANV),
mã đề án
(MADA), số buổi làm việc (SOBUOILV). Trước khi chèn (Insert) dữ liệu vào bảng
PHANCONG phải
kiểm tra MANV có trong bảng nhân viên chưa? Phải kiểm tra MADA có trong bảng đề án chưa?
Kiểm
tra dữ liệu trùng? Nếu sai thì thông báo lỗi, ngược lại cho chèn dữ liệu.*/
CREATE PROC SP_CAU3
(
@MANV INT,
@MADA INT,
@SOBUOILVINT
)
AS
BEGIN
IF NOT EXISTS(SELECT MANV FROM NHANVIEN WHERE MANV = @MANV )
--dữ liệu vào bảng PHANCONG phải kiểm tra MANV có trong bảng nhân viên chưa?
PRINT N'MA NHAN VIEN:' + CAST (@MANV AS VARCHAR(2)) + N'KHONG CO
TRONG BANG NHAN VIEN'
ELSE

IF NOT EXISTS(SELECT MADA FROM DEAN WHERE MADA=@MADA) --kiểm


tra MADA có trong bảng đề án chưa?
PRINT N'MA DE AN:' + CAST (@MADA AS VARCHAR(2)) + N'KHONG CO
TRONG BANG DE AN'

IF NOT EXISTS(SELECT * FROM PHANCONG WHERE MANV = @MANV) --


Kiểm tra dữ liệu trùng? Nếu sai thì thông báo lỗi, ngược lại cho chèn dữ liệu.
PRINT N'MA NHAN VIEN VA MA DE AN NAY DA CO ROI BAN OI'
ELSE
BEGIN
INSERT INTO PHANCONG(MANV, MADA, SOBUOILV) --chèn
(Insert) dữ liệu vào bảng PHANCONG
VALUES (@MANV, @MADA, @SOBUOILV)
PRINT N'BAN DA THEM DU LIEU THANH CONG.CHUT MUNG
BAN QUA MON'
END

END

/*Câu 4: (2.5 điểm) Viết 1 Trigger kiểm tra khi chèn dữ liệu vào bảng NHANVIEN thì cần phải
kiểm tra
tuổi của nhân viên, những nhân viên có tuổi từ 25 đến 50 tuổi mới được chèn, ngược lại không
cho chèn
dữ liệu và thông báo lỗi.*/
CREATE TRIGGER T_CAU4
ON NHANVIEN
FOR INSERT, UPDATE
AS
BEGIN
DECLARE @TUOI INT
SELECT @TUOI =YEAR(GETDATE())-YEAR(NGAYSINH)
FROM inserted
IF @TUOI>50 OR @TUOI<25 --những nhân viên có tuổi từ 25 đến 50 tuổi mới
được chèn, ngược lại không cho chèn dữ liệu và thông báo lỗi
BEGIN
PRINT N'BAN NHAP SAI NGAY SINH CUA NHAN VIEN TU
25 DEN 50'
ROLLBACK TRANSACTION
END
ELSE
BEGIN
PRINT N'BAN DA INSERT/UPDATE NGAY SINH CUA
NHAN VIEN TU 25 DEN 50 THANH CONG'
COMMIT TRANSACTION
END

END

Cú pháp các dạng:

Function:

Type 1: Nếu muốn UDFs trả về một kết quả (số, chuỗi, date,…) thì ta sử dụng UDFs dạng 1

A.Scalar Functions – Type 1


CREATE FUNCTION [ owner_name. ] function_name
( [ { @parameter_name [AS] scalar_parameter_data_type [ = default ] } [ ,...n ] ] )
RETURNS scalar_return_data_type
[ WITH < function_option> [ [,] ...n] ]
[ AS ]
BEGIN
function_body
RETURN scalar_expression
END
Type 2: Nếu muốn UDFs trả về tập kết quả dạng bảng thì ta sử dụng UDFs dạng 2.

B.Inline Table-valued Functions – Type 2


CREATE FUNCTION [ owner_name. ] function_name
( [ { @parameter_name [AS] scalar_parameter_data_type [ = default ] } [ ,...n ] ] )
RETURNS TABLE
[ WITH < function_option > [ [,] ...n ] ]
[ AS ]
RETURN [ ( ] select-stmt [ ) ]

Type 3: Nếu muốn UDFs trả về tập kết quả dạng bảng tạm thì ta sử dụng UDFs dạng 3.

C.Multi-statement Table-valued Functions – Type 3


CREATE FUNCTION [ owner_name. ] function_name
( [ { @parameter_name [AS] scalar_parameter_data_type [ = default ] } [ ,...n ] ] )
RETURNS @return_variable TABLE < table_type_definition >
[ WITH < function_option > [ [,] ...n ] ]
[ AS ]
BEGIN
function_body
RETURN
END
< function_option > ::=
{ ENCRYPTION | SCHEMABINDING }
< table_type_definition > :: =
( { column_definition | table_constraint } [ ,...n ] )

View:

CREATE VIEW [ < database_name > . ] [ < owner > . ] view_name [ ( column [ ,...n ] ) ]
[ WITH < view_attribute > [ ,...n ] ]
AS
select_statement
[ WITH CHECK OPTION ]
< view_attribute > ::=
{ ENCRYPTION | SCHEMABINDING | VIEW_METADATA }

Cursor:

DECLARE cursor_name CURSOR


[ LOCAL | GLOBAL ] [ FORWARD_ONLY | SCROLL ]
[ STATIC | KEYSET | DYNAMIC | FAST_FORWARD ]
[ READ_ONLY | SCROLL_LOCKS | OPTIMISTIC ]
[ TYPE_WARNING ]
FOR select_statement
[ FOR UPDATE [ OF column_name [ ,...n ] ] ]
OPEN { { [ GLOBAL ] cursor_name } | cursor_variable_name }
FETCH [ [ NEXT | PRIOR | FIRST | LAST
| ABSOLUTE { n | @nvar }
| RELATIVE { n | @nvar }
] FROM
]
{ { [ GLOBAL ] cursor_name } | @cursor_variable_name }
[ INTO @variable_name [ ,...n ] ]
WHILE @@FETCH_STATUS
Return value
Description
0
FETCH statement was successful.
-1
FETCH statement failed or the row was beyond the result set.
-2
Row fetched is missing.
BEGIN <SQL Query>
FETCH
[ [ NEXT | PRIOR | FIRST | LAST
| ABSOLUTE { n | @nvar }
| RELATIVE { n | @nvar } ]
FROM
]
{ { [ GLOBAL ] cursor_name } | @cursor_variable_name }
[ INTO @variable_name [ ,...n ] ]
END
CLOSE cursor_name
DEALLOCATE cursor_name

STORED PROCEDURE:

CREATE PROC [ EDURE ] procedure_name [ ; number ]


[ { @parameter data_type }
[ VARYING ] [ = default ] [ OUTPUT ]
] [ ,...n ]
[ WITH
{ RECOMPILE | ENCRYPTION | RECOMPILE , ENCRYPTION } ]
[ FOR REPLICATION ]
AS sql_statement [ ...n ]
Trigger:

CREATE TRIGGER trigger_name


ON { table | view }
[ WITH ENCRYPTION ]
{
{ { FOR | AFTER | INSTEAD OF } { [ INSERT ] [ , ] [ UPDATE ] }
[ WITH APPEND ]
[ NOT FOR REPLICATION ]
AS
[ { IF UPDATE ( column )
[ { AND | OR } UPDATE ( column ) ]
[ ...n ]
| IF ( COLUMNS_UPDATED ( ) { bitwise_operator } updated_bitmask )
{ comparison_operator } column_bitmask [ ...n ]
}]
sql_statement [ ...n ]
}
}

You might also like