2 Câu hỏi: Kích hoạt để ngăn chặn đặt phòng đôi luôn luôn gắn cờ

câu hỏi được tạo ra tại Wed, May 8, 2019 12:00 AM

Có một vấn đề trong đó trình kích hoạt luôn được gắn cờ tích cực, mặc dù từ những gì tôi có thể nói là điều kiện của nó không được đáp ứng. Tôi muốn nó gắn cờ khi 3 tiêu chí khớp chính xác với đặt chỗ khác, tuy nhiên bất cứ khi nào tôi chạy nó với bất kỳ dữ liệu nào, nó dường như trả về kết quả dương tính giả.

CREATE TRIGGER dbo.doubleBookRevised
ON dbo.tblBookingDetailsRevised
AFTER INSERT
AS
IF Exists (SELECT * FROM inserted i JOIN
dbo.tblBookingDetailsRevised bdr
ON i.locationID = bdr.locationID AND
i.bookedFor = bdr.bookedFor AND
i.bookedTimeSlot = bdr.bookedTimeSlot)
BEGIN RAISERROR ('Double bookings are not allowed.', 16, 1)
ROLLBACK TRANSACTION
RETURN
END
GO

Tôi đã triển khai một số logic trong giao diện người dùng C # để ngăn đặt trước gấp đôi, nhưng khi tôi chạy chương trình, nó sẽ thành công trong xác thực giao diện người dùng, nhưng gắn cờ dương tính giả khi cố gắng ghi vào bảng. >

Tôi đã sử dụng điều này để tham khảo, nhưng không thể hiểu điều gì khác biệt về việc triển khai của tôi so với giải pháp ở đây. Ngăn chặn đặt chỗ đôi trong SQL

EDIT: Theo lời khuyên Tôi đã kích hoạt trình kích hoạt từ SAU KHI CHỌN để CÀI ĐẶT CH INSN SÀNG theo sau;

INSTEAD OF INSERT
AS
IF (NOT Exists (SELECT * FROM inserted i JOIN
dbo.tblBookingDetailsRevised bdr
ON (i.locationID = bdr.locationID) AND
(i.bookedFor = bdr.bookedFor) AND
(i.bookedTimeSlot = bdr.bookedTimeSlot)))
INSERT INTO tblBookingDetailsRevised (bookingID, bookedFor, locationID, bookedTimeSlot, detailEquip) 
SELECT i.bookingID, i.bookedFor, i.locationID, i.bookedTimeSlot, i.detailEquip 
FROM inserted i
ELSE
BEGIN RAISERROR ('Double bookings are not allowed.', 16, 1)
RETURN
END
    
0
  1. Bạn đã thử sử dụng một ràng buộc UNIQUE chưa?
    2019-05-08 16: 00: 21Z
  2. Trình kích hoạt của bạn là AFTER INSERT, vì vậy bạn đang kiểm tra một bảng để đặt chỗ mà bạn vừa chèn. Nếu bạn đặt một quả bóng màu xanh vào một cái túi, và sau đó kiểm tra xem có một quả bóng màu xanh trong túi không, sẽ luôn có một quả bóng trong đó. Đây có vẻ như là một công việc cho chỉ mục /ràng buộc duy nhất.
    2019-05-08 16: 00: 51Z
  3. Hãy cẩn thận ở đây. Quay trở lại giao dịch trong một kích hoạt có thể có vấn đề. Nếu bạn có một giao dịch khác ngoài câu lệnh chèn, bạn sẽ gặp vấn đề.
    2019-05-08 16: 01: 56Z
  4. @ LuisCazares vấn đề là các số nhận dạng duy nhất đang được xem chỉ duy nhất khi được xem cùng nhau; nếu không tôi có thể dựa vào các khóa chính để ngăn chặn nó. Để cung cấp một chút ngữ cảnh, giá trị đã đặt là một ngày, nhưng nó được kết hợp với một khóa duy nhất làm cho khóa chính của một bảng khác được kế thừa như một phần của khóa tổng hợp ở đây và bạn có thể có nhiều ngày và khác nhau thay vào đó là vị trí hoặc thời gian, v.v. Tôi sẽ thử và triển khai trình kích hoạt INSTEAD OF INSERT thay thế
    2019-05-08 16: 13: 23Z
2 Câu trả lời                              2                         

Vấn đề như đã đăng có thể được giải quyết bằng một CONSTRAINT UNIITE đơn giản bao gồm 3 cột. Không có lý do để phát minh lại bánh xe.

ALTER TABLE dbo.tblBookingDetailsRevised 
ADD CONSTRAINT UQ_BookingDetailsRevised UNIQUE (locationID, bookedFor, bookedTimeSlot); 

Trừ khi có điều gì khác xảy ra và thông tin bị thiếu trong câu hỏi.

    
1
2019-05-08 16: 57: 24Z
  1. Điều này nghe có vẻ như là giải pháp chính xác. . . tránh hoàn toàn kích hoạt.
    2019-05-08 18: 37: 58Z
  2. À, vâng, điều đó có vẻ dễ dàng hơn và làm sạch một giải pháp
    2019-05-10 08: 52: 07Z

Bạn đang sử dụng kích hoạt AFTER INSERT, có nghĩa là hàng được chèn trước khi kiểm tra IF EXISTS trong kích hoạt kích hoạt. Vì nó nằm trong cùng một giao dịch của chèn nên bạn sẽ khớp trên hàng được thêm gần đây và sẽ nhận được kết quả khả quan. Nếu bạn muốn bắt nó trước khi chèn thì hãy sử dụng trình kích hoạt INSTEAD OF INSERT và xử lý thao tác chèn trong trình kích hoạt.

    
0
2019-05-08 16: 07: 09Z
  1. Tôi havTôi đã thử triển khai câu lệnh INSTEAD OF INSERT như bạn đề xuất, tuy nhiên tôi đã nhận thấy khi tôi thực hiện nó hiển thị "1 hàng bị ảnh hưởng" hai lần trong tab "kết quả" của Trình quản lý máy chủ SQL. Tôi tò mò nếu tôi đã phạm sai lầm trong việc thực hiện; Tôi đã chỉnh sửa Trình kích hoạt mới vào bài đăng gốc
    2019-05-08 16: 32: 27Z
  2. Điều đó là bình thường. Máy chủ SQL báo cáo chèn ban đầu và chèn kích hoạt dưới dạng các lệnh riêng biệt mặc dù INSTEAD OF INSERT thay thế INSERT.
    2019-05-08 16: 34: 34Z
nguồn đặt đây