我有一个包含6列program_id
,a
,b
,c
,d
和e
的表(实际还有其他列也是如此,但就目前/问题而言,这就是所需要的一切。还有一个包含以下字段的参考表。 id
,program_id
,a
,b
,c
,d
和e
。
表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字段。
这可能吗? (我该怎么做)。感谢。
答案 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
您可以看到我更改了引用表以使用列名更好地查找。我曾经想过,约束违规消息相当丑陋,在提交更新之前从客户端界面调用该函数会更好。希望这会有所帮助,祝你的解决方案好运。