MSSQL de trigger larda değer atama

MS SQL Server veritabanı ve SQL komutlarıyla ilgli sorularınızı sorabilirsiniz. Delphi tarafındaki sorularınızı lütfen Programlama forumunda sorunuz.
Cevapla
windofmay
Üye
Mesajlar: 35
Kayıt: 19 Ağu 2003 06:42

MSSQL de trigger larda değer atama

Mesaj gönderen windofmay »

Herkese Merhaba
MSSQL de BEFORE INSERT ,BEFORE UPDATE de o tablo kolonlarına bilgi atamak istiyorum.
1- MSSQL de BEFORE ?
2- trigger içinde değer atamayı bulamadım (SET falan işe yaramadı)
3- Recordu Interbase de new ile alıyorduk MSSQL deki karşılıkları nedir
(new.CREATEDATE gibi)

kod :
CREATE TRIGGER BEFINSCARI ON CARI FOR INSERT AS
BEGIN
CREATEDATE=CURRENT_TIMESTAMP;
END
Kullanıcı avatarı
Kuri_YJ
Moderator
Mesajlar: 2247
Kayıt: 06 Ağu 2003 12:07
Konum: İstanbul
İletişim:

Mesaj gönderen Kuri_YJ »

Selamlar,

T-SQL Reference'den alıntı
Syntax
CREATE TRIGGER trigger_name
ON { table | view }
[ WITH ENCRYPTION ]
{
{ { FOR | AFTER | INSTEAD OF } { [ INSERT ] [ , ] [ UPDATE ] }
[ WITH APPEND ]
[ NOT FOR REPLICATION ]
AS
[ { IF UPDATE ( column )
[ { AND | OR } UPDATE ( column ) ]
[ ...n ]
| IF ( COLUMNS_UPDATED ( ) { bitwise_operator } updated_bitmask )
{ comparison_operator } column_bitmask [ ...n ]
} ]
sql_statement [ ...n ]
}
}
MS-SQL Server'da, bildiğim kadarı ve okuduğum kadarı ile BEFORE INSERT olayı yok (Aslında TRIGGER ya o anda çalışmakta yada AFTER olarak çalışmakta)
yani,

Kod: Tümünü seç

  CREATE TRIGGER MY_TRIGGER ON MY_TABLE FOR AFTER INSERT
şeklinde Create ederseniz. Trigger'ınız tableda Insert işlemi gerçekleştikten, Tüm Referantial Integryty check edildikten Tüm Constraintler Kontrol edildikten sonra ve Hata almaz ise Tetiklenir.

Kod: Tümünü seç

  CREATE TRIGGER MY_TRIGGER ON MY_TABLE FOR INSERT
diye create ederseniz ki Default böyledir. O zaman tam Insert anında Trigger Tetiklenir ve işleminiz araya girer.

Bu arada DELETED ve INSERTED diye reserved Word'ler vardır ve

Kod: Tümünü seç

SELECT * FROM DELETED
derseniz (ancak Trigger DELETE için yazılmış olmalıdır) o anda silinmekte olan kayıtları görebilirsiniz.

Kod: Tümünü seç

SELECT * FROM INSERTED
derseniz o anda Update olan ve/veya Insert olan kayıtları görebilirsiniz.

Bu arada MS-SQL'de SP veya Triggerda kullanılan (tanımlanmış) değişkenler @ işareti ile başlamak zorundadır.
Gelelim sizin örneğinize,

Kod: Tümünü seç

CREATE TRIGGER BEFINSCARI ON CARI FOR INSERT AS 
BEGIN 
  UPDATE CARI SET CREATEDATE = GETDATE() WHERE CARI_HAREKET_ID = (SELECT CARI_HAREKET_ID FROM INSERTED)
END 
şeklinde yapmalısınız. Ancak dikkat edilmesi gereken şey, yukarıda verdiğim Trigger örneği Singleton diye bahsedilen Tekli kayıt methodu ile çalışır. Eğer siz Multiple-rows şeklinde çalışacaksanız biraz değiştirmek gerekiyor.

Kolay Gelsin.
Kuri Yalnız Jedi
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
Kullanıcı avatarı
naile
Admin
Mesajlar: 1873
Kayıt: 11 Haz 2003 10:11

Mesaj gönderen naile »

Kuri_TLJ baya güzel açıklamış, çalışan bir örnek şu linke göndermiştim MS SQL Server için:

viewtopic.php?t=644
windofmay
Üye
Mesajlar: 35
Kayıt: 19 Ağu 2003 06:42

Mesaj gönderen windofmay »

cevaplarınız için teşekkür ederim bu yolla çözebilirim :)
ama

MSSQL de bu kadar basit birşeyi kulağını gösterme misali bu kadar dolaylı yoldan yaptıracağını düşünmemiştim :(

IBSQL de o kadar basitçe çözülüyorki :)
Kullanıcı avatarı
Kuri_YJ
Moderator
Mesajlar: 2247
Kayıt: 06 Ağu 2003 12:07
Konum: İstanbul
İletişim:

Mesaj gönderen Kuri_YJ »

Hehehehehe,

6.5, 7.0 ve 2000'de az güreş tutmadık biz bu MS-SQL Server'la :)

Kaç defa elimizde kaldı ızavallım. Ama sağolsun TAŞ gibi Query yazar duruma geldik sayesinde :)

Patlamayacak en sağlam Query'ler MS-SQL Server'da yazılıyor :) Her şeyi basit basit adım adım yapmanız lazım, biraz karmaşaya girdiniz mi saçmalamaya başlıyor ehi ehi ehiii... :lol:

Kolay Gelsin
Kuri Yalnız Jedi
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
windofmay
Üye
Mesajlar: 35
Kayıt: 19 Ağu 2003 06:42

Mesaj gönderen windofmay »

Sayın Kuri_TLJ
Update triggerında gelen kayıdın bilgisini nasıl değiştiriyoruz ?
Update komutunu kullanamıyorum kullandığında hata veriyor ?

Ornek ;

CREATE TRIGGER UPDCARI ON CARI FOR UPDATE AS
BEGIN
.............

UPDATE CARI SET UPDATEDATE = GETDATE()
WHERE CARI_HAREKET_ID = (SELECT CARI_HAREKET_ID FROM INSERTED)
END
Kullanıcı avatarı
Kuri_YJ
Moderator
Mesajlar: 2247
Kayıt: 06 Ağu 2003 12:07
Konum: İstanbul
İletişim:

Mesaj gönderen Kuri_YJ »

Selamlar,

Dikkatinizi bir noktaya çekmek istiyorum. Önceki cevapta bir uyarı yapmıştım,
Ancak dikkat edilmesi gereken şey, yukarıda verdiğim Trigger örneği Singleton diye bahsedilen Tekli kayıt methodu ile çalışır. Eğer siz Multiple-rows şeklinde çalışacaksanız biraz değiştirmek gerekiyor.
Muhtemelen siz de oraya takılıyor olabilirsiniz. SQL Query Analyzer'da ilgili tabloda sadece bir Satır'ı UPDATE eden bir UPDATE cümleciği yazıp çalıştırın, sonra Tablodaki bütün kayıtlar için aynı UPDATE cümleciğini çalıştırın ve sonuçları gözlemleyin.

Eğer 1 kayıt için yaptığınız işlem oluyor, tablonun tamamnını yapmaya kalktığınızda olmuyorsa bu dediğim sebeptendir.

Eğer bu dediklerimiz değil ise geriye dönen hatayı olduğu gibi bize yazın bir göz atalım.

Kolay Gelsin.
Kuri Yalnız Jedi
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
windofmay
Üye
Mesajlar: 35
Kayıt: 19 Ağu 2003 06:42

Mesaj gönderen windofmay »

Sayın Kuri_TLJ
hata benim kodlarımda imiş daha açıkçası tablo üzerinde 2 işlemim var bu şekilde yapınca 2. işlemimde hata veriyordu yapmayınca hata vermiyordu .Meğerse hata 2. işlemde imiş düzelttim sorun kalmadı.
Sayenizde IBSql bilgisi ile MsSql i de hallettim
Yardımlarınız için çok teşekkür ederim.Sağolun
Kullanıcı avatarı
Kuri_YJ
Moderator
Mesajlar: 2247
Kayıt: 06 Ağu 2003 12:07
Konum: İstanbul
İletişim:

Mesaj gönderen Kuri_YJ »

Tekrar Merhaba,

Ne demek, yardım edebildiysek ne mutlu bizlere :)

Kolay Gelsin.

Not : Güzel bir nickname bulmuşsunuz :)
Kuri Yalnız Jedi
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
Cevapla