2016-07-07 52 views
1

我有6列program_idabcde表(實際上有其他欄目爲好,但目前/問題這是所有是需要的)。還有一個包含以下字段的參考表。 id,program_id,a,b,c, de使用參考表字段與SQL更新主表

表1

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

表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 

以我參考表中的A-E列是開/關或有/無。

我需要發生的是,表1將只允許更新相應的program_id具有NULL值的字段。所以在program_id 1的情況下可以這麼說。 column a, c and e將允許更新,column b and d不會。

program_id 2的情況下columns and and c將不允許任何更新和column b, d and e將允許他們。

我有一個觸發器的sql表 - 我正在考慮將該邏輯建立到插入觸發器(雖然我不知道這是否是最好的地方)。

計劃是運行此代碼,每年輸入50個左右的程序到表1中。 (還有一個年份字段可以進一步區分數據)。一旦插入數據,最好的方式是什麼不能更新這些數據,而不是從第三個數據中提取已經計算的值(不同的表格...表格3)。

該數據將通過infoamker/sybase顯示到第三方軟件中。但是最大的挑戰是先把它放到代碼中,然後一旦它出現在那裏,我不允許用戶更新infomaker中的那些字段,只更新NULL。

這是可能的嗎? (以及我該怎麼做)。

謝謝。

回答

1

下面是一個使用表約束一個可能的解決方案,我這樣做是在SQL Server中,但Sybase是類似

我認爲參考表應該是這樣的:

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

ColLock是位/布爾

訪問的參照表具有功能:

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 

添加表約束爲每列

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

你可以看到,我使用的列名改爲參考表,以便更好地查找。我發現違反約束條件的消息相當醜陋,在提交更新之前從客戶端接口調用函數會更好。希望這有助於您的解決方案,祝您好運。

+0

嗨,感謝您的幫助,我很難過,並試圖拆除您的解決方案,將其應用到我的項目 - 我很抱歉,聽起來如此密集 - 在您的開始塊選擇語句 - 什麼是選擇來自程序的'ColLock'。我必須爲每列(a-e)選擇一個語句嗎?或者ColLock在這種情況下究竟是什麼?再次感謝你! – Elizabeth

+0

嗨,這很好,我的錯,我只是重構了程序表,以便像在ColLock中一樣返回一個布爾值(「列鎖定」)。使用合適的ColLock值爲程序表中的每個程序/列對定義一行。然後對每個列執行一次「ADD CONSTRAINT」。正如我之前提到的那樣,如果您也可以從前端調用該函數並鎖定UI中的字段,那將會很好。 – MikeAinOz

+0

我希望回答你的問題,用戶定義的「CheckColumn」函數是所有這一切的關鍵,你可能想要稱之爲「udfCheckColumn」更獨特的東西。我已經寫了所有東西,記得函數只返回一個值。 – MikeAinOz