2012-01-23 16 views
7

DÜZENLEME: Ne bir dağıtım olduğunu bilmiyorum, bir sınav kağıdında.SQL: Bildirim Her Satır için VS Tetikleyicileri

Sadece bunu anlamıyorum, ne yazık ki. Satır düzeyinde tetikleyicilerden oldukça memnunum, ancak bir kişi tetikleyici düzeyi yerine bunun nasıl sonuçlanacağını bana açıklayabilir mi?

İlişkisi/Tablosu Tetik/Satır Seviye Tetik

Employee(ID VARCHAR2(30), Salary NUMBER) 


Create Trigger AutoRaise 
After insert on Employee 
Referencing new table as NT 
update Employee 
Set salary = salary + (select avg(salary) from NT) 


Create trigger AutoRaise 
After insert on Employee 
Referencing new table as NT 
For each Row 
Update employee 
Set salary = salary + (select avg(salary) from NT) 

anlıyorum ki o tetikleyici ifadesi etkilenen her satır için yangın edeceğiz her satır tetikleyici için. Şimdi, ifade seviyesi tetikleyicisi sonuçları farklı şekilde değiştirir mi? Bir ifadeye beş tuple eklediğimi söyleyin, maaşları vb. Eğer öyleyse, buradaki satır seviyesinin yararı nedir?

Aramayı denedim ama başım ağrıyor.

sayesinde

DÜZENLEME: Şimdi, sadece yoğun açıyorum ama tetik ya farklı çıktılar üretecektir? Tetik oluşturulduktan sonra BİR açıklamada

(A,50) 

Eklendi: triggerin yaratılmadan önce tabloda

: Ben örnek değerleri kullanılırsa deyim düzeyi tetikleyici için

(B,70), (C,30) 

ilk tetik kuracak Her tuple takılan maaş, kesinlikle? Böylece ilk 120 olur (ortalama 50, 70 + 50 = 120) ve ikincisi 80 olur. Eğer bu doğruysa, ikinci tetikleyici sonuçlarda nasıl farklılık gösterir?

+2

** WHAT ** veritabanı sistemi ve hangi sürümü hakkında konuşuyorsunuz? ** SQL ** sadece Yapılandırılmış Sorgu Dili - birçok veritabanı sistemi tarafından kullanılan bir dil - SQL ** ** bir veritabanı ürünü ... bu gibi şeyler genellikle satıcıya özgü - bu yüzden gerçekten neyi bilmemiz gerekiyor Hakkında bahsediyorsunuz veritabanı sistemi .... –

+0

VARCHAR2, Oracle olduğunu gösteriyor gibi görünüyor. Ama yine de sözdizimi geçerli değil çünkü yeni tabloyu '...' olarak referanslamak gibi bir şey yoktur ve başlangıç ​​/ bitiş de eksiktir. –

+0

Ne yazık ki, bu geçmiş bir sınav kâğıtından, dolayısıyla belirli bir dağıtım söz konusu değil. –

cevap

4

fark deyimi seviyesi tetik SELECT avg(salary) FROM NT durumunda eklenen satırlar için maaş ortalama döneceğini, ancak satır düzeyinde durumunda, avg(salary) her zaman yeni rekor (tek tek her satır için yürütülen tetikleyici) ait salary eşittir. Ayrıca, kayıtlar etkilenmezse, ifade düzeyinde tetikleme gerçekleştirilir. Satır düzeyinde tetikleme durumunda, çoğu RDMS, 0 kayıtları etkilendiğinde onu tetiklemez. Yan not:

Yan not. Sorudaki tetikleyici organların sadece örnek olarak verildiğine inanıyorum; Aksi halde, özellikle RDMS'nin böyle bir seçeneği olsa bile tetikleyicilerinde yineleme kullanılmamasını öneririm.

+0

Merhaba, cevabınız için teşekkürler. Şimdi, sadece yoğunlaşıyorum, ya da farklı çıktılar üretmeye mi başlayacak?tetik yaratılmadan önce tabloda : Örneğin; değerleri kullanıldığında ifadesi seviyesi tetikleyici için '(A, 50) 'BİR açıklamada Eklenen tetikleyici oluşturulduktan sonra: ' (B, 70), (C, 30) ' İlk tetikleyici, takılan her bir tuple maaşı kesin olarak belirleyecektir? Böylece ilk 120 olur (ortalama 50, 70 + 50 = 120) ve ikincisi 80 olur. Eğer bu doğruysa, ikinci tetikleyici sonuçlarda nasıl farklılık gösterir? –

+1

İkinci tetikleyici (sıra seviyesi) için farklı olacaktır: 1. sıra (B, 70) eklendi: 70 + ort (70) = 140. İkinci satır eklendi (30): 1. sıra (140 + 30) = 170, saniye 30 + 30 = 60. Satır tetiği iki kez yürütülür, her satır için "NEW_TABLE" 1 kayıt olacaktır. – a1ex07

+0

Ayrıca, satır düzeyi tetiklemesi durumunda bir hata alacaksınız (ya da RDMS tetikte tekrarlamaya izin veriyorsa yineleme seviyesini işleyen bir mantığı eklemeniz gerekir) çünkü aynı tabloyu değiştirmeye çalışır. – a1ex07