Veritabanı tetikleyicileri kötü mü? [kapalı]


187

Veritabanı tetikleyicileri kötü bir fikir midir?

Benim tecrübelerime göre, onlar kötüdür, çünkü şaşırtıcı yan etkilere neden olabilirler ve hata ayıklamak zordur (özellikle bir tetikleyici başka bir tetiklediğinde). Genellikle geliştiriciler bir tetikleyici olup olmadığını düşünmeyi bile düşünmezler.

Öte yandan, her zaman yeni bir şey olması gereken mantığınız var gibi görünüyor FOO , veritabanında bir oluşturulduktan sonra koymak için en kusursuz yer FOO tablosunda bir ekleme tetikleyicisi gibi görünüyor.

Tetikleyicileri kullandığımız tek zaman, ayarı ayarlamak gibi gerçekten basit şeyler içindir ModifiedDate.


31
Bu tamamen meşru bir soru ama sansasyonel başlığı pek sevmiyorum. "Veritabanı tetikleyicilerini uygularken dikkate alınması gereken en önemli konular nelerdir?" çok daha iyi olurdu.
Tamas Czinege

2
Soru, yanıt eklemek için kapatıldı, ancak bkz. Veritabanı tetikleyicileri çapraz tablo bütünlüğü kısıtlamaları için güvenli mi? . (Spoiler: hayır, değiller)
Mifeet

16
Bu site beni çok kızdırıyor. Bu BÜYÜK bir soru ama diğerleri gibi kapalı çünkü insanlar bazı yabancı nedenlerden dolayı takip etmek zorunda hissediyorum Q&A ilkel ikili biçimine uymayan soruları kabul etmek için hayal gücünden yoksun.
Şubat'ta Quibblesome

1
Tetikleyicideki İş Mantığı sorunludur (kötüyseniz kötülük yapar). Bir tetikleyicideki Veritabanı Mantığı sorunlu değildir (bütünlük, günlük tutma).
Greg Gum

1
Kod navigasyonu ve neler olup bittiğini anlamak için IDE'ye güvenmeyi seviyorum. Mantığın yarısı veritabanında, diğer yarısı ise programlama dilinde ise yapamam. Tetikleyiciler yerine, her isteğin gerçekleştirmesi gereken bir denetleyici oluşturmayı daha kolay buluyorum. Bunun yerine tüm 'tetikleyiciler' uygulanabilir.
Muhammed Umer

Yanıtlar:


147

Tetikleyicilerin ana sorunları

  • Tamamen Globaldirler - tablo etkinliğinin bağlamı ne olursa olsun uygularlar;
  • Gizlidirler; istenmeyen (ve çok gizemli) sonuçlarla size zarar verene kadar orada olduklarını unutmak kolaydır.

Bu sadece uygun koşullar için dikkatle kullanılmaları gerektiği anlamına gelir; deneyimlerime göre ilişkisel bütünlük sorunlarıyla sınırlıdır (bazen deklaratif olarak elde edebileceğinizden daha ince ayrıntılarla); ve genellikle ticari veya işlem amaçlı değildir. YMMV.


20
Bunlar bazı durumlarda 2 avantajdır.
Johnno Nolan

18
"Gizli" harika bir kelime, evet - iyi dedi. Bu yüzden onlardan uzak durma eğilimindeyim: çoğu zaman unutulur veya göz ardı edilir. Kişisel deneyimlerime göre, tetikleyicileri tekrar ziyaret etmek genellikle alnıma bir şaplak eşlik eder.
Christian Nunciato

5
Küresel olmasının nedeni veri bütünlüğü ve denetim gibi şeyler için iyi ve gereklidir. Eksi değil, artı.
HLGEM

4
@ RobertŠevčík-Robajz, tanıdığınız tüm geliştiricilerin eksik olduğunu mu söylüyorsunuz?
HLGEM

3
@HGLEM, tetikleyicileri çözmek için bir uzman olması gerektiğini kabul edin. Gerçek hayat senaryosu - yok. Gerçek hayat senaryosu - unutulmuş bir tetikleyiciyle ilgili bir hatayı tanımlamaya çalışmak için harcanan günler. Gerçek hayat senaryosu - tetik mantığı çaresizce kolayca yeniden düzenlenebilir ve birim test edilebilir uygulama mantığına itiliyor. Anlaştığım gerçek hayat bana "tetikleyicilerden uzak dur" demesini sağlıyor ... pencerelerin kırıldığı taşların hatası olmadığı için tetikleyicilerin hatası değil.
Rbjz

80

Hayır, aslında iyi bir fikir. Belirli tetikleyicilerinizle ilgili bir sorun varsa, bunları doğru yapmıyorsunuz, ancak bu genellikle uygulamanızla ilgili bir sorun olduğu anlamına gelir , tetikleyicilerin kavramı değil kendilerini :-).

DBMS'ye özgü etkinliği ait olduğu veritabanının denetimine yerleştirdiği için çok fazla tetikleyici kullanıyoruz. Bir DBMS kullanıcılarının bu tür şeyler için endişelenmeleri gerekmez. Verilerin bütünlüğü, onu kullanan uygulamalara veya kullanıcılara değil , veritabanının kendisine aittir. Veritabanındaki kısıtlamalar ve tetikleyiciler ve diğer özellikler olmadan, kuralları uygulamak için uygulamalara bırakılır ve verileri yok etmek için sadece bir haydut veya buggy uygulaması / kullanıcı gerekir.

Örneğin, tetikleyiciler olmadan, otomatik olarak oluşturulan sütunlar gibi harika şeyler mevcut olmaz ve bunları seçerken her satırda bir işlevi işlemeniz gerekir. Bu, DBMS performansını öldürme olasılığı yüksek, ekleme / güncelleme zamanında otomatik olarak oluşturulan sütunu oluşturmak çok daha iyi, çünkü değiştiği tek zaman bu.

Ayrıca, tetikleyicilerin olmaması, sütunların belirli bir biçime sahip olmasını sağlamak için ön tetikleyiciler gibi veri kurallarının DBMS'de uygulanmasını önler. Bunun genellikle yabancı anahtar aramaları olan veri bütünlüğü kurallarından farklı olduğunu unutmayın.


9
msgstr "seçerken her satırda bir fonksiyon işleyelim". Bu amaçla işlev tabanlı bir dizin kullanmak bir tetikleyiciden daha iyidir.
tuinstoel

10
Mutlaka değil, tetikleyici muhtemelen yalnızca satır eklendiğinde veya güncellendiğinde çalışır. İşlev tabanlı dizin her seçimde çalışır. Kullanım şekline bağlı olarak biri muhtemelen diğerinden daha iyidir. Ama her ikisi de DAİMA diğerinden daha iyi değildir.
jmucchiello

@tuinstoel: Ben senin beyanı kabul etmek zorunda bazı zaman. Örneğin Oracle, yalnızca işlevin deterministik olduğunu kanıtlayabiliyorsa işlev tabanlı dizinler oluşturur. Bazen bu kanıtlanamaz (örneğin, işlev tablodan bir arama içeriyorsa , tablonun verilerinin asla değişmediğini bilseniz bile ).
Adam Paynter

50

Araçlar asla kötü değildir. Bu araçların uygulamaları kötü olabilir.


11
Yorum okuduktan sonra hiç bu kadar çatışmadım. Bir yandan, ikinci bir değişiklik yapıyorum ve silahların doğal olarak kötü olmadığına inanıyorum: bunları kullanan kişi. Öte yandan, tetikleyicilerin kötü olduğuna inanıyorum ... Sanırım varoluşsal bir erime yaşıyorum ...
vbullinger

37
@vbullinger silahları kötü değil, ama tetikleyicileri;)
Darragh Enright

2
: D Genellemeler tehlikelidir (özyinelemeli). Soruşturmacılar tarafından bir itirafı 'tetiklemek' için kullanılan işkence 'araçları' ile mi geldiniz? Yine de perspektif için +1.
Rbjz

22

Katılıyorum. Tetikleyicilerle ilgili sorunlar tetikleyiciler değil insanlardır. Her ne kadar daha fazla bakmak, daha fazla düşünmek ve kodlayıcıların işleri doğru bir şekilde kontrol etmesine rağmen, hayatımızı kolaylaştırmak için dizinleri atmıyoruz. (Kötü dizinler, kötü tetikleyiciler kadar kötü olabilir)

Tetikleyicilerin önemi (aklımda) ...
- Herhangi bir sistem her zaman
geçerli bir durumda olmalıdır - Bu geçerli durumu uygulayan kod merkezileştirilmelidir (her SP'de yazılmamalıdır)

Bir bakım açısından bakıldığında, bir tetikleyici, daha genç / amatör olanlar için rakip kodlayıcılar ve problemler için çok yararlıdır. Yine de, bu insanların bir şekilde öğrenmesi ve büyümesi gerekiyor.

Sanırım çalışma ortamınıza geliyor. İyi öğrenen ve metodik olduğu konusunda güvenilir olabilecek güvenilir insanlarınız var mı? Değilse, iki seçeneğiniz var:
- Telafi etmek için işlevselliği kaybetmeniz
gerektiğini kabul edin - Farklı insanlara veya daha iyi eğitim ve yönetime ihtiyacınız olduğunu kabul edin

Kulağa sert geliyorlar ve sanırım öyle. Ama bence temel gerçek bu ...


3
>>> Tetikleyicilerin sorunları insanlar. Evet, sadece insanlar montajda kod yazabiliyorsa, boktan GUI ile çalışabilir, kötü tasarlanmış bir kapıyı itmek veya çekmek için doğru bir şekilde tahmin edin ...
Fakrudeen

1
@Fakrudeen, yanlış tetikleyen herhangi bir geliştirici bir veritabanına erişmekte yetersiz.
HLGEM

21

Tetikleyiciler sadece kötü değil, aynı zamanda iyi bir veritabanı tasarımı için gerekli olduğunu düşünüyorum. Uygulama programcıları veritabanlarının sadece uygulamalarından etkilendiğini düşünmektedir. Genellikle yanlıştırlar. Veri bütünlüğü ne olursa olsun veri bütünlüğü korunacaksa, tetikleyiciler bir gerekliliktir ve bunlardan kaçınmak aptalcadır, çünkü bazı programcılar ödüllü uygulamaları dışında bir şeyin şeyleri etkileyebileceğini düşünemeyecek kadar etnosentriktir. Yetkili bir veritabanı geliştiricisiyseniz, bir tetikleyici tasarlamak veya test etmek veya sorun gidermek zor değildir. Ayrıca, bir tetikleyicinin size (eğer bana olduğu gibi) oraya bakması durumunda beklenmedik bir sonuca neden olduğunu belirlemek de zordur. Sp'de referans vermediğim bir tabloda FK hatası olduğunu belirten bir hata alırsam, Hatta tetikleyici soruna neden olduğunu düşünmeden bile biliyorum ve herhangi bir yetkili veritabanı geliştirici gerekir. İş kurallarını sadece uygulamaya koymak, diğerlerinin bile kuralın var olduğunu ve süreçlerinde ihlal ettiğini bilmediği için kötü verileri bulduğum bir numaralı nedendir. Veri merkezli kurallar veritabanına aittir ve tetikleyiciler daha karmaşık kuralların uygulanmasında kilit öneme sahiptir.


1
Veri merkezli kurallar veri tabanına aittir
1919'da absin

had mesome programmers are too ethnocentric to consider that something other than their prized application may be affecting things
Kid101

13

Çoğunlukla evet.

Bir tetikleyicinin zorluğu, "arkanızda" bir şeyler yapmasıdır; uygulamayı koruyan geliştirici, uygulamanın orada olduğunu kolayca fark edemez ve fark etmeden işleri berbat eden değişiklikler yapabilir.

Sadece bakım işi ekleyen bir karmaşıklık katmanı oluşturur.

Bir tetikleyici kullanmak yerine, genellikle aynı şeyi yapmak için depolanmış bir yordam / rutin yapılabilir, ancak açık ve sürdürülebilir bir şekilde - depolanmış bir rutinin çağrılması, geliştiricinin kaynak koduna bakabileceğini ve tam olarak ne olduğunu görebileceği anlamına gelir.


12
Bu bir tetikleyicinin avantajı dezavantaj değil! Saklanan işlemlerin, verilerdeki her değişiklik için çağrılması garanti edilemez. GUI'nin yanı sıra verilerin değiştirilebilmesinin birçok yolu vardır.
HLGEM

2
HLGEM, erişim kontrolünüze bağlı. Saklı yordamlar dışında doğrudan tablolarda yapılan değişiklikleri reddedebilirsiniz.
Rbjz

1
Örneğin, iki tablodaki kayıtların her zaman birlikte oluşturulması ve imha edilmesi gerektiğinde, veritabanına nasıl erişirseniz ve kim olduğunuz veya hangi izinlere sahip olursanız olun, tetikleyicilerin tek meşru çözüm olduğunu düşünüyorum. . Sadece çok fazla veya yanlış izin atamak ve insanların hangi saklı yordamların kullanılacağını bilmelerini beklemek bile mümkündür , yani veritabanı bütünlüğünü kaybetme riski altındadır. Yabancı anahtar ilişkileriyle tamamen aynı. Veritabanı motoru tarafından EN İYİ ve GÜVENİLİR bir şekilde uygulanır.
Triynko

2
Kayıtların her zaman birlikte oluşturulması / imha edilmesi gerekiyorsa, olmasını sağlayan bir kontrol kısıtlaması oluşturun. Bu şekilde, kuralları ihlal eden biri, bilgileri veya rızası olmadan sihirli bir şekilde işleri doğru yapan gizli bir davranıştan ziyade bir hata alır.
MarkR

9

Tetikleyiciler son derece güçlü ve kullanışlıdır, tetikleyicinin bir soruna en iyi çözüm olduğu birçok senaryo vardır.

Ayrıca çok iyi bir "hack" aracıdır. Sıklıkla kodun ve veritabanının hemen kontrolünde olmadığınız durumlar vardır. Kodunuzun bir sonraki büyük sürümü için 2 ay beklemeniz gerekiyorsa, ancak veritabanınıza hemen bir yama uygulayabilirsiniz, o zaman bazı ek işlevler gerçekleştirmek için bir tabloya bir tetikleyici koyabilirsiniz. Daha sonra kod serbest bırakma mümkün olduğunda, bu tetikleyiciyi isterseniz aynı işlevselliğin kodlanmış sürümüyle değiştirebilirsiniz.

Günün sonunda, ne yaptığını bilmiyorsanız, her şey "kötülük" dür. Tetikleyicilerin, onları anlamayan geliştiriciler olduğu için karar vermek, bazı insanların araba kullanamayacağı için arabaların kötü olduğunu savunmakla aynıdır ...


7

Tetikleyicilerin kullanımları vardır - günlüğe kaydetme / denetleme ve "son değiştirilme tarihi" sürdürme, önceki yanıtlarda belirtilen iki çok iyi kullanımdır.

Bununla birlikte, iyi tasarımın temel ilkelerinden biri, iş kuralları / iş mantığı / onu aramak istediğiniz her şeyin tek bir yerde toplanması gerektiğidir. Mantığın bir kısmını veritabanına koymak (tetikleyiciler veya depolanmış procs aracılığıyla) ve bir kısmı da uygulama prensibini ihlal eder. Her iki yerde de mantığı çoğaltmak daha da kötüleşir, çünkü birbirleriyle her zaman senkronize olmayacaklardır.

Daha önce değinilmiş olan "en az sürpriz ilkesi" sorunu da vardır.


3
Doğru, tek bir yerde olmalı, veritabanı. Verilerin bütünlüğünü etkileyen mantık her zaman veritabanında olmalı ve veritabanındaki verileri etkilerken hiçbir zaman çağrılabileceği veya alınamayacağı bir uygulamada olmamalıdır.
HLGEM

1
@HLGEM: Bu, veritabanının verilerin geçerli olup olmadığını söyleyebilecek bilgilere erişip erişemeyeceğine bağlıdır. Yapabileceği her zaman böyle değildir; doğrulayıcı başka bir kuruluşta olduğunda (örneğin, kredi kartı veya banka hesabı bilgileri için) DB doğru olup olmadığını bilemez - bunun bankanın DB'si olmadığı varsayılarak! - ve icra başvurusuna güvenmek zorunda kalacaktır. İstemediğiniz şey, veritabanının üçüncü taraf hizmetlere rasgele bağlantılar kurmasını sağlamaktır, çünkü sunucu dağıtımı söz konusu olduğunda kötüdür.
Donal Fellows

@HLGEM: Tüm uygulama mantığını veritabanına koyma seçeneğini tamamen dışlamaya hazır olmasam da, onu başka bir yere koymak için daha iyi çalışma eğiliminde olduğunu görüyorum, genellikle tüm uygulamalara erişen yeniden kullanılabilir bir OO katmanı veritabanı. Uygulamanız veritabanına yalnızca nesne katmanı üzerinden eriştiği sürece, her zaman çağrılan mantığın aynı garantileri geçerli olacaktır.
Dave Sherohman

2
Asla sadece nesne katmanı aracılığıyla veritabanına veri ekledi bir iş uygulaması üzerinde çalıştı ve ben bir üzerinde çalışmak istemem. Yalnızca tek bir kayıt atama süresi için tasarlanmış bir işlemle milyonlarca kayıt ithalatı veya tüm fiyat güncellemeleri koymak aptalca. Nesne katmanı, veri bütünlüğünü uygulamak için tam olarak yanlış yerdir, bu nedenle birçok veri tabanının bütünlük sorunları vardır.
HLGEM

@HLGEM Bu nedenle bir işlem içindeki her şeyin değişim kümesini kullanarak bir tetikleyici gibi çalışmak için ORM'mizin bir uzantısı üzerinde çalışıyorum. Biraz aptalca hissediyor ama birkaç kez dışında uygulamada tüm iş mantığımıza sahip olmamızı engelleyecek (Sadece birkaç tablo hiç toplu güncellemeye ihtiyaç duyuyor). Ayrıca tüm geliştiricilerin bunları en rahat oldukları dilde ve oluşturduğumuz tüm nesne soyutlamalarına erişebileceği bir dilde yazmasına ve kullanmasına izin verecektir.
Adamantish

6

Tetikleyiciler doğru kullanıldığında iyi bir araçtır. Özellikle değişiklikleri denetlemek, özetleme tablolarını doldurmak vb.

Eğer diğer tetikleyicileri başlatan bir tetikleyici ile "tetik cehennem" ile sonuçlanırsa şimdi "kötü" olabilir. Bir keresinde "flex tetikleyiciler" adını verdikleri bir COTS ürünü üzerinde çalıştım. Bu tetikleyiciler bir tabloya kaydedildi çünkü dinamik sql sokmaları her yürütüldüklerinde derlendi . Derlenmiş tetikleyiciler bir arama yapar ve bu tablonun çalıştırmak ve sonra "flex" tetikleyicisini derleyip çalıştırmak için herhangi bir esnek tetikleyici olup olmadığını görür. Teorik olarak bu gerçekten harika bir fikir gibi geldi, çünkü ürün kolayca özelleştirildi, ancak gerçekte yapmak zorunda olduğu tüm derlemeler nedeniyle neredeyse patlamış veritabanı oldu ...

Yani evet, yaptığınız işi perspektifte tutarsanız harikalar. Denetim, özetleme, otomatik sıralama, vb. Gibi oldukça basit bir şeyse, prob yok. Tablonun büyüme hızını ve tetiğin performansı nasıl etkileyeceğini unutmayın.


6

Yüksek seviyede tetikleyiciler için iki kullanım durumu vardır1

1) "Otomatik olarak" bir şeyler yapmak. Bu durumda tetikleyiciler bir yan etkiye neden olur, çalıştırılan ve tetikleyicinin tetiklenmesine neden olan (ilkel) operatör ekleme, güncelleme veya silme göz önüne alındığında verileri beklenmedik şekillerde değiştirir.

Buradaki genel fikir birliği, tetikleyicilerin gerçekten zararlı olduğu yönündedir. Çünkü bir INSERT, UPDATE veya DELETE deyiminin iyi bilinen anlamlarını değiştirirler. Bu üç ilkel SQL operatörünün anlambiliminin değiştirilmesi, ileride gelecekte SQL ilkelleriyle çalıştıklarında artık beklenen şekilde davranmayan veritabanı tablolarınız üzerinde çalışması gereken diğer geliştiricileri ısırır.

2) Veri bütünlüğü kurallarını uygulamak için, deklaratif olarak ele alabileceğimiz kurallar dışında (CHECK, PRIMARY KEY, UNIQUE KEY ve FOREIGN KEY kullanarak). Bu kullanım durumunda INSERT / UPDATE / DELETE tarafından yapılan değişikliğe izin verilip verilmediğini doğrulamak için tüm tetikleyiciler QUERY (SELECT) verisidir. Tıpkı bildirimsel kısıtlamaların bizim için yaptığı gibi. Sadece bu durumda biz (geliştiriciler) yürütmeyi programladık.

İkinci kullanım durumu için tetikleyicilerin kullanılması zararlı değildir.

Bu konuda blog yazıyorum: http://harmfultriggers.blogspot.com


Referans bütünlüğü için tetikleyiciler kullanırken, eşzamanlılık sorunlarını ele almaktan daha zordur.
WW.

2
Kabul. Ancak başka araçlar kullanırken daha mı kolay?
Toon Koppelaars

Birincinin sadece beceriksiz geliştiricileriniz varsa zararlı olduğunu iddia ederim.
HLGEM

Lol olsa beceriksiz geliştiriciler bir sürü vardır.
hashtable

5

Tetikleyicilerin her zaman istedikleri işlevselliğe ulaşmanın en doğrudan yolu olduğu yerlerde kullanılması gerektiğini düşünen geliştiriciler ve asla yapmayacak geliştiriciler olduğunu biliyorum. Neredeyse iki kamp arasındaki dogmaya benziyor.

Ancak şahsen MarkR ile tamamen katılıyorum - (neredeyse) her zaman daha perspektif ve bu nedenle bakımı daha kolay olacak tetikle işlevsel olarak eşdeğer kod yazabilirsiniz.


Bir veritabanı vurmak dışında tüm çalışmaları uygulama kodu üzerinden akar.
HLGEM

5

Kötü değil. Aslında böyle şeyleri basitleştirir

Kayıtlardaki ve hatta veritabanı şemalarındaki değişikliklerin kaydedilmesi / denetlenmesi

ALTER TABLE'da üretim ortamınızdaki değişiklikleri geri alan bir tetikleyiciniz olabilir. Bu, yanlışlıkla tablo değişikliklerini önlemelidir.


2.Birden fazla veritabanında referans zorunluluğunu (birincil / yabancı anahtar ilişkileri, vb.) Uygulama


DDL ifadelerini geri alabilir misiniz?
Andrew Swan

Genellikle hayır. Bunu durdurmanın tek yolu bu izni kullanıcıların oturum açma izinlerinden kaldırmaktır.
jmucchiello

Bazı veritabanı motorlarında şunları yapabilirsiniz (örn. PostgreSQL).
Nicolás

@Andrew - SQL Server'da şunları yapabilirsiniz. SQL Server 2005+, aynı zamanda gibi olaylarda tetiklenen DDL tetikleyicilerine de sahiptir ALTER TABLE.
Martin Smith

4

Hayır, onlar kötü değil - sadece yanlış anlaşılıyorlar:

Tetikleyicilerin geçerli bir kullanımı vardır, ancak nihayetinde işleri daha da kötüleştiren bir retro-hack olarak çok sık.

Bir uygulamanın parçası olarak bir DB geliştiriyorsanız, mantık her zaman çağrıyı yapan kodda veya sprocs'ta olmalıdır. Tetikleyiciler daha sonra hata ayıklama ağrısına yol açacaktır.

Kilitlemenin, kilitlenmenin ve DB'lerin diskteki dosyalara nasıl eriştiğini anlarsanız, tetikleyicileri doğru şekilde kullanmak (örneğin, doğrudan DB erişimini denetlemek veya arşivlemek) gerçekten değerli olabilir.


4

Kötülük olduklarını söylemek bir abartıdır, ancak ağa neden olabilirler. Bir tetikleyicinin ateşlenmesi diğer tetikleyicilerin ateşlemesine neden olduğunda, gerçekten karmaşık hale gelir. Diyelim ki onlar zahmetli: http://www.oracle.com/technology/oramag/oracle/08-sep/o58asktom.html

Oracle'da tetikleyicilerle iş mantığı yapmak, çoklu eşzamanlılık sorunları nedeniyle göründüğünden daha zordur. Diğer oturumlar bitene kadar başka bir oturumda değişiklik görmezsiniz.


4

Kesinlikle kötü değiller. Bir sütun yeniden adlandırırken veya bir sütunu iki sütuna böldüğünüzde ya da tam tersi (örnek: ad / soyadı örneği) ve geçişe yardımcı olurken, veritabanı şemalarının yeniden düzenlenmesi sırasında tetikleyicileri değerli buldum.

Denetim için de çok faydalıdırlar.


4

Bu yanıt özellikle SQL Server için geçerlidir. (Diğer RDBMS'ler için de geçerli olabilir, hiçbir fikrim yok. Burada bir cevap olarak vermeyi tercih ederdim ama bu bir dupe olarak kapatıldı.)

Şimdiye kadar cevapların hiçbirinde bahsedilmeyen bir husus güvenlik. Varsayılan olarak, tetikleyiciler, tetikleyicinin tetiklenmesine neden olan ifadeyi yürüten kullanıcının bağlamı altında yürütüldüğünden, tüm tetikleyiciler gözden geçirilmedikçe bir güvenlik tehdidine neden olabilir.

" Tetikleyici Güvenliğini Yönetme " başlığı altında BOL'de verilen örnek GRANT CONTROL SERVER TO JohnDoe ;, kendi izinlerini artırmak için kodu içeren bir tetikleyici oluşturan bir kullanıcıdır .


3

Yan etkiler varsa, bu tasarımla ilgili bir sorundur. Bazı veritabanı sistemlerinde, otomatik birincil alanı ayarlamak için başka bir olasılık yoktur, yani birincil anahtar kimliği alanı için.


3

Bence onlar kötü olabilirler, ama sadece gelişimdeki her şey kadar kötü olabilirler

Onlarla ilgili çok fazla deneyimim olmasa da, üzerinde çalıştığım ve beni bu sonuca götüren yeni bir projede aldım. Onlarla var sorun onlar iş mantığı iki yerde, bir kod kitaplığı ve bir veritabanı sona neden olabilir olmasıdır .

Ben sprocs kullanarak benzer bir argüman olarak görüyorum. Genellikle SQL'de iş mantığını veritabanında gerçekten iyi olan geliştiricileriniz olurken, olmayan kişilerin iş mantığı başka bir yerde olacaktır.

Dolayısıyla benim en temel kuralım, projenizin yapısının ne olduğuna bakmak. İş mantığının veritabanında depolanması uygun görünüyorsa, tetikleyicilere sahip olmak yararlı olabilir.


1

Gerçekten de, tetikleyiciler sıklıkla yanlış kullanılmaktadır. Aslında çoğu durumda onlara bile ihtiyacınız yok. Ama bu onları mutlaka kötü yapmaz.

Tetikleyicilerin yararlı olduğu aklıma gelen bir senaryo, kaynak koduna sahip olmadığınız eski bir uygulamanız olduğunda ve bunu değiştirmenin bir yolu olmadığı zaman.


1

Tetikleyicilerin fikri kötülük değildir, tetikleyicilerin yuvalanmasını sınırlamak kötülüktür.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.