2016-04-08 5 views
-1

Ich habe ein Szenario, wo ich ein Produkt auf der asp.net-Front-End erstellen und es geht in eine SQL-Datenbank. Wenn ich ein Produkt erstelle, muss ich es 3 Lieferanten am Ende der Schriftart zuweisen, um zu sagen, dass diese Lieferanten die einzigen sind, die das Produkt liefern.sql E-Mail-Benachrichtigung für Kunden

Wenn ich jedoch die Daten für das Produkt eingegeben und auf Senden geklickt habe, werden die Daten in der Produkttabelle gespeichert. Ich möchte, dass es auch eine E-Mail an die zugewiesenen Lieferanten sendet, um zu sagen "Sie wurden zugewiesen"

Was ist das Beste, was zu tun ist? Ich habe Trigger empfohlen, aber nicht sicher, wie man sie benutzt.

+2

Welches DBMS verwenden Sie? "SQL" ist eine Abfragesprache, die von allen relationalen Datenbanken verwendet wird (also sind alle relationalen Datenbanken "SQL-Datenbanken"). –

+1

Sie sollten vermeiden, externe Ressourcen von Trigger aufzurufen. Bereiten Sie die Tabelle für die Warteschlange vor, und fügen Sie Details zu dieser Tabelle im Trigger ein. Stellen Sie einen Job ein, der die Tabelle überprüft und zum Beispiel alle 3 Minuten E-Mails sendet. – lad2025

+0

Und nur ein paar wenige dbms-Projekte sind ANSI SQL-konform, wenn es um Trigger geht. Die meisten Produkte haben ihre eigenen Versionen ... – jarlh

Antwort

0

Dies ist eher eine Frage der Architektur als eine SQL Server-Frage, aber ich bin glücklich, meine Meinung zu geben. Ich werde von der Idee, es in der Datenbank zu tun, zurücktreten und Ihnen eine andere Perspektive geben.

Das, was Sie beschreiben, fällt in das Gebiet der Geschäftsregeln und das Einfügen von Geschäftsregeln in die Datenbank, insbesondere in Trigger, kann Ihre Anwendung komplizierter zu verstehen und zu pflegen machen.

Stattdessen würde ich empfehlen, eine Service-Schicht zu erstellen und alle Geschäftsregeln wie diese in der Service-Schicht zu koordinieren, anstatt sie in die Datenbank zu mischen. Auf diese Weise hat die Datenbank einen Job (eine einzige Verantwortlichkeit) und das ist die Daten zu speichern ... es muss nichts anderes wissen.

Persönlich mag ich es, meinen Code auf diese Weise zu organisieren, da es den Einheitentest vereinfacht und die Einhaltung der SOLID-Prinzipien erleichtert.

Bitte Geduld mit mir für ein Beispiel ... In C#, könnten Sie eine Klasse, die etwa wie folgt aussieht:

class ProductService 
{ 
    private Database _database; 
    private Notifier _notifier; 

    public ProductService(Database database, Notifier notifier) 
    { 
     _database = database; 
     _notifier = notifier; 
    } 

    public void AddProduct(Product product) 
    { 
     _database.SaveProduct(product); 
     NotifySuppliersAboutProduct(product); 
    } 

    private void NotifySuppliersAboutProduct(Product product) 
    { 
     foreach (var supplier in product.Suppliers) 
     { 
      NotifySupplierAboutProduct(supplier, product) 
     } 
    } 

    private void NotifySupplierAboutProduct(Supplier supplier, Product product) 
    { 
     // TODO: Construct email to/subject/body variables here 
     _notifier.SendEmail(to, subject, body); 
    } 

} 

ProductService durch Zusammenbauen andere Klassen die Arbeit nur koordiniert sie es braucht und Aufruf um etwas zu erreichen, in diesem Fall ein Produkt hinzufügen.

Database ist eine Klasse, die alle Schnittstellen mit der Datenbank behandelt.

Notifier ist eine Klasse, die alle E-Mails sendet.

Ich hoffe, diese Idee hilft oder gibt Ihnen zumindest eine andere Option zu prüfen. Viel Glück!

Verwandte Themen