2011-05-12 16 views
14

Yerel ağda SQL Server veritabanı ve intranet web uygulaması var. Intranet web uygulaması kayıtları oluşturur ve bunları veritabanına gönderir. Yerel ağdaki SQL Server veritabanını kullanmak için yeni kayıtlar göndermek istiyorum bir internet web uygulaması var.SQL Server bir web isteği gönderebilir mi?

Çeşitli nedenlerle intranet web uygulamasını değiştiremiyorum/değiştiremediğim tek seçenek, yerel SQL Server'da bir tür http yayını kullanarak Internet web uygulamasına yeni kayıt gönderecek bir tetikleyici oluşturmaktır. istek veya url çağrısı.

İNTERNET web uygulaması, form yayınlama yoluyla herkese açık olarak erişilebilen bir URL'ye (örneğin, http://www.example.com/records/new) yeni kayıtlar alabilen RESTful api ile ayarlanır.

SQL Server'da bir URL aracılığıyla veri (URL'de xml, json, düz değişkenler) gönderilip gönderilmeyeceğini bilen var mı?

Herhangi bir düşünce için teşekkürler!

cevap

7

İyi (oldukça güvenilir ve ölçeklenebilir) bir seçenek olarak, web uygulaması/web hizmeti ile etkileşimde bulunmak için SQL CLR'u kullanabilirsiniz.

Örneğin, SQL CLR WebRequest veya SQL CLR WCF.

+1

Veya SSIS - Entegrasyon Hizmetleri. –

+0

@marc_s: Çok fazla erişilemeyen deneyimimden, SSIS daha karmaşık bir konu olan SQLCLR – abatishchev

+0

@marc_s Ayrıca SSIS ile sonuçta C# yazmak zorunda kalıyorsunuz çünkü bu genellikle yeterince esnek değil. – John

13

Bu mümkündür, ancak gerçek dünyada, öngördüğünüz naif yaklaşımdan biraz daha karmaşıktır. Bazı uzak ve bir yanıt beklerken tetikleyiciler kaynaklarını (öncelikle kilitleri) engeller çünkü

  • biri için, uygulama, durma noktasına taramaları da: Öncelikle, bir HTTP isteği için bir tetikleyici beklemek zorunda kabul edilemez uzakta WWW servisi. İkincisi, daha incelikli fakat çok daha kötüsü, geri dönüşlerin varlığında doğruluk konusudur. HTTP isteklerine verilen işlem geri alınırsa, HTTP isteğini 'geri almanın bir yolu yoktur.

Çözüm, bir istek aracılığıyla HTTP isteğinden tetikleyiciyi ayrıştırmaktır. Tetikleyici, talebi yerel bir sıraya girer ve işlerken, ayrı bir işlem parçası bu istekleri reddeder ve HTTP isteğini yayınlar. Bu, yukarıda belirtilen her iki sorunu çözmektedir. Sıralar için sıradan tabloları kullanabilirsiniz (bkz. Using Tables as Queues) veya her ikisi de iyi çalışır durumda olan Service Broker'u kullanabilirsiniz.

Bu isteklerin nasıl değiştirileceğine ve gerçekten de HTTP çağrısının nasıl yerleştirileceğine ilişkin olarak, özel bir işlem (örn. Bu amaçla ayrılmış bir uygulama) kullanılmasını şiddetle tavsiye ederiz. SQLCLR kullanmak mümkün olsa da, çok kötü bir seçimdir. SQL Server kaynakları (özellikle workers) İnternet yanıtlarını beklerken israfa çok kıymetlidir.

+0

Bir http isteği beklemiyorum. Tetiğin http isteğini başlatmasını istiyorum. Yeni bir kayıt güncellendiğinde tetikleyicinin bir url çağırmasını istiyorum.Bir yanıtı beklemek için buna ihtiyacım yok ya da –

+1

gibi bir şey var ama bu tetikleyici http isteğini bekleyecektir. Tetikleyici, ekleme/güncelleme işleminde ve yalnızca Tetikleyici yürütmeyi tamamladığında ekleme/güncelleme işleminin tamamlanacağını ve ekleme/güncelleme işlemini "bitireceğini" gösterecektir. Hepsi eşzamanlı olarak gerçekleşir. Tetikleyiciler mümkün olduğunca az ve FAST olmalıdır. Mümkünse, denetim türü verilerini başka bir tabloya boşaltmak için tetikleyiciler kullanmayın. –

0

Remus Rusanu tarafından iyi bir yanıt eklemek için. Ve Lehi Sanchez'in yorumuyla ilgili. Sorun şu ki, her zaman http isteği için beklemek zorunda. Tetikleyicideki kod, adım adım yürütme adımıdır, bu nedenle istek geri gelmek zorundadır, böylece tetikleyici yürütmeyi bitirebilir.