SQL Server - 23


AS BEGIN

declare @man nvarchar(15)

select @man=(select man from deleted) if (select count(*) from deleted)>0 begin


end else


END

if exists (select * from thisinh where man=@man) begin

rollback tran

Có thể bạn quan tâm!

Xem toàn bộ 323 trang tài liệu này.

raiserror('Không thể xóa ngành học này',16,6) end

else begin

raiserror('Ngành học này đã bị xóa',16,6) end


begin

raiserror('Không tồn tại ngành học này',16,6) end

Trường hợp 1: Không có ngành học trong bảng ngành.

Trường hợp 2 Tồn tại ngành học trong bảng thí sinh Trường hợp 3 Xóa 1

Trường hợp 2: Tồn tại ngành học trong bảng thí sinh.


Trường hợp 3 Xóa được ngành học trong bảng ngành Ví dụ 2 Xây dựng trigger 2

Trường hợp 3: Xóa được ngành học trong bảng ngành

Ví dụ 2 Xây dựng trigger trong bảng độc giả để kiểm tra các ràng buộc toàn 3

Ví dụ 2: Xây dựng trigger trong bảng độc giả để kiểm tra các ràng buộc toàn vẹn dữ liệu khi người dùng xóa một độc giả. Cần phải kiểm tra các ràng buộc toàn vẹn dữ liệu như sau:

Kiểm tra xem độc giả bị xóa có mượn sách không. Nếu thí sinh có mượn sách thì xóa các thông tin liên quan đến thí sinh này trong bảng mượn trả.

CREATE TRIGGER Trigger_DEL_DG

ON Docgia AFTER DELETE

AS BEGIN

declare @madg nvarchar(15) declare @sbg integer

declare @sbgs nvarchar(15)

select @madg=(select madg from deleted) if (select count(*) from deleted)>0

begin

raiserror('Độc giả này đã bị xóa',16,6)

if exists (select * from muontra where madg=@madg) begin

select @sbg=(select count(*) from muontra where madg=@madg)



END


end else

delete from muontra where madg=@madg

select @sbgs=(CONVERT(nvarchar(10),@sbg)+' Bản ghi trong bảng mượn trả đã bị xóa')

raiserror(@sbgs,16,6) end


begin

raiserror('Không có độc giả này',16,6) end

Trường hợp 1: Không có độc giả trong bảng độc giả.

Trường hợp 2 Độc giả chưa mượn sách lần nào Trường hợp 3 Thông tin có 4

Trường hợp 2: Độc giả chưa mượn sách lần nào.

Trường hợp 3 Thông tin có trong cả hai bảng độc giả mượn trả 3 Khi cập 5

Trường hợp 3: Thông tin có trong cả hai bảng độc giả, mượn trả.

3 Khi cập nhật bản ghi Trigger của sự kiện này sẽ tự động kích hoạt khi 6


3) Khi cập nhật bản ghi

Trigger của sự kiện này sẽ tự động kích hoạt khi dữ liệu trong bảng bị sửa đổi. Trong trigger sẽ có một số các kiểm tra ràng buộc toàn vẹn dữ liệu như là: kiểm tra ràng buộc toàn vẹn dữ liệu khóa ngoại, miền giá trị, liên thuộc tính trong cùng một bảng dữ liệu, liên thuộc tính của nhiều bảng dữ liệu khác nhau. Tuy nhiên, ta nên hạn chế việc sửa đổi dữ liệu, chỉ cho phép người sử dụng sửa đổi dữ liệu trên một số cột nhất định nào đó bên trong bảng.

Để kiểm tra giá trị dữ liệu của một cột bên trong bảng có bị thay đổi trong các trigger sửa đổi dữ liệu, ta sẽ sử dụng hàm UPDATE. Hành động sửa đổi dữ liệu bên dưới của Microsoft SQL Server thực chất là sự kết hợp của hai hành động đi kèm là xóa dữ liệu cũ hiện có và thêm lại dữ liệu mới đã được sửa đổi. Do đó, bên trong trigger sửa đổi dữ liệu khi đó bảng Inserted sẽ chứa đựng dữ liệu mới sau khi sửa đổi và bảng Deleted sẽ chứa đựng dữ liệu cũ trước khi sửa đổi. Thông thường trong trigger sửa đổi chúng ta có thể tham chiếu đến cùng lúc hai bảng Inserted và Deleted.

Ví dụ: Xây dựng trigger trong bảng hồ sơ để kiểm tra các ràng buộc toàn vẹn dữ liệu khi người dung cập nhật một bản ghi. Cần phải kiểm tra các ràng buộc toàn vẹn dữ liệu như sau:

Không cho phép cập nhật mã nhân viên. Ngày vào ngành phải lớn hơn ngày

sinh.

CREATE TRIGGER Trigger_Update_HS ON Hoso

AFTER UPDATE AS

BEGIN

declare @ngayvn as date declare @ngays as date


if (select count(*) from inserted)>0 begin

if update(manv) begin


end

raiserror('Không thể cập nhật mã nhân viên',16,1) rollback tran

if update(ngayvn) begin


select @ngayvn=(select ngayvn from inserted) select @ngays=(select ngaysinh from inserted) if @ngayvn<@ngays

begin

raiserror('Ngày vào ngành không hợp lệ',16,1) rollback tran

end


end else begin


end END

end


raiserror('Không có nhân viên này',16,1)


Trường hợp 1: Ngày vào ngành không hợp lệ.

Trường hợp 2 Không thể cập nhật mã nhân viên Trường hợp 3 Không có nhân 7

Trường hợp 2: Không thể cập nhật mã nhân viên.

Trường hợp 3 Không có nhân viên này trong bảng hồ sơ Trường hợp 4 Thỏa 8

Trường hợp 3: Không có nhân viên này trong bảng hồ sơ.


Trường hợp 4 Thỏa mãn các điều kiện cập nhật 4 Khi cập nhật giá trị 9

Trường hợp 4: Thỏa mãn các điều kiện cập nhật.

4 Khi cập nhật giá trị tự động Khi dữ liệu bị cập nhật bởi người sử 10

4) Khi cập nhật giá trị tự động

Khi dữ liệu bị cập nhật bởi người sử dụng, ngoài việc kiểm tra các ràng buộc toàn vẹn dữ liệu, bên trong trigger còn có thêm một tính năng ưu việt nữa đó là việc tính toán các giá trị và cập nhật tự động vào các cột của một bảng dữ liệu nào đó. Thông thường dữ liệu của các bảng này được hình thành dựa vào số liệu của một hoặc nhiều bảng khác bên trong cơ sở dữ liệu. Ta không nên viết các xử lý cập nhật giá trị tự động này thành một trigger mới hoàn toàn mà chỉ cần bổ sung các xử lý này vào bên dưới trong các trigger đã có. Bởi vì các xử lý cập nhật giá trị tự động chỉ được thực hiện khi nào các ràng buộc toàn vẹn dữ liệu đã được kiểm tra hợp lệ trước đó.

a) Khi thêm mới bản ghi:

Khi giá trị của các dữ liệu thêm mới đã được kiểm tra hợp lệ so với các ràng buộc toàn vẹn dữ liệu thì các dữ liệu này sẽ được cập nhật thay đổi giá trị tại một trường nào đó của các bảng liên quan.

Ví dụ: Tạo Trigger cho bảng xuất hàng khi thêm một bản ghi mới. Ta cần kiểm tra các ràng buộc toàn vẹn dữ liệu:

- Kiểm tra số lượng xuất phải nhỏ hơn hoặc bằng số lượng nhập.

- Kiểm tra đơn giá xuất phải lớn hoặc bằng đơn giá nhập.

Nếu tất cả các ràng buộc toàn vẹn dữ liệu ở trên đều hợp lệ thì thay đổi giá trị của trường số lượng tồn kho trong bảng tồn kho.

CREATE TRIGGER Trigger_Insert_Xuat ON Xuat


AFTER INSERT AS

BEGIN

declare @mamh as nvarchar(50) declare @slx as float

declare @sln as float declare @dgx as float declare @dgn as float


set @mamh=(select mamh from inserted)

if (select count(*) from nhap where mamh=@mamh)>0 begin

set @slx=(select slx from inserted) set @dgx=(select dgx from inserted)

set @sln=(select sln from nhap where mamh=@mamh) set @dgn=(select dgn from nhap where mamh=@mamh) if @slx>@sln or @dgn>@dgx

begin


else


end begin

rollback tran

raiserror('Số lượng xuất, đơn giá xuất không hợp lệ',16,2)


end else begin


end END

update tonkho set slt=slt-@slx

where mamh=@mamh end


rollback tran

raiserror('Không tồn tại mặt hàng này',16,2)

Trường hợp 1: Thêm thành công


Trường hợp 2 Không thêm bản ghi vào được bảng xuất Trường hợp 3 Không 11

Trường hợp 2: Không thêm bản ghi vào được bảng xuất

Trường hợp 3 Không tồn tại mặt hàng này b Khi xóa bản ghi Ngược lại với 12

Trường hợp 3: Không tồn tại mặt hàng này.

b Khi xóa bản ghi Ngược lại với việc thêm mới khi giá trị các dòng dữ 13

b) Khi xóa bản ghi:

Ngược lại với việc thêm mới, khi giá trị các dòng dữ liệu trong bảng bị hủy bỏ thì ta cập nhật thay đổi giá trị tại cột nào đó của các bảng liên quan.

Ví dụ: Tạo Trigger cho bảng xuất hàng khi xóa một bản ghi. Khi một bản ghi bị xóa thì phải thay đổi giá trị của trường số lượng tồn kho trong bảng tồn kho.

CREATE TRIGGER Trigger_DEL_xuat ON Xuat

AFTER Delete AS

BEGIN

declare @mamh as nvarchar(50)

..... Xem trang tiếp theo?
⇦ Trang trước - Trang tiếp theo ⇨

Ngày đăng: 16/07/2022