Em chào thầy ạ, em có làm phần ví dụ cuối của thầy theo cách này và có tác dụng và khá dễ hiểu ạ -- Viet trigger moi khi co mot chi tiet don hang duoc them vao, so luong ton kho phai giam di create trigger UpdateProductInventory on [dbo].[Order Details] after insert as begin update Products set UnitsInStock = UnitsInStock - i.Quantity from inserted i where Products.ProductID = i.ProductID end insert into [dbo].[Order Details](OrderID, ProductID, UnitPrice, Quantity) values(10248, 77, 13.00, 10)
Em cảm ơn thầy về bài giảng! Em gửi BT1 ạ! --BT1: viết Trigger khi insert hay Update tự cập nhật ngày giờ thay đổi ALTER TABLE dbo.Products ADD LastModified DateTime --Viết Trigger CREATE TRIGGER tg_UpdateLastModifiedWhenChangeProduct ON dbo.Products AFTER INSERT, UPDATE AS BEGIN UPDATE dbo.Products SET LastModified = GETDATE() FROM dbo.Products p INNER JOIN Inserted i ON i.ProductID = p.ProductID END
bài cập nhật số lượng tồn kho em có cách dễ hiểu hơn ạ . create trigger tudongcapnhatsoluongtonkhohanghoa on [dbo].[Order Details] after insert as begin update [Products] set [Products].[UnitsInStock] = [Products].[UnitsInStock] - i.Quantity from inserted i ,[Order Details] od where i.ProductID = [Products].ProductID and [Products].[UnitsInStock] >= i.Quantity
end insert into [dbo].[Order Details] values (10248,4, 700,999,0) select * from Products
Em cảm ơn thầy về bài giảng! Em gửi BT2 ạ! --BT2 CREATE TRIGGER InteadOfDeleteCustomer ON dbo.Customers INSTEAD OF DELETE AS BEGIN SET NOCOUNT ON IF EXISTS (SELECT 1 FROM Deleted d INNER JOIN dbo.Orders o ON o.CustomerID = d.CustomerID) BEGIN RAISERROR(N'Không thể xóa khách hàng có đơn hàng liên quan.',16, 1) END ELSE BEGIN --Nếu k có đơn hàng liên quan thì thực hiện xóa khách hàng DELETE FROM dbo.Customers WHERE CustomerID IN(SELECT CustomerID FROM Deleted) END END
thầy ơi, em search thì thấy FOR và AFTER đều là trigger đc kích hoạt SAU 1 sự kiện ấy thầy? em nghĩ đó là lý do tại sao bài discount khi thầy update discount=5 thì nó vẫn 1 row affected ấy thầy. còn BEFORE mới là trigger ktra trước khi 1 hành động xảy ra. ko biết theo em tìm hiểu đc như vậy có đúng ko thầy ?
Em cảm ơn thầy về bài giảng! Em gửi BT3 ạ! CREATE TRIGGER BanInsertOrderThanInStock ON dbo.[Order Details] FOR INSERT AS BEGIN SET NOCOUNT ON; IF EXISTS ( SELECT 1 FROM Inserted i INNER JOIN dbo.[Order Details] od ON od.OrderID = i.OrderID INNER JOIN dbo.Products p ON p.ProductID = od.ProductID WHERE p.UnitsInStock < od.Quantity ) BEGIN ROLLBACK; RAISERROR(N'Số lượng đặt hàng lớn hơn số lượng trong kho.', 16, 1); END END;
Em chào thầy ạ, em có làm phần ví dụ cuối của thầy theo cách này và có tác dụng và khá dễ hiểu ạ
-- Viet trigger moi khi co mot chi tiet don hang duoc them vao, so luong ton kho phai giam di
create trigger UpdateProductInventory
on [dbo].[Order Details]
after insert
as
begin
update Products
set UnitsInStock = UnitsInStock - i.Quantity
from inserted i
where Products.ProductID = i.ProductID
end
insert into [dbo].[Order Details](OrderID, ProductID, UnitPrice, Quantity)
values(10248, 77, 13.00, 10)
Cảm ơn a đã chia sẻ kiến thức cực kỳ tâm huyết! Nhờ những vid cụa a, e đã đạt đc giải khuyến khích của bộ môn này trong trg ạ ♥️🔥
Thật sự là cảm ơn kênh của anh rất nhiều. Chỉ cần xem vid của anh rồi làm thêm bài tập trên lớp là em đi thi SQL như ăn bánh luôn. Quá chất lượng
Em cảm ơn thầy về bài giảng!
Em gửi BT1 ạ!
--BT1: viết Trigger khi insert hay Update tự cập nhật ngày giờ thay đổi
ALTER TABLE dbo.Products
ADD LastModified DateTime
--Viết Trigger
CREATE TRIGGER tg_UpdateLastModifiedWhenChangeProduct
ON dbo.Products
AFTER INSERT, UPDATE
AS
BEGIN
UPDATE dbo.Products SET LastModified = GETDATE()
FROM dbo.Products p
INNER JOIN Inserted i
ON i.ProductID = p.ProductID
END
bài cập nhật số lượng tồn kho em có cách dễ hiểu hơn ạ .
create trigger tudongcapnhatsoluongtonkhohanghoa
on [dbo].[Order Details]
after insert
as
begin
update [Products]
set [Products].[UnitsInStock] = [Products].[UnitsInStock] - i.Quantity
from inserted i ,[Order Details] od
where i.ProductID = [Products].ProductID and [Products].[UnitsInStock] >= i.Quantity
end
insert into [dbo].[Order Details]
values (10248,4, 700,999,0)
select * from Products
Tuyệt vời anh ơi🤣
Phút 26:37 e nghĩ cái chỗ IF EXIST ... WHERE phải là i.Discontinued < 0 vì mình đang check với cái hàng update.
Cảm ơn a❤
Em cảm ơn thầy về bài giảng!
Em gửi BT2 ạ!
--BT2
CREATE TRIGGER InteadOfDeleteCustomer
ON dbo.Customers
INSTEAD OF DELETE
AS
BEGIN
SET NOCOUNT ON
IF EXISTS (SELECT 1 FROM Deleted d INNER JOIN dbo.Orders o ON o.CustomerID = d.CustomerID)
BEGIN
RAISERROR(N'Không thể xóa khách hàng có đơn hàng liên quan.',16, 1)
END
ELSE
BEGIN
--Nếu k có đơn hàng liên quan thì thực hiện xóa khách hàng
DELETE FROM dbo.Customers WHERE CustomerID IN(SELECT CustomerID FROM Deleted)
END
END
Thầy nói về sự khác nhau giữa stored procedure và function được hong ạ?
Em cảm ơn thầy nhiều ạa
thầy ơi, em search thì thấy FOR và AFTER đều là trigger đc kích hoạt SAU 1 sự kiện ấy thầy? em nghĩ đó là lý do tại sao bài discount khi thầy update discount=5 thì nó vẫn 1 row affected ấy thầy. còn BEFORE mới là trigger ktra trước khi 1 hành động xảy ra.
ko biết theo em tìm hiểu đc như vậy có đúng ko thầy ?
cảm ơn a
em cảm ơn ạ
mình có cần lập bảng tầm ảnh hưởng trước khi tạo trigger không ạ
thêm video về Trigger đi anh
Thầy ơi, e có lên github nhưng mà không có đáp án của 3 bài BTVN ạ
bài tập về nhà là tự giải á bạn. thầy chỉ up bài giảng thui
Em cảm ơn thầy về bài giảng!
Em gửi BT3 ạ!
CREATE TRIGGER BanInsertOrderThanInStock
ON dbo.[Order Details]
FOR INSERT
AS
BEGIN
SET NOCOUNT ON;
IF EXISTS (
SELECT 1
FROM Inserted i
INNER JOIN dbo.[Order Details] od ON od.OrderID = i.OrderID
INNER JOIN dbo.Products p ON p.ProductID = od.ProductID
WHERE p.UnitsInStock < od.Quantity
)
BEGIN
ROLLBACK;
RAISERROR(N'Số lượng đặt hàng lớn hơn số lượng trong kho.', 16, 1);
END
END;