使用引用表字段用SQL

时间:2016-07-07 16:56:38

标签: sql-server triggers reference null updates

我有一个包含6列program_idabcde的表(实际还有其他列也是如此,但就目前/问题而言,这就是所需要的一切。还有一个包含以下字段的参考表。 idprogram_idabcde

表1

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

表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

在我的参考表中,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 个答案:

答案 0 :(得分:1)

这是一个使用表约束的可能解决方案,我在SQL Server中做过,但Sybase类似

我认为参考表应如下所示:

public class MovieAdapter extends ArrayAdapter<MovieList> {

public MovieAdapter(Context context, List<MovieList> movieList){
    super(context,0,movieList);
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    MovieList movieList = getItem(position);

    if(convertView == null){
        convertView = LayoutInflater.from(getContext()).inflate(R.layout.poster_griditem_layout,parent,false);
    }
    Picasso
            .with(getContext())
            .load(movieList.poster)
            .fit()
            .into((ImageView) convertView);

    return convertView;
}

ColLock是一个位/布尔

使用函数访问引用表:

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

为每列添加表约束

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

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