使用参考 table 字段将主 table 更新为 SQL
Using reference table fields to update main table with SQL
我有一个包含 6 列的 table program_id
、a
、b
、c
、d
和 e
(实际上还有其他列,但对于 moment/question 来说,这就是所需要的)。还有一个包含以下字段的参考 table。 id
、program_id
、a
、b
、c
、d
和 e
。
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 以使用列名更好地查找。我想到违反约束的消息相当丑陋,在提交更新之前从客户端界面调用该函数会更好。希望这对您有所帮助,祝您的解决方案顺利。
我有一个包含 6 列的 table program_id
、a
、b
、c
、d
和 e
(实际上还有其他列,但对于 moment/question 来说,这就是所需要的)。还有一个包含以下字段的参考 table。 id
、program_id
、a
、b
、c
、d
和 e
。
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 以使用列名更好地查找。我想到违反约束的消息相当丑陋,在提交更新之前从客户端界面调用该函数会更好。希望这对您有所帮助,祝您的解决方案顺利。