Ejemplo n.º 1
0
        protected virtual void WritePrimaryKeyConstraintScriptFragment(
            StringBuilder sb,
            PrimaryKeyMold primaryKey)
        {
            var decoratedConstraintName = this.Dialect.DecorateIdentifier(
                DbIdentifierType.Constraint,
                primaryKey.Name,
                this.CurrentOpeningIdentifierDelimiter);

            sb.Append($"CONSTRAINT {decoratedConstraintName} PRIMARY KEY(");
            this.WriteDecoratedIndexColumnsOverCommaScriptFragment(sb, primaryKey.Columns);
            sb.Append(")");
        }
Ejemplo n.º 2
0
        public override PrimaryKeyMold GetPrimaryKey()
        {
            using (var command = this.Connection.CreateCommand())
            {
                // get PK name
                command.CommandText =
                    @"
SELECT
    TC.constraint_name
FROM
    information_schema.table_constraints TC
WHERE
    TC.table_name = @p_tableName
    AND
    TC.constraint_type = 'PRIMARY KEY'";

                var parameter = command.CreateParameter();
                parameter.ParameterName = "p_tableName";
                parameter.Value         = this.TableName;
                command.Parameters.Add(parameter);

                var constraintName = (string)command.ExecuteScalar();

                if (constraintName == null)
                {
                    return(null);
                }

                // get PK columns
                command.Parameters.Clear();
                command.CommandText =
                    @"

SELECT
    I.[index_id]            IndexId,
    I.[name]                IndexName,
    IC.[key_ordinal]        KeyOrdinal,
    C.[name]                ColumnName,
    IC.[is_descending_key]  IsDescendingKey
FROM
    sys.indexes I
INNER JOIN
    sys.index_columns IC
ON
    IC.[index_id] = I.[index_id]
    AND
    IC.[object_id] = i.[object_id]
INNER JOIN
    sys.columns C
ON
    C.[column_id] = IC.[column_id]
    AND
    C.[object_id] = IC.[object_id]
INNER JOIN
    sys.tables T
ON
    T.[object_id] = c.[object_id]
WHERE
    I.[name] = @p_constraintName AND
    T.[name] = @p_tableName
ORDER BY
    IC.[key_ordinal]
";
                command.AddParameterWithValue("p_constraintName", constraintName);
                command.AddParameterWithValue("p_tableName", this.TableName);


                var columns = DbUtils
                              .GetCommandRows(command)
                              .Select(x => new IndexColumnMold
                {
                    Name          = (string)x.ColumnName,
                    SortDirection = (bool)x.IsDescendingKey ? SortDirection.Descending : SortDirection.Ascending,
                })
                              .ToList();

                var primaryKeyMold = new PrimaryKeyMold
                {
                    Name    = constraintName,
                    Columns = columns,
                };

                return(primaryKeyMold);
            }
        }