/// <summary> /// Finds the trigger that uses a sequence for autonumbering. May return NULL. /// </summary> /// <param name="databaseTable">The database table.</param> /// <returns></returns> public static OracleSequenceTrigger FindTrigger(DatabaseTable databaseTable) { var triggers = databaseTable.Triggers; if (triggers.Count == 0) return null; var pk = databaseTable.PrimaryKeyColumn ?? databaseTable.Columns.Find(x => x.IsAutoNumber); if (pk == null) return null; //the trigger body will look something like "SELECT MYSEQ.NEXTVAL INTO :NEW.ID FROM DUAL;" var pattern = ".NEXTVAL\\s+?INTO\\s+?:NEW.\"?" + pk.Name; var regex = new Regex(pattern, RegexOptions.IgnoreCase); foreach (var databaseTrigger in databaseTable.Triggers) { var body = databaseTrigger.TriggerBody; var match = regex.Match(body); if (!match.Success) continue; var result = new OracleSequenceTrigger(databaseTrigger); //let's write the sequence if we can find it var seqName = ParseSequenceName(body, match.Index); if (seqName == null) return result; result.SequenceName = seqName; if (databaseTable.DatabaseSchema != null) { result.DatabaseSequence = databaseTable.DatabaseSchema.Sequences .FirstOrDefault(x => seqName.Equals(x.Name, StringComparison.OrdinalIgnoreCase)); } return result; } return null; }
/// <summary> /// Finds the trigger that uses a sequence for autonumbering. May return NULL. /// </summary> /// <param name="databaseTable">The database table.</param> /// <returns></returns> public static OracleSequenceTrigger FindTrigger(DatabaseTable databaseTable) { var triggers = databaseTable.Triggers; if (triggers.Count == 0) { return(null); } var pk = databaseTable.PrimaryKeyColumn ?? databaseTable.Columns.Find(x => x.IsAutoNumber); if (pk == null) { return(null); } //the trigger body will look something like "SELECT MYSEQ.NEXTVAL INTO :NEW.ID FROM DUAL;" var pattern = ".NEXTVAL\\s+?INTO\\s+?:NEW.\"?" + pk.Name; var regex = new Regex(pattern, RegexOptions.IgnoreCase); foreach (var databaseTrigger in databaseTable.Triggers) { var body = databaseTrigger.TriggerBody; var match = regex.Match(body); if (!match.Success) { continue; } var result = new OracleSequenceTrigger(databaseTrigger); //let's write the sequence if we can find it var seqName = ParseSequenceName(body, match.Index); if (seqName == null) { return(result); } result.SequenceName = seqName; if (databaseTable.DatabaseSchema != null) { result.DatabaseSequence = databaseTable.DatabaseSchema.Sequences .FirstOrDefault(x => seqName.Equals(x.Name, StringComparison.OrdinalIgnoreCase)); } return(result); } return(null); }