public static void AddForeignKey(this IQuery query, ObjectName tableName, string constraintName, string[] columnNames,
                                  ObjectName foreignTableName, string[] foreignColumns, ForeignKeyAction onDelete, ForeignKeyAction onUpdate)
 {
     query.AddConstraint(tableName,
                         SqlTableConstraint.ForeignKey(constraintName, columnNames, foreignTableName.FullName, foreignColumns, onDelete,
                                                       onUpdate));
 }
        public ICreateTableStatementBuilder WithConstraint(SqlTableConstraint constraint)
        {
            if (constraint != null)
            {
                var constraintName = String.IsNullOrEmpty(constraint.ConstraintName) ? "#ANON#" : constraint.ConstraintName;
                SqlTableConstraint existing;
                if (constraints.TryGetValue(constraintName, out existing))
                {
                    var constraintColumns = new List <string>(existing.Columns);
                    foreach (var column in constraint.Columns)
                    {
                        if (!constraintColumns.Contains(column))
                        {
                            constraintColumns.Add(column);
                        }
                    }

                    constraints[constraintName] = new SqlTableConstraint(constraintName, existing.ConstraintType, constraintColumns.ToArray())
                    {
                        CheckExpression = constraint.CheckExpression,
                        OnDelete        = constraint.OnDelete,
                        OnUpdate        = constraint.OnUpdate,
                        ReferenceTable  = constraint.ReferenceTable
                    };
                }
                else
                {
                    constraints[constraintName] = constraint;
                }
            }

            return(this);
        }
Exemple #3
0
        internal AddConstraintAction AsAddConstraintAction()
        {
            var constraint = new SqlTableConstraint(ConstraintType, new [] { ColumnName });

            if (ConstraintType == ConstraintType.Check &&
                !String.IsNullOrEmpty(CheckExpression))
            {
                constraint.CheckExpression = SqlExpression.Parse(CheckExpression);
            }

            // TODO: Implement the foreign keys

            return(new AddConstraintAction(constraint));
        }
        public SqlTableConstraint BuildConstraint()
        {
            if (String.Equals(ConstraintTypeNames.Check, ConstraintType, StringComparison.OrdinalIgnoreCase))
            {
                var exp = ExpressionBuilder.Build(CheckExpression);
                return(new SqlTableConstraint(ConstraintName, Tables.ConstraintType.Check, Columns.ToArray())
                {
                    CheckExpression = exp
                });
            }
            if (String.Equals(ConstraintTypeNames.PrimaryKey, ConstraintType, StringComparison.OrdinalIgnoreCase))
            {
                return(SqlTableConstraint.PrimaryKey(ConstraintName, Columns.ToArray()));
            }
            if (String.Equals(ConstraintTypeNames.UniqueKey, ConstraintType, StringComparison.OrdinalIgnoreCase))
            {
                return(SqlTableConstraint.UniqueKey(ConstraintName, Columns.ToArray()));
            }
            if (String.Equals(ConstraintTypeNames.ForeignKey, ConstraintType, StringComparison.OrdinalIgnoreCase))
            {
                var fTable   = ReferencedTableName.Name;
                var fColumns = ReferencedColumns;
                var onDelete = ForeignKeyAction.NoAction;
                var onUpdate = ForeignKeyAction.NoAction;

                if (!String.IsNullOrEmpty(OnDeleteAction))
                {
                    onDelete = SqlCodeObjectBuilder.GetForeignKeyAction(OnDeleteAction);
                }
                if (!String.IsNullOrEmpty(OnUpdateAction))
                {
                    onUpdate = SqlCodeObjectBuilder.GetForeignKeyAction(OnUpdateAction);
                }

                var fkey = SqlTableConstraint.ForeignKey(ConstraintName, Columns.ToArray(), fTable,
                                                         fColumns.ToArray(), onDelete, onUpdate);

                return(fkey);
            }

            throw new NotSupportedException();
        }
        public void AddForeignKeyConstraint()
        {
            var tableName  = ObjectName.Parse("APP.test_table2");
            var constraint = new SqlTableConstraint("FK_1", ConstraintType.ForeignKey, new[] { "person_id" })
            {
                ReferenceTable   = "APP.test_table",
                ReferenceColumns = new[] { "id" }
            };

            AdminQuery.AddConstraint(tableName, constraint);

            var fkeys = AdminQuery.Session.Access().QueryTableForeignKeys(tableName);

            Assert.IsNotNull(fkeys);
            Assert.IsNotEmpty(fkeys);

            var fkey = fkeys.FirstOrDefault(x => x.ConstraintName == "FK_1");

            Assert.IsNotNull(fkey);
            Assert.IsNotNull(fkey.ForeignTable);
            Assert.AreEqual("APP.test_table", fkey.ForeignTable.FullName);
            Assert.IsNotNull(fkey.ForeignColumnNames);
            Assert.IsNotEmpty(fkey.ForeignColumnNames);
        }
        public ICreateTableStatementBuilder WithConstraint(SqlTableConstraint constraint)
        {
            if (constraint != null) {
                var constraintName = String.IsNullOrEmpty(constraint.ConstraintName) ? "#ANON#" : constraint.ConstraintName;
                SqlTableConstraint existing;
                if (constraints.TryGetValue(constraintName, out existing)) {
                    var constraintColumns = new List<string>(existing.Columns);
                    foreach (var column in constraint.Columns) {
                        if (!constraintColumns.Contains(column))
                            constraintColumns.Add(column);
                    }

                    constraints[constraintName] = new SqlTableConstraint(constraintName, existing.ConstraintType, constraintColumns.ToArray()) {
                        CheckExpression = constraint.CheckExpression,
                        OnDelete = constraint.OnDelete,
                        OnUpdate = constraint.OnUpdate,
                        ReferenceTable = constraint.ReferenceTable
                    };
                } else {
                    constraints[constraintName] = constraint;
                }
            }

            return this;
        }
 public static void AddUniqueKey(this IQuery query, ObjectName tableName, string constraintName, params string[] columnNames)
 {
     query.AddConstraint(tableName, SqlTableConstraint.UniqueKey(constraintName, columnNames));
 }
 public static void AddCheck(this IQuery query, ObjectName tableName, string constraintName, SqlExpression checkExpression)
 {
     query.AddConstraint(tableName, SqlTableConstraint.Check(constraintName, checkExpression));
 }
 public static void AddConstraint(this IQuery query, ObjectName tableName, SqlTableConstraint constraint)
 {
     query.AlterTable(tableName, new AddConstraintAction(constraint));
 }
Exemple #10
0
        private static SqlStatement MakeAlterTableAddConstraint(string tableName, SqlTableConstraint constraint)
        {
            var action = new AddConstraintAction(constraint);

            return(new AlterTableStatement(ObjectName.Parse(tableName), action));
        }
Exemple #11
0
        public SqlTableColumn BuildColumn(ITypeResolver typeResolver, string tableName, IList <SqlTableConstraint> constraints)
        {
            var dataType = DataTypeBuilder.Build(typeResolver, DataType);

            var columnInfo = new SqlTableColumn(ColumnName, dataType);

            if (Default != null)
            {
                columnInfo.DefaultExpression = ExpressionBuilder.Build(Default);
            }

            if (IsIdentity)
            {
                columnInfo.DefaultExpression = SqlExpression.FunctionCall("UNIQUEKEY",
                                                                          new[] { SqlExpression.Constant(tableName) });
                columnInfo.IsIdentity = true;
            }

            foreach (var constraint in Constraints)
            {
                if (String.Equals(ConstraintTypeNames.Check, constraint.ConstraintType, StringComparison.OrdinalIgnoreCase))
                {
                    var exp = ExpressionBuilder.Build(constraint.CheckExpression);
                    constraints.Add(SqlTableConstraint.Check(null, exp));
                }
                else if (String.Equals(ConstraintTypeNames.ForeignKey, constraint.ConstraintType, StringComparison.OrdinalIgnoreCase))
                {
                    var fTable   = constraint.ReferencedTable.Name;
                    var fColumn  = constraint.ReferencedColumn.Text;
                    var onDelete = ForeignKeyAction.NoAction;
                    var onUpdate = ForeignKeyAction.NoAction;

                    if (!String.IsNullOrEmpty(constraint.OnDeleteAction))
                    {
                        onDelete = SqlCodeObjectBuilder.GetForeignKeyAction(constraint.OnDeleteAction);
                    }
                    if (!String.IsNullOrEmpty(constraint.OnUpdateAction))
                    {
                        onUpdate = SqlCodeObjectBuilder.GetForeignKeyAction(constraint.OnUpdateAction);
                    }

                    constraints.Add(SqlTableConstraint.ForeignKey(null, new[] { ColumnName }, fTable, new[] { fColumn }, onDelete, onUpdate));
                }
                else if (String.Equals(ConstraintTypeNames.PrimaryKey, constraint.ConstraintType, StringComparison.OrdinalIgnoreCase))
                {
                    constraints.Add(SqlTableConstraint.PrimaryKey(null, new[] { ColumnName }));
                }
                else if (String.Equals(ConstraintTypeNames.UniqueKey, constraint.ConstraintType, StringComparison.OrdinalIgnoreCase))
                {
                    constraints.Add(SqlTableConstraint.UniqueKey(null, new[] { ColumnName }));
                }
                else if (String.Equals(ConstraintTypeNames.NotNull, constraint.ConstraintType, StringComparison.OrdinalIgnoreCase))
                {
                    columnInfo.IsNotNull = true;
                }
                else if (String.Equals(ConstraintTypeNames.Null, constraint.ConstraintType, StringComparison.OrdinalIgnoreCase))
                {
                    columnInfo.IsNotNull = false;
                }
            }

            return(columnInfo);
        }
        public static SqlTableConstraint Form(PlSqlParser.TableConstraintContext context)
        {
            string constraintName = Name.Simple(context.id());

            ConstraintType type;

            string[] columns  = null;
            string   refTable = null;

            string[]         refColumns = null;
            SqlExpression    checkExp   = null;
            ForeignKeyAction?onDelete   = null;
            ForeignKeyAction?onUpdate   = null;

            if (context.primaryKeyConstraint() != null)
            {
                type = ConstraintType.PrimaryKey;

                columns = context.primaryKeyConstraint().columnList().columnName().Select(Name.Simple).ToArray();
            }
            else if (context.uniqueKeyConstraint() != null)
            {
                type    = ConstraintType.Unique;
                columns = context.uniqueKeyConstraint().columnList().columnName().Select(Name.Simple).ToArray();
            }
            else if (context.checkConstraint() != null)
            {
                type     = ConstraintType.Check;
                checkExp = Expression.Build(context.checkConstraint().expression());
            }
            else if (context.foreignKeyConstraint() != null)
            {
                type       = ConstraintType.ForeignKey;
                columns    = context.foreignKeyConstraint().columns.columnName().Select(Name.Simple).ToArray();
                refColumns = context.foreignKeyConstraint().refColumns.columnName().Select(Name.Simple).ToArray();
                refTable   = Name.Object(context.foreignKeyConstraint().objectName()).ToString();
                var refActions = context.foreignKeyConstraint().referentialAction();
                if (refActions != null && refActions.Length > 0)
                {
                    foreach (var action in refActions)
                    {
                        if (action.onDelete() != null)
                        {
                            var actionType = GetForeignKeyAction(action.onDelete().referentialActionType().GetText());
                            onDelete = actionType;
                        }
                        else if (action.onUpdate() != null)
                        {
                            var actionType = GetForeignKeyAction(action.onUpdate().referentialActionType().GetText());
                            onUpdate = actionType;
                        }
                    }
                }
            }
            else
            {
                throw new ParseCanceledException("Invalid ");
            }

            var constraint = new SqlTableConstraint(constraintName, type, columns);

            if (type == ConstraintType.ForeignKey)
            {
                constraint.ReferenceTable   = refTable;
                constraint.ReferenceColumns = refColumns;
                constraint.OnUpdate         = onUpdate ?? ForeignKeyAction.NoAction;
                constraint.OnDelete         = onDelete ?? ForeignKeyAction.NoAction;
            }
            else if (type == ConstraintType.Check)
            {
                constraint.CheckExpression = checkExp;
            }

            return(constraint);
        }