2016-07-07 18 views
1

Ich habe eine Tabelle mit 6 Spalten program_id, a, b, c, d und e (dort auch tatsächlich andere Spalten sind, aber für den Moment/Frage ist alles, was wird gebraucht). Es gibt auch eine Referenztabelle mit folgenden Feldern. id, program_id, a, b, c, d und e.Referenztabellenfelder Mit Haupt-Tabelle zu aktualisieren, mit SQL

Tabelle 1:

program_id, a, b, c, d, e 
1,   , , , , 
2,   , , , , 
1,   , , , , 
3,   , , , , 

Tabelle 2 (ref):

id, program_id, a,  b,  c,  d, e 
1, 1,   NULL, Y,  NULL, Y, NULL 
2, 2,   Y,  NULL, Y,  NULL, NULL 
3, 4,   Y,  NULL, Y,  NULL, NULL 
4, 5,   NULL, Y,  Y,  NULL, Y 

In meiner Referenztabelle der a-e Spalten sind ein/aus oder ja/nein.

Was ich passieren muss, ist, dass Tabelle 1 nur Updates für Felder, die einen NULL-Wert für die entsprechenden program_id haben. Also im Fall von program_id 1 lässt sich sagen. column a, c and e wird Updates erlauben, column b and d wird nicht.

im Fall von program_id 2columns and and c wird keine Updates zulassen und column b, d and e wird ihnen erlauben.

Ich habe eine SQL-Tabelle mit einem Trigger - ich dachte daran, diese Logik in einen Insert-Trigger zu bauen (obwohl ich nicht sicher bin, ob das der beste Ort ist).

Der Plan ist, diesen Code auszuführen, um die 50 oder so Programme in Tabelle 1 jährlich einzugeben. (Es gibt auch ein Jahr-Feld, um die Daten weiter zu unterscheiden). Sobald die Daten eingefügt sind, was die beste Art zu sagen ist, können diese Daten nicht aktualisiert werden, sondern ziehen Sie die bereits berechneten Werte aus einer dritten (andere Tabelle ... Tabelle 3).

Diese Daten werden über infoamker/sybase in einer Software von Drittanbietern angezeigt. Aber die große Herausforderung ist, es zuerst in den Code zu bekommen, dann, sobald es da ist, wie kann ich nicht zulassen, dass der Benutzer diese Felder im Infomaker aktualisiert und nur die NULLen aktualisiert.

ist das möglich? (und wie mache ich das).

Danke.

Antwort

1

Hier eine mögliche Lösung ist es, eine Tabellenbedingung verwenden, ich habe es in SQL Server, aber Sybase ist ähnlich

Ich dachte, dass die Referenztabelle sollte wie folgt aussehen: a

ProgramId ColName ColLock 
1   Col_A 0 
2   Col_A 1 
1   Col_B 0 
2   Col_B 0 

ColLock bit/Boolean

Zugriff auf die Referenztabelle mit einer Funktion:

CREATE FUNCTION [dbo].[CheckColumn] 
(
    @ProgramId int, @ColName varchar(10) 
) 
RETURNS bit 
AS 
BEGIN 
    DECLARE @LockCol bit 
    SET @LockCol= (SELECT ColLock FROM Program WHERE ProgramId = @ProgramId AND ColName = @Colname) 
    RETURN @LockCol 
END 

hinzufügen Tabelle Constraint für jede Spalte

ALTER TABLE [dbo].[Test_Table] WITH CHECK 
    ADD CONSTRAINT [CK_Test_Table] CHECK (([dbo].[CheckColumn]([ProgramId],'Col_A')=(0))) 

Sie können sehen, dass ich die Referenztabelle mit den Spaltennamen besser Lookup geändert.Ich hatte mir eingeredet, dass die Constraint-Verletzung Nachricht ziemlich hässlich ist und dass es besser wäre, die Funktion von der Client-Schnittstelle vor dem Senden der Aktualisierung aufzurufen. Hoffe, das hilft, viel Glück mit Ihrer Lösung.

+0

Hallo danke für Ihre Hilfe, ich bin ratlos und versuche, Ihre Lösung zu zerlegen, um es auf mein Projekt anzuwenden - es tut mir leid, so dicht klingen - in Ihrem Anfang blockieren die Select-Anweisung - was ist ausgewählt 'ColLock' vom Programm. Muss ich eine Select-Anweisung für jede Spalte (a-e) haben? Oder Was genau ist ColLock in diesem Fall? Danke nochmal! – Elizabeth

+0

Hallo, das ist in Ordnung, meine Schuld, ich habe gerade die Programmtabelle refaktoriert, um einen einzelnen booleschen Wert wie in ColLock ("Column Locked") zu erhalten. Definieren Sie für jedes Programm/Spaltenpaar in der Programmtabelle eine Zeile mit dem entsprechenden ColLock-Wert. Führen Sie dann für jede Spalte einen "ADD CONSTRAINT" (Tabelle hinzufügen) zu der Tabelle aus. Wie bereits erwähnt, wäre es schön, wenn Sie die Funktion auch vom Frontend aufrufen könnten, um das Feld in der Benutzeroberfläche zu sperren. – MikeAinOz

+0

Ich hoffte, dass Ihre Frage beantwortet, die benutzerdefinierte "CheckColumn" -Funktion ist der Schlüssel zu all dem, möchten Sie es etwas markanter nennen wie "UdfCheckColumn". Ich habe alles um sie herum geschrieben, erinnere dich daran, dass die Funktion nur einen Wert zurückgibt. – MikeAinOz