使用参考 table 字段将主 table 更新为 SQL

Using reference table fields to update main table with SQL

我有一个包含 6 列的 table program_idabcde(实际上还有其他列,但对于 moment/question 来说,这就是所需要的)。还有一个包含以下字段的参考 table。 idprogram_idabcde

Table 1:

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

Table 2(参考):

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

在我的参考文献 table 中,a-e 列是 on/off 或 yes/no。

我需要做的是 table 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 table - 我正在考虑将该逻辑构建到插入触发器中(尽管我不确定这是否是最佳位置)。

计划运行此代码每年将50个左右的程序输入table 1。 (还有年份字段进一步区分数据)。插入数据后,最好的说法是不能更新此数据,而是从第三个数据中提取已经计算出的值(不同 table ... table 3)。

此数据将通过 infoamker/sybase 显示到第三方软件中。但最大的挑战是首先将它放入代码中,然后一旦它在那里,我如何不允许用户更新 infomaker 中的那些字段并且只更新 NULL 字段。

这可能吗? (以及我该怎么做)。

谢谢。

这是一个使用 table 约束的可能解决方案,我在 SQL 服务器上做到了,但 Sybase 类似

我认为参考 table 应该是这样的:

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

ColLock 是 bit/Boolean

使用函数访问引用 table:

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

为每列添加一个Table约束

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

您可以看到我更改了引用 table 以使用列名更好地查找。我想到违反约束的消息相当丑陋,在提交更新之前从客户端界面调用该函数会更好。希望这对您有所帮助,祝您的解决方案顺利。