GÜNCELLEME GÜNCELLEME, güncellenmemesi gereken sütunlara mı katılmalıyım?


25

Çok güvenli ortamlarda çalışmaya alışkınım ve izinlerimi çok ince bir derece düzeyinde tasarlıyorum. Normalde yaptığım bir şey açıkça DENYkullanıcılara UPDATEhiçbir zaman güncellenmemesi gereken sütunlara sahip olma yeteneğidir .

Örneğin:

create table dbo.something (
    created_by varchar(50) not null,
    created_on datetimeoffset not null
);

Bu iki sütun, değer ayarlandıktan sonra asla değiştirilmemelidir. Bu yüzden açıkça olur onlara izin.DENYUPDATE

Son zamanlarda, bir ekip toplantısı sırasında bir geliştirici, alanların hiçbir zaman güncellenmemesini sağlayan mantığın, "bir nedenden dolayı değerleri güncellemeleri gerektiğinde" olması durumunda, uygulama katmanında yer almalı, veritabanı katmanında olmamalıdır. Bana göre tipik dev zihniyetine benziyor (biliyorum, eskiden biriydim!)

Ben şirketimin kıdemli mimarıyım ve her zaman uygulamanın çalışması için gereken en az ayrıcalık ilkesi üzerinde çalıştım. Tüm izinler düzenli olarak denetlenmektedir.

Bu senaryoda en iyi uygulama nedir?


Yanıtlar:


28

Argüman mantıklı değil. Kontrolleri ve kısıtlamaları daima verilere mümkün olduğunca yakın olmasını istiyorum. Uygulama katmanına koymak, yalnızca uygulama katmanını kullanan kişileri etkilediği anlamına gelir ve ayrıca kodun hatasız olacağını ve bu kod yollarının etrafındaki güvenliğin kurşun geçirmez olacağını varsayar . Bunlar büyük varsayımlar.

Kesinlikle güncellenmeleri gerekiyorsa, bu durum açıkça etkilenmeyen bir kişi tarafından yapılabilir DENYveya kişi geçici olarak etkilenmeyen bir role taşınabilir veya DENYgeçici olarak kaldırılabilir. Bunlar, DBA olarak, denetim yapmak için sizin için kolay olan şeylerdir. Uygulamasında? Çok değil.


16

Bunun teknik yönü konusunda @Aaron ile tamamen katılıyorum.

Bunun ötesinde, en iyi uygulamalarla ilgili olarak şunu söyleyebilirim:

  1. Verileri korumak DBA'nın işi / sorumluluğu olduğu göz önüne alındığında, varsayılan yaklaşım DBA'nın uygun gördüğü ve değişiklik yapmak için sağlam bir iş vakası gerektirdiği şekilde yapılmalı. Varsayımsal-gelecek-potansiyel-biraz-mümkün-verilmiş-belirli-koşulların-beyin fırtınası olacak-sonra-ve-doğrulanmış-ondan sonra-ama-belki-belki-sonra-sonra-belki-asla-asla - aslında olan sebep (yani "bir nedenle"), özellikle konu bir şirket standardını / uygulamasını değiştirirken, haklı çıkma konusunda biraz kararsız görünüyor.

  2. Asla değişmemesi gereken bir şey üzerinde değişiklik yapmak isteyen birine asla güvenmeyin ;-), (hatta neden istediklerini bile bilmiyorlarsa).

  3. Geliştiriciye, bu güncellemeleri önlemek için uygulama koduna bu tür bir mantık ekleyebileceklerini söyleyin. Ama aynı zamanda bunu kaldırmayacaksın DENY. Eğer / ne zaman gün gelirseolmayabilirBüyük olasılıkla, birisinin bu sütunlardan birini güncellemeye çalışırken bir hata alması durumunda), o zaman DENYbirisinin neden bu değeri güncellemesi gerektiğine ilişkin gerçek, sağlam bir gerekçeye gerek duyacağınız şeyleri kaldırıp kaldırmayacağınıza dair bir tartışma yapabilirsiniz . ilk yer.

    Olma noktası: insanların zamanlarını harcadıkları şeyleri yönlendiren gerçek bir iş vakası olmalı. Zaman yoğun talep görüyor, ancak arz yetersiz, yani siz (ve diğer herkes) birinin fikrine dayanarak sistemi değiştirmekten daha önemli şeyler yapacaksınız. Her zaman çeşitli görüşler olacaktır (boşluklar, sekmeler, herkes?) Ve eğer bu geliştirici ayrılırsa ve bunun yerine güncellenebilir alanlara şiddetle itiraz eden biri tarafından değiştirilirse, yıllarca bunu ileri geri değiştirerek geçirebilirsiniz. Eğer hiçbir müşteri bunu istemiyorsa (veya bunu gerektiren bir şeyi yapmıyorsa) ve maddi bir faydası yok (yatırım getirisini göstermesi zor olan, ancak teknik borç temizliği gibi gecikmiş bir fayda bile var. Uzun vadede fiili maliyet tasarrufuna yol açmayan harcadığı zamanın hiçbiri zayıf değildir), o zaman ya talebi kapatın ya da idealizmin değişmesi gerektiğini söylediği durumlarda bile bu talebi düşük bir öncelik sırasına koyun (bu durumlardan biri değil, öyle olduğunu düşünenler için belirtilir). İdealizm konuşmalar için harikadır, ancak şirketler idealleri olan kira, kamu hizmetleri, çalışanlar, vergiler vb.

  4. @ jpmc26, iletişim ihtiyacı konusunda doğru, ancak nelerin iletilmesi gerektiği konusunda tam olarak doğru değil. Evet, başkalarının ne istediğini dinlemeli ve bir şey hakkında net değilseniz, soru sormayı da içeren sebeplerini anlamalısınız.

    Bununla birlikte, veritabanı uygulamaya bağlı değildir ve veritabanı uzmanları (yöneticiler, mühendisler, şirketinizin kullandığı ad ne olursa olsun) geliştiricilere (bu cevapta belirtildiği gibi) tabi değildir. Geliştiriciler için çalışmazsınız, şirket için çalışırsınız, aynı işler. Bu bir takım çalışmasıdır ve işinizi yaptığınız için affetmemelisiniz. Bununla birlikte, biz bilgisayar türlerini insan genelinden iletişim becerilerimizle (genellikle) bilmediğimiz, bu nedenle, başkalarının sizi anladığından , gerekçenizin ne olduğunu, sorumluluklarınızın neler olduğunu ve bu işlerin gerçekte nasıl çalıştığını bildiğinizden emin olmanız gerekir. .

    Bu son kısmı koydum, çünkü yüksek derecede yanlış anlama, yanlış bilgilendirme ve bilgi eksikliği var (hatta tam bu sayfada bile). Mesela, tüm kuralların işletme kuralları olduğu kanısında. Veri kuralları ile iş kuralları arasında bir ayrım olduğunu açıklamamız gerekir (@Aaron buna bir yorumda "iş akışı kısıtı - veri kısıtı" olarak atıfta bulunulan) ve bazı verilerin doğal olarak uygulamaya ait olmasına rağmen, bazı verilerin aslında veri modeline aittir. Nasıl uygulama verileri geliştiriciler için DBA dikte Should olacak sınırlanabilir? Tabii ki değil. Uygulama verilerinin nasıl yapılabileceğini sunmak bizim işimizkısıtlanmak. Uygulama verileriyle ilgili bir iş kuralının ihlali zarar verebilecekse ve uygulama verileri yönetmenin % 100 tek yolu değilse, belki de bir kontrol kısıtlaması gerçekten yardımcı olabilir (ve bunların değiştirilmesi veya kaldırılması zor değildir) ).

    Ancak, diğer yönden gelen geliştiriciler, veri modeli verilerinin (yani meta veriler) nasıl işlendiğini belirlememelidir. Bu, denetim alanlarını ( created_on/ created_bysütunları gibi) ve PK / FK sütunları (bu değerlerin yalnızca dahili olarak bilinmesi ve müşterilere verilmemesi gerekir) içerir. Bu veriler, uygulamanın müşterilerle ilgili sakladığı şey değildir (uygulama değerleri görebilse ve hatta kimlikleriyle kullansa bile), veri modelinin uygulamanın verileriyle ilgili sakladığı şeydir.

    Dolayısıyla veri modeli verilerini korumak için veri kurallarını kullanmak mantıklıdır. Bunu yapmak, uygulama verilerine kısıtlamalar veya kısıtlamalar eklemeye başlamak üzere olduğunuz anlamına gelmez. Ancak, bu ayrım anlaşılmıyorsa, sohbeti gerçekten verimli bir şekilde ilerletmek zor olacaktır.

Yani:

  1. Evet, DENYdenetim sütunlarındaki açık fikirlerden hoşlanıyorum ve aynı şeyi geçmişte de çalıştığım yerlerde önerdim.
  2. Önceden, belki de 2000 yılında yabancı anahtarlar eklemeye başladığımda, öncü bir geliştiriciyle (çok iyi bir) çok benzer bir görüşme yaptım. Gereksiz yere aşırı mühendislik / idealizm (böyle bir konuşmadan bu yana 17 yıl geçtiğini) ve performansa değmeyeceğini, (ciddiyetle) olduğunu savundu. Uygulama katmanında temizlikle ilgili verilerin ele alınması gerektiği konusunda oldukça açıktı. (evet, FK'leri ekledim çünkü kodunun kaçınılmaz olarak yaratacağı yetmiş verileri temizleyen kişi olmayacaktı)

    Yıllar sonra o tartışmayı yaptığı için özür diledi ;-)


7

Bu muhtemelen bir XY problemidir. Geliştirici muhtemelen, özellikle güncel bir alandaki güncellemeleri engellemekle özellikle ilgilenmiyor created_on. Bu özel örnek son derece mütevazı bir kısıtlamadır.

Geliştirici, muhtemelen DBA ekibinin (sizi içeren), etkili bir şekilde çalışabilme yeteneklerini engellemeye ya da sıra dışı bir şey ortaya çıktığında ya da bir şey değiştiğinde, DBA ekibinin değişmesine neden olacak kadar çok ya da karmaşık kısıtlamalar eklemek niyetinde olduğundan endişe duymaktadır. değişikliklere direnecek ve geliştirici ekibinin ilerleme kaydetme yeteneğini engelleyecektir. Bu nispeten makul bir endişedir. Bürokrasiler ve ihtiyaç duyulan değişiklikleri etkileme yeteneğini kaybetme gerçek oluşumlardır ve çok fazla veya karmaşık kısıtlamaları kodlamanın performans üzerinde ve gereksinimlerdeki değişikliklere cevap verme yeteneği üzerinde olumsuz etkileri olabilir.

Geliştirici, bunun endişelerinin niteliği olduğunun farkında bile olmayabilir. Muhtemelen veritabanında serbestçe salınım yapmak için kullanılırlar ve özellikle de hiç kötüye kullanmadığınızı biliyorsanız, bu serbestlik seviyesinden vazgeçmek zordur. Bu nedenle, yapmaları gerekeni yapma yeteneğini kaybetme konusundaki endişeleri, belirsiz ve kötü tanımlanmış olabilir.

Bu korkuları gidermek için yapmanız gereken birkaç şey var:

  1. Geliştiricilerle yoğun şekilde iletişim kurun . Oluşturmaya çalıştıkları özelliklerin gereksinimlerini anladığınızdan ve değişiklikler gerçekleştiğinde yanıt verdiğinizden emin olun. Söyleyeceklerini dinleyin ve kaygılarınızı kendinizle dengeleyen bir çözüm bulmak için çok çalışın. Meşru ihtiyaçları olduğunda bükülmeye istekli olun. Yazılımı kurmakta müttefik olduklarını bildiklerinden emin olun .
  2. Kısıtlamaları koyarken dikkatli olun. Bütünlük ve güvenlik sağlamayı amaçlayan kısıtlamalar bile, öngörülemeyen koşullarla değişiklik yapmayı veya bununla başa çıkmayı zorlaştırabilir. Bu nedenle, eklediğiniz her kısıtlamanın, maliyetten tasarruf etme ihtimalinin yüksek olması muhtemel olduğunu (neredeyse hiç dezavantajı olmayan birincil ve yabancı anahtarlar hariç) olası olduğunu anlayın. Verdiğiniz kısıtlamaların gerçekten gerekli veya faydalı olduğundan emin olun.
  3. Ben bunu yaptığını herhangi bir işaret görmüyorum, ama herhangi bir diğer okuyucular için söz istiyorum: verileri veya veritabanını görmüyorum sizin veya ekibinizin sorumluluğundadır. Veriler tüm şirket için bir varlıktır. Saklamak için bir sistem (veritabanı) ve oluşturmak, güncellemek ve almak için komut dosyaları, araçlar veya uygulamalar olmadan, veriler değersizdir. Herkes bu varlığı kullanması gerektiğinden, veriler herkesin sorumluluğundadır. Veritabanının kendisi verilerden değer elde etmenin sadece bir kısmıdır.

0

Çakışan ifadeleriniz var

  • Asla güncellenmemesi gereken sütunlar
  • Bazı sebeplerden dolayı değerleri güncellemeleri gerekiyor.

İlki dikte etmek gerçekten size kalmış mı?

Uygulamanın hiçbir zaman değeri güncellemesi gerekmeyeceğinin kanıtı olmadan çalışmasını sağlamak için en az ayrıcalık atarsınız.

Veri bütünlüğünden kim sorumludur?

SQL kısıtlamaları ile veri bütünlüğünü garanti edebilir misiniz? Hayır, bir veritabanının yapabileceklerinin ötesine geçen iş kuralları olduğu için yapamazsınız.

VendorID gerektiğini asla değişmez ama ne olursa iki satıcıları birleştirmek. Asla asla Deme.

Eğer uygulama ekibi verileri kirletiyorsa ve otoriteye ihtiyaç duyduklarını söyledilerse o zaman onlar üzerindedir. Uygulama ekipleri sizin için çalışıyorsa, dikte edebilirsiniz.

Uygun soru, uygulama verileri hiç güncellemeli.


3
" Uygulama ekibi verileri kirletiyorsa ve bu otoriteye ihtiyaç duyduklarını söyledilerse o zaman onlar da var. " Sen 02:00 AM uygulama ekibine telefon ve düzeltmek için onları söyleyemem onların sorunu. Bu, DBA'nın sorunu, çünkü uygulama ekibi a) ne düzelteceğini bilmiyor, b) nasıl düzelteceğini bilmiyor ve c) düzeltmek için DB izinlerine sahip değil. Ve sonunda sorulan soru için geliştirici, uygulamanın verileri güncellemesi gerektiğini asla söylemedi ; "belki bir gün isteyebilirim" oldu.

@SolomonRutzky Bunu seninle tartışmayacağım. Belgelenirse sorumluluk otoriteye aittir. Seninle kelime oyunları oynamayacaksın.
paparazzo

2
"Sorumluluğun otorite ile gittiği" prensibine katılıyorum. Fakat bu pek çok insan için gerçek değil. Çalıştığım yerlerde bu ideal için tartışmıştım. Bunun nadiren gerçekleştiğini görüyorum. Ayrıca, bu bir tartışma değil, bir tartışma.
Solomon Rutzky,

@SolomonRutzky Veritabanındaki her uygulamayı etkileyen bir sorun olmadığı sürece, uygulama (ya da dev ops) ekibinden birinin sorunu düzeltmek için gerekli bilgi ve izinlere sahip olması gerekir. Veri tabanı düzeyinde değil, uygulama düzeyinde olan bir sorundan DBA ekibinin sorumlu olması için hiçbir neden yoktur.
Joe W.

1
@JoeW İfadelerim belirsizse özür dilerim. Özellikle veri tabanındaki a) uygulama katmanında, veritabanı özelliklerinin uygun kullanımı ile engellenebilecek sorundan kaynaklanan sorunlardan bahsediyorum, ve b) sorun değil (neden) şimdi verilerde. Ve (umarım) geliştiricilerin Production DB'lerine tam aralıklı erişime sahip olmaları nadirdir ve sys admin erişiminin gerekli olduğu senaryoları bile düşünmez.
Solomon Rutzky
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.