30/09/2018, 20:53

Lỗi DML Trigger trong T-SQL ( SQL SERVER)

hế lu các anh , chị, bạn

mình có 1 yêu cầu như sau

VIẾT TRIGGER
`KHÔNG CHO PHÉP NGƯỜI DÙNG NHẬP VÀO 2 VẬT TƯ CÓ TENVATTU ( TÊN VẬT TƯ) 
giống nhau

BẢNG VẬT TƯ

mình làm như sau

thì khi INSERT, dù TENVT đã tồn tại, hay là chưa tồn tại trong bảng VATTU, thì luôn bị lỗi ‘KHÔNG ĐƯỢC CHÈN 2 VẬT TƯ CÓ CÙNG TÊN’ nghĩa là điều kiện INSERT vào , trigger kiểm tra k hợp lệ

theo mình tìm hiểu thì tùy chọn FOR INSERT
nó sẽ chèn dữ liệu vào bảng VATTU trước rồi mới thực hiện kiểm tra điều kiện, nên luôn bị lỗi

mình chuyển sang dùng tùy chọn INSTEAD OF INSERT ( kiểm tra đk xong mới chèn )

thì k bị lôi khi chèn nữa, chèn bản ghi có đk sai thì nó báo lỗi như ý muốn,

USE KHACHHANG
GO
INSERT INTO VT(MAVT,TENVT) VALUES (‘0000’,‘XI MANG’) – (đã trung tên)

nhưng vấn đề là chèn bản ghi có đk đúng, TENVT chưa tồn tại trong bảng VATTU, nó cho phép chèn, nhưng khi chèn xong, xem dữ liệu trong bảng thì k có bản ghi vừa chèn, mặc dù sql vẫn thông báo …arow(s) affected …

USE KHACHHANG
GO
INSERT INTO VT(MAVT,TENVT) VALUES ('0000','XIMANG')     -- không trùng tên

lỗi ở đâu nhỉ,mình đã refresh lại bảng như k thấy
xincamon

abcxyz viết 23:08 ngày 30/09/2018

ủa, k có ai ta ?

abcxyz viết 23:00 ngày 30/09/2018

up nao up nao up nao

abcxyz viết 23:04 ngày 30/09/2018

cúc cu, cúc cu

Sáng Béo viết 23:00 ngày 30/09/2018

bạn thử thêm vào cái INSTEAD OF

ELSE
BEGIN
    DECLARE @MAVT <kiểu dữ liệu>
    DECLARE @TENVT <kiểu dữ liệu>
    SELECT @MAVT = MAVT, @TENVT = TENVT FROM inserted
    INSERT INTO VT(MAVT, TENVT) VALUES(@MAVT, @TENVT)
END
abcxyz viết 22:59 ngày 30/09/2018

ELSE
BEGIN
DECLARE @MAVT <kiểu dữ liệu>
DECLARE @TENVT <kiểu dữ liệu>
SELECT @MAVT = MAVT, @TENVT = TENVT FROM inserted
INSERT INTO VT(MAVT, TENVT) VALUES(@MAVT, @TENVT)
END

được rồi bạn, nhưng bạn cho mình hỏi, tại sao lại phải làm thế, mình tưởng dữ liệu trong bảng inserted, với những câu khác, mình đặt dk cho trigger kiểm tra, nếu k thỏa mãn thì rollback, còn thỏa mãn thì k làm gì, nó tự chèn vào, nếu trigger kt đk đúng thì sẽ tự thêm chứ, mình phải tự thêm à ?
với lại khi chạy nó báo 2 dòng …arow(s) affected
mặc dù chỉ co 1 bộ được chèn vào

Sáng Béo viết 23:03 ngày 30/09/2018

còn thỏa mãn thì k làm gì, nó tự chèn vào, nếu trigger kt đk đúng thì sẽ tự thêm chứ

INSTEAD OF INSERT mình dịch là thay vì INSERT thì nó sẽ thực hiện cái trong trigger của mình.[quote=“DwarfFungi, post:6, topic:26158”]
với lại khi chạy nó báo 2 dòng …arow(s) affected
[/quote]

cái này mình chưa hiểu sâu lắm nên không giải thích được.

Bài liên quan
0