编写SQLite数据库触发器以隐藏SELECT请求中的特定数据

时间:2012-02-05 04:19:50

标签: sqlite stored-procedures triggers

如果数据不是最新的,是否可以编写一个SQLite触发器和/或存储过程,它将在SELECT请求中返回备用数据?我知道在选择特定记录时如何做到这一点,因为记录ID可以传递给存储过程进行评估。但我希望SELECT * FROM TABLE语句只隐藏相关数据,无论后续WHERE子句中指定的条件如何。必须评估每个单独的记录。这可以通过修改现有数据或简单地返回false值来实现。例如,像这样的伪代码:

for (RECORD in ALL_RECORDS_REQUESTED) {

  // test if field contains value of interest and is more than one hour old
  if ( ( fieldOfInterest LIKE '%VALUE_I_AM_CENSORING%' ) && ( recordTimestamp > ( recordTimestamp + 60 ) ) ) {

    // change value of field before returning (or simply return false value)
    fieldOfInterest = 'value I want you to see';

  }

}

我只想说我不希望触发器在表中最初INSERTED或UPDATED时修改任何数据,因为我希望原始值至少可以使用一小时。之后,如果任何SELECT语句请求记录,我希望它被更改。

这在SQLite中是否可行,或者这是否需要修改与数据库交互的应用程序?我知道如何在应用程序中编写代码,但更愿意在数据库本身内处理它。

这也可以通过一个触发器来完成,该触发器会自动将条件附加到每个SQL语句,从而允许排除数据:     WHERE NOT EXISTS (SELECT fieldOfInterest, recordTimestamp FROM tblOfInterest WHERE fieldOfInterest LIKE '%VALUE_I_AM_CENSORING%' AND recordTimestamp > recordTimestamp + 60)

或者这种效果......

1 个答案:

答案 0 :(得分:2)

Triggers仅在特定数据库表的DELETEINSERTUPDATE出现时,或者在{1}}上发生UPDATE时触发更多指定的表列。

您可以使用VIEW来完成您想要的任务,但之后所有数据访问都必须通过该视图。