2016-04-05 20 views
-1

kullanarak bir SQL tetikleyicisi oluşturma SQL veritabanı için bazı tetikleyiciler oluşturuyorum. Bir INSERT'i SYSDATE ile karşılaştıran iki tetikleyici başarıyla yaptım. Bu üçüncüsü için takılı bir değerin 10'dan büyük olmadığından emin olmaya çalışıyorum. Aşağıda tetikleyici ve test verileri çalışacaktır. Sorunun değer notunu beyan etmekle ilgili bir şey olduğuna inanıyorum.Bir sayı değişkeni

CREATE OR REPLACE TRIGGER trig_rating_ck 
BEFORE INSERT OR UPDATE OF rating ON reviews 
FOR EACH ROW 

BEGIN 
IF (NEW.rating > 10) THEN 
RAISE_APPLICATION_ERROR(-20000, 'Rating has to be between 1 and 10'); 
END IF; 
END trig_rating_ck; 
/

--TEST DATA 
INSERT INTO reviews (review_id, reviewer_id, venue_id, description, rating, date_posted) 
VALUES (seq_reviews.NEXTVAL, 10000,10000, 'THIS WAS GREAT', '11', '06-APR-2016'); 
+1

Aldığınız hata nedir? – bassrek

+2

Tetikleyiciyi oluşturduğunuzda bir hata aldığınızı tahmin ediyorum çünkü “new” ifadesinden önce “new” in (: new.rating> 10) 'dan önce bir sütun koymanız gerekir. 'Insert' deyimini de çalıştırırken bir hata alıyor olabilirsiniz, çünkü bir tarih değişkeni veya açık bir "to_date" kullanmak yerine bir tarih dizesine bir dize eklemeyi deniyorsunuzdur. –

cevap

4

Tetikleyiciler değil, bunun gibi bir şey için bildirim kısıtlamaları kullanmalısınız. Birkaç yıl içinde Oracle'la çalışmadım, ancak SQL Server tetikleyicilerinde büyük performans etkileri olabileceğinden, hatalara neden olabileceğinden ya da bir şeylerin kaymasına izin verdiğinden bahsetmiyoruz.

bu özel durum için sadece kullanabilirsiniz:

CONSTRAINT CHK_Reviews_rating CHECK (rating BETWEEN 0 AND 10) 

sadece masa beyanının parçası olacağını.

Tetikleyiciler ayrıca gizli bir iş mantığına da yol açabilir, bu da kötü bir fikirdir.

Bu durumlarda hatayı özelleştirebileceğinizi bilmiyorum, ancak uygulamanız hatayı görebilmeli ve uygun şekilde işleyebilmelidir.