Professional Documents
Culture Documents
--Biên Dịch
EXEC SP_DSPHONGBAN'P03'
-- Vd2 Hiển thị thông tin tổng số nhân viên trong phòng khi người dùng nhập mã phòng
Create PROC SP_TOTALNV
@MAPHONG char(3)
AS
Select COUNT(*)
from Nhanvien
where MAPHONG=@MAPHONG
EXEC SP_TOTALNV'P01'
---- Vd2 Hiển thị thông tin tổng số nhân viên trong phòng khi người dùng nhập mã phòng
Create PROC SP_TOTAL3
@MAPHONG char(3),
@SOLUONG int output
AS
Select @SOLUONG=COUNT(*)
from Nhanvien
where MAPHONG=@MAPHONG;
--Thủ tục với tham số mặc định
Create proc SP_TOTAL4
@MAPHONG char(3) = 'P01',
@Soluong int output
As
Select @Soluong = COUNT(*)
from Nhanvien
where MAPHONG = @MAPHONG
Go
Declare @Dem int;
exec SP_TOTAL4 @Soluong=@Dem output
print 'SO LUONG NHAN VIEN PHONG' + ' ' + 'la: '+cast(@Dem as char(20));
--Thực hiện thủ tục
Declare @DEM int;
Declare @Phong char(3);
Set @Phong = 'P04'
Exec SP_TOTAL3 @MAPHONG= @Phong,@SOLUONG = @DEM OUTPUT
if @Phong != 'P04'
Print 'SO LUONG NHAN VIEN PHONG'+' '+@PHONG+' ' +'LA:'+CAST(@DEM AS
char(20));
else
print 'KHONG CO PHONG NAO CO MA LA' + ' ' +@Phong+' ';
--Viết thủ tục khi người dùng nhập vào mã nhân viên thì hiển thị thông tin của nhân viên
--và phòng ban tương ứng
Drop PROC SP_INFONV
Create PROC SP_INFONV
@MANV char(3)
AS
begin
Select NV.MANV,NV.HOTEN,NV.NGAYSINH,P.MAPHONG,P.TENPHONG from
Nhanvien NV Inner join Phong P On NV.MAPHONG = P.MAPHONG
where MANV = @MANV;
End
Exec SP_INFONV'N03'
--Viết thủ tục khi người dùng nhập vào Tên nhân viên thì hiển thị thông tin của nhân viên
-- và phòng ban tương ứng
CREATE PROC SP_INFOBYTENNV
@TEN NVARCHAR(50)
AS
SELECT N.*, P.TENPHONG
FROM NHANVIEN N, PHONG P
WHERE N.HOTEN LIKE '%' + @TEN AND N.MAPHONG = P.MAPHONG;
Go
--c2
Create Proc SP_NVFromTen
@Ten nvarchar(50)
As
Select nv.*, p.TenPhong
From NhanVien nv, Phong p
Where (LTRIM(RIGHT (HoTen, CHARINDEX(' ', REVERSE(HoTen)))) = @Ten)
and (nv.MaPhong = p.MaPhong);
Exec SP_NVFromTen N'Thương '
--Viết thủ tục nhập vào họ nhân viên,thì hiển thị thông tin của nhân viên
-- và phòng ban tương ứng
Create PROC SP_INFOHONV2
@HOTEN nvarchar(40)
AS
Select nv.*,p.TENPHONG
from Nhanvien nv, Phong p
where HOTEN like @HOTEN + '%' and nv.MAPHONG = p.MAPHONG;
go
--Biên dịch
Exec SP_INFOHONV2 N'Nguyễn'
--Tạo 1 trigger tự động thực hiện 1 câu thông báo mỗi khi nhập thêm 1 bản ghi mới cho nhân
viên
Create Trigger Tr_InsertNV
On Nhanvien
For Insert
As
Begin
Raiserror ('%d Dòng này đã được thêm vào trong bảng Nhân viên',0,1,@@rowcount);
Insert into Nhanvien
values('N07',N'Nguyễn Thị Minh ','09/11/2000','P01')
End
--vd3: Tạo 1 trigger tự động cập nhật mỗi khi có 1 cập nhật tự động trong bảng NV
Create Trigger Tr_Update
On Nhanvien
For Update
As
Raiserror ('%d dòng đã được cập nhật trong bảng Nhân Viên',0,1,@@rowcount)
-- Viết trigger xóa 1 nhân viên thì tổng nhân viên sẽ thay đổi
Alter Trigger TR_DROPNV
On Nhanvien
For delete
As
Update Phong
Set TongNV = TongNV-1
where Phong.MAPHONG = (select MAPHONG from deleted)
-- Viết trigger xóa nhiều nhân viên thì tổng số nhân viên trong phòng sẽ thay đổi
-- Viết trigger khi luân chuyên 1 hoặc nhiều nhân viên từ phòng này sang phòng khác thì tổng
số nhân viên sẽ thay đổi
Create Trigger TR_CHUYENNVSANGPHONGKHAC
On Nhanvien
For update
As
if UPDATE(MAPHONG)
Update Phong
Set TongNV = (Select count(*)
from Nhanvien
where Nhanvien.MAPHONG = Phong.MAPHONG)
--Chạy lệnh Update
Update Nhanvien set MAPHONG ='P02'
where MANV in ('N01','N05')
Select * from Phong
Select * from Nhanvien
--Viết hàm tính tống số nhân viên của phòng dựa trên bảng Nhânvien
if OBJECT_ID('fsonhanvien','FN') is not null
drop function fsonhanvien
go
Create function fsonhanvien (@MAPHONG char(4))
returns int
as
begin
return (Select count(*)
from Nhanvien
where Nhanvien.MAPHONG = @MAPHONG)
End
-- Datepart(Datepart,Date)---
select DATEPART(YY,GETDATE()) as [Năm]
select DATEPART(DD,GETDATE()) as [Ngày]
select DATEPART(DW,'2021/10/16') as [Thứ]
select DATEPART(QQ,GETDATE()) as [Quý]
select DATEPART(YY,GETDATE()) as [Năm]
select DATEPART(DY,GETDATE()) as [Ngày của năm]
select DATEPART(WW,GETDATE()) as [Tuần của năm]
--Dateiff(Datepart,Startdate,enddate)--
select DATEDIFF(MM,GetDate(),'2022/01/10') as [Số tháng]
select DATEDIFF(DD,GetDate(),'2022/01/10') as [Số Ngày]
select DATEDIFF(HH,GetDate(),'2022/01/10') as [Số giờ]
select DATEDIFF(WW,GetDate(),'2022/01/10') as [Số tuần]
--Bài tập 1 viết hàm trả về ngày của tháng năm do người dùng truyền vào
GO
CREATE FUNCTION F_MONTH_YY(@M INT, @Y INT)
RETURNS INT
AS
BEGIN
IF @M=2
IF (@Y%400=0) OR (@Y%4=0 AND @Y%100!=0)
RETURN 29;
RETURN 28;
IF @M IN (1,3,5,7,8,10,12) RETURN 31
RETURN 30;
END
select dbo.F_MONTH_YY(2,2021)
--Viết hàm xác định thứ trong tuần khi truyền vào biến ngày
Create function dbo.Datepar(@test date)
returns nvarchar(10)
As
Begin
Return case(Datepart(DW,@test))
WHEN 1 THEN N'Chủ nhật'
WHEN 2 THEN N'Thứ hai'
WHEN 3 THEN N'Thứ ba'
WHEN 4 THEN N'Thứ tư'
WHEN 5 THEN N'Thứ năm'
WHEN 6 THEN N'Thứ sáu'
WHEN 7 THEN N'Thứ bảy'
else N'Không hợp lệ'
end
End
--Tạo user B
Create login B with password = '123456';
Go
use QLNV;
Go
Create user B for login B;
--Tạo user C
Create login C with password = '123456';
Go
use QLNV;
Go
Create user C for login C;
-- PHÂN QUYỀN CHO 3 USER
-- A, B CÓ TOÀN QUYỀN TRÊN DB QLNV (Phân quyền db_owner cho user A,B)
-- C KHÔNG CÓ QUYỀN GÌ TRÊN DB QLNV,NGOÀI QUYỀN ĐƯỢC XEM (C có
quyền public)
-- LOGIN VÀO USER TƯƠNG ỨNG ĐỂ CẤP QUYỀN
-- A: CẤP QUYỀN XEM DỮ LIỆU CHO C TRÊN BẢNG NHÂN VIÊN
Grant select
on Nhanvien To C
-- B: CẤP QUYỀN XEM VÀ BỔ SUNG DỮ LIỆU TRÊN BẢNG NHÂN VIÊN CHO C
Grant select,insert
on Nhanvien To C
-- NHẬN XÉT: C LÚC NÀY CÓ NHỮNG QUYỀN GÌ? ( C lúc này có quyền Select và
insert)
-- B HỦY QUYỀN CỦA C (Thì lúc này C còn quyền Select từ A)
/*BT:
1.Tạo 2 login và user có tên: NSD1, NSD2
2.Cài đặt server role và DB Role cho 2 NSD trên
3.Cấp quyền cho 2 NSD
+NSD1 được quyền select, nhưng không được insert, update, delete trên các bảng
+NSD2 được quyền insert, select trên bảng phòng, k được update,delete trên NV
*/
--1. Tạo login và user NSD1,NSD2
Create login NSD1 with password = '123456'
use QLNV
Create user NSD1 for login NSD1
Lecture Questions
Lecture 7 – Design Physical File
Refer to Figure 1. For each of the following reports, indicate any indexes that
you feel would help the report run faster as well as the type of index:
a. State by products (use – specified period)
CO 8- Drawer Dresser 1
CO Entertainment Center 0
CO Write’s Desk 2
NY Write’s Desk 1
VA Write’s Desk 5
Cherry 13
Order Details:
Order Details:
Bookcase 4 69 276
Classical 75
(ORDER_DATE)
- Create clustered index T_ORDER_LINE_INDEX
On T_ORDERLINE (ORDER_ID, PRODUCT_ID)
- Create clustered index T_PRODUCT_INDEX
On T_ORDER (PRODUCT_LINE_ID)