/// <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); }
private static void LookForAutoGeneratedId(DatabaseTable databaseTable) { var pk = databaseTable.PrimaryKeyColumn; if (pk == null) { return; } if (LooksLikeAutoNumberDefaults(pk.DefaultValue)) { //Oracle 12c default values from sequence pk.IsAutoNumber = true; return; } var match = OracleSequenceTrigger.FindTrigger(databaseTable); if (match != null) { pk.IsAutoNumber = true; } }