private static DataIndexDbDefinition CreateIndexDefinition(ITableDefinition table, TableRelationshipDefinition relationship, string prefix = null)
        {
            var tableName = prefix + table.Name;
            var indexColumns = new[] { relationship.IsManyToMany ? relationship.JoinFieldName : relationship.FKName };
            var filter = relationship.ExcludeRemovedItems ? "([IsRemoved]=(0))" : string.Empty;

            var index = new DataIndexDbDefinition(GetForeignKeyIndexName(tableName, indexColumns), tableName);
            index.IndexFields.AddRange(indexColumns.Select(columnName => new DataIndexFieldDbDefinition(columnName, true)));
            index.FilterDefinition = filter;

            return index;
        }
        /// <summary>
        /// Gets the add foreign key SQL.
        /// </summary>
        /// <param name="table">The table.</param>
        /// <param name="relationship">The relationship.</param>
        /// <param name="prefix">The prefix.</param>
        /// <returns>System.String.</returns>
        protected override string GetAddForeignKeySql(ITableDefinition table, TableRelationshipDefinition relationship, string prefix = null)
        {
            return string.Format(
                @"
IF NOT EXISTS (SELECT 1 FROM sys.foreign_keys WHERE  name = N'{4}{1}')
BEGIN
    ALTER TABLE [{4}{0}] WITH CHECK ADD CONSTRAINT [{4}{1}] FOREIGN KEY([{2}])
    REFERENCES [{3}] ([Id])

    ALTER TABLE [{4}{0}] CHECK CONSTRAINT [{4}{1}]
END
{5}
",
                table.Name,
                relationship.Name,
                relationship.IsManyToMany ? relationship.JoinFieldName : relationship.FKName,
                relationship.FKTableName,
                prefix,
                GenerateCreateIndexIfNotExists(CreateIndexDefinition(table, relationship, prefix)));
        }
        /// <summary>Gets the audit trigger script for multi cr table.</summary>
        /// <param name="table">The table.</param>
        /// <param name="fieldDefinition">The field definition.</param>
        /// <param name="primaryTable">The primary table.</param>
        /// <param name="foreignTable">The foreign table.</param>
        /// <returns></returns>
        private string GetAuditTriggerScriptForMultiCRTable(ITableDefinition table, TableFieldDefinition fieldDefinition, TableRelationshipDefinition primaryTable, TableRelationshipDefinition foreignTable)
        {
            if (fieldDefinition.ReferenceDisplayFields.Any(x =>
                    x.SystemName == fieldDefinition.ReferenceDisplayField
                    && (x.ColumnType == ColumnTypes.MultiReference || x.IsReverseRef)))
                return string.Empty;

            if (string.IsNullOrEmpty(fieldDefinition.ReferenceColumnTable) || string.IsNullOrEmpty(fieldDefinition.ReferencedColumnName))
                return string.Empty;

            var result = string.Format(@"
IF EXISTS (SELECT * FROM sys.triggers WHERE object_id = OBJECT_ID(N'[dbo].[{0}_Audit]'))
	drop trigger [dbo].[{0}_Audit];
GO

CREATE TRIGGER [dbo].[{0}_Audit]
   ON [dbo].[{0}]
   AFTER INSERT,DELETE
AS 
BEGIN
	SET NOCOUNT ON;

	IF NOT EXISTS ( SELECT * FROM INSERTED ) AND NOT EXISTS ( SELECT * FROM DELETED )
		RETURN
", table.Name);

            if (fieldDefinition.ReferenceColumnTable.Equals(fieldDefinition.ReferencedProcessName))
            {
                result += string.Format(@"
	IF NOT EXISTS ( SELECT * FROM INSERTED ) AND EXISTS ( SELECT * FROM DELETED )
	BEGIN
		INSERT INTO audit.[{0}]
		SELECT 
			'D'
			,p.Id
			,'{1}'
			,'Link removed: Process={2}, Id=' + CAST(si.Id AS VARCHAR(10)) + ', ' + CAST(si.[{3}] AS NVARCHAR(MAX))
			,NULL
			,p.LastModifiedOn
			,p.LastModifiedBy 
		FROM DELETED d
		INNER JOIN dbo.{0} p ON p.Id = d.[{4}]
		LEFT OUTER JOIN [{2}] si ON si.Id = d.[{5}]
		RETURN
	END

	IF NOT EXISTS ( SELECT * FROM DELETED )
	BEGIN
		INSERT INTO audit.[{0}]
		SELECT 
			'I'
			,p.[Id]
			,'{1}'
			,NULL
			,'Link added: Process={2}, Id=' + CAST(si.Id AS VARCHAR(10)) + ', ' + CAST(si.[{3}] AS NVARCHAR(MAX))
			,p.LastModifiedOn
			,p.LastModifiedBy 
		FROM INSERTED i
		INNER JOIN dbo.{0} p ON p.Id = i.[{4}]
		LEFT OUTER JOIN [{2}] si ON si.Id = i.[{5}]
		RETURN
	END
END
GO
", primaryTable.FKTableName, fieldDefinition.DisplayName.DoubleSingleQuote(), fieldDefinition.ReferenceColumnTable, fieldDefinition.ReferenceDisplayField, primaryTable.JoinFieldName, foreignTable.JoinFieldName);

            }
            else
            {
                result += string.Format(@"
	IF NOT EXISTS ( SELECT * FROM INSERTED ) AND EXISTS ( SELECT * FROM DELETED )
	BEGIN
		INSERT INTO audit.[{0}]
		SELECT 
			'D'
			,d.{0}Id
			,'{1}'
			,'Link removed: Process={2}, Id=' + CAST(spi.Id AS VARCHAR(10)) + ', ' + CAST(spi.[{3}] AS NVARCHAR(MAX))
			,NULL
			,t.LastModifiedOn
			,t.LastModifiedBy 
		FROM DELETED d
		LEFT OUTER JOIN dbo.{2} p ON p.Id = d.[{5}]
		INNER JOIN [{4}] spi ON spi.Id = p.ParentId
		INNER JOIN dbo.[{0}] t on t.Id = d.{0}Id
		RETURN
	END

	IF NOT EXISTS ( SELECT * FROM DELETED )
	BEGIN
		INSERT INTO audit.[{0}]
		SELECT 
			'I'
			,i.{0}Id
			,'{1}'
			,NULL
			,'Link added: Process={2}, Id=' + CAST(spi.Id AS VARCHAR(10)) + ', ' + CAST(spi.[{3}] AS NVARCHAR(MAX))
			,t.LastModifiedOn
			,t.LastModifiedBy 
		FROM INSERTED i
		LEFT OUTER JOIN dbo.{2} p ON p.Id = i.[{5}]
		INNER JOIN [{4}] spi ON spi.Id = p.ParentId
		INNER JOIN dbo.[{0}] t on t.Id = i.{0}Id
		RETURN
	END
END
GO
", primaryTable.FKTableName, fieldDefinition.DisplayName.DoubleSingleQuote(), foreignTable.FKTableName, fieldDefinition.ReferenceDisplayField, fieldDefinition.ReferenceColumnTable, foreignTable.JoinFieldName);

            }
            return result;
        }
        /// <summary>Gets the audit trigger script for a many to many table.</summary>
        /// <param name="tableName"></param>
        /// <param name="primaryTable"></param>
        /// <param name="foreignTable"></param>
        /// <returns>System.String</returns>
        private string GetAuditTriggerScriptForM2MTable(string tableName, TableRelationshipDefinition primaryTable, TableRelationshipDefinition foreignTable)
        {
            var result = string.Format(@"
IF EXISTS (SELECT * FROM sys.triggers WHERE object_id = OBJECT_ID(N'[dbo].[{0}_Audit]'))
	drop trigger [dbo].[{0}_Audit];
GO

CREATE TRIGGER [dbo].[{0}_Audit]
   ON [dbo].[{0}]
   AFTER INSERT,DELETE
AS 
BEGIN
	SET NOCOUNT ON;

	IF NOT EXISTS ( SELECT * FROM INSERTED ) AND NOT EXISTS ( SELECT * FROM DELETED )
		RETURN

	IF NOT EXISTS ( SELECT * FROM INSERTED ) AND EXISTS ( SELECT * FROM DELETED )
	BEGIN
		INSERT INTO audit.[{1}]
		SELECT 
			'D'
			,d.[{2}]
			,'{3}'
			,'{4} Id=' + CAST(r.Id AS VARCHAR(10))
			,NULL
			,p.LastModifiedOn
			,p.LastModifiedBy 
		FROM DELETED d
		INNER JOIN dbo.{1} p ON p.Id = d.[{2}]
		INNER JOIN dbo.{4} r ON r.Id = d.[{5}]
		RETURN
	END

	IF NOT EXISTS ( SELECT * FROM DELETED )
	BEGIN
		INSERT INTO audit.[{1}]
		SELECT 
			'I'
			,i.[{2}]
			,'{3}'
			,NULL
			,'{4} Id=' + CAST(r.Id AS VARCHAR(10))
			,p.LastModifiedOn
			,p.LastModifiedBy 
		FROM INSERTED i
		INNER JOIN dbo.{1} p ON p.Id = i.[{2}]
		INNER JOIN dbo.{4} r ON r.Id = i.[{5}]
		RETURN
	END
END
GO
"
                , tableName, primaryTable.FKTableName, primaryTable.JoinFieldName, primaryTable.FKName, foreignTable.FKTableName, foreignTable.JoinFieldName);

            return result;
        }
 public void PropertyName_JuskFKName_WhenFKNameHasNoIdSuffix()
 {
     var d = new TableRelationshipDefinition { FKName = "fk" };
     Assert.AreEqual("fk", d.PropertyName);
 }
 public void PropertyName_IsKFNameWithoutIdSuffix()
 {
     var d = new TableRelationshipDefinition { FKName = "fkId" };
     Assert.AreEqual("fk", d.PropertyName);
 }
Пример #7
0
 /// <summary>
 /// Gets the add foreign key SQL.
 /// </summary>
 /// <param name="table">The table.</param>
 /// <param name="relationship">The relationship.</param>
 /// <param name="prefix">The prefix.</param>
 /// <returns>System.String.</returns>
 protected override string GetAddForeignKeySql(ITableDefinition table, TableRelationshipDefinition relationship, string prefix = null)
 {
     return
         string.Format(
             @"ALTER TABLE ""{4}{0}"" ADD CONSTRAINT ""{4}{1}"" FOREIGN KEY(""{2}"") REFERENCES ""{3}"" (""Id"");;",
             OracleNamesTranslator.Translate(table.Name),
             OracleNamesTranslator.Translate(relationship.Name),
             relationship.IsManyToMany ? OracleNamesTranslator.Translate(relationship.JoinFieldName) : OracleNamesTranslator.Translate(relationship.FKName),
             OracleNamesTranslator.Translate(relationship.FKTableName),
             OracleNamesTranslator.TranslatePrefix(prefix));
 }
Пример #8
0
 protected override string GetAddForeignKeySql(ITableDefinition table, TableRelationshipDefinition relationship, string prefix = null)
 {
     reportMethodCalled();
     return string.Empty;
 }
Пример #9
0
 /// <summary>
 /// Gets the add foreign key SQL.
 /// </summary>
 /// <param name="table">The table.</param>
 /// <param name="relationship">The relationship.</param>
 /// <param name="prefix">The prefix.</param>
 /// <returns>System.String.</returns>
 protected abstract string GetAddForeignKeySql(ITableDefinition table, TableRelationshipDefinition relationship, string prefix = null);