生成数据库表差异脚本接口

master
xiaochanghai 8 months ago
parent 0d4cc01e94
commit 5f67f27b75
  1. 6
      Model/Tiobon.Web.pdm
  2. 173
      Tiobon.Core.Api/Controllers/CommonController.cs

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<?PowerDesigner AppLocale="UTF16" ID="{C294868A-C3F3-41AD-98CC-78B6D4E0CC40}" Label="" LastModificationDate="1730947770" Name="Tiobon" Objects="2235" Symbols="85" Target="Microsoft SQL Server 2008" Type="{CDE44E21-9669-11D1-9914-006097355D9B}" signature="PDM_DATA_MODEL_XML" version="15.0.0.2613"?>
<?PowerDesigner AppLocale="UTF16" ID="{C294868A-C3F3-41AD-98CC-78B6D4E0CC40}" Label="" LastModificationDate="1730947816" Name="Tiobon" Objects="2235" Symbols="85" Target="Microsoft SQL Server 2008" Type="{CDE44E21-9669-11D1-9914-006097355D9B}" signature="PDM_DATA_MODEL_XML" version="15.0.0.2613"?>
<!-- do not edit this file -->
<Model xmlns:a="attribute" xmlns:c="collection" xmlns:o="object">
@ -26729,11 +26729,11 @@ LABL 0 Arial Unicode MS,8,N</a:FontList>
</o:Column>
<o:Column Id="o1295">
<a:ObjectID>11CD542D-061E-4B85-A96B-7A0543F3C4AE</a:ObjectID>
<a:Name>岗位ID1</a:Name>
<a:Name>岗位</a:Name>
<a:Code>TitleId</a:Code>
<a:CreationDate>1721353940</a:CreationDate>
<a:Creator>Administrator</a:Creator>
<a:ModificationDate>1730947751</a:ModificationDate>
<a:ModificationDate>1730947816</a:ModificationDate>
<a:Modifier>Administrator</a:Modifier>
<a:Comment>岗位ID</a:Comment>
<a:DataType>nvarchar(2000)</a:DataType>

@ -191,7 +191,9 @@ public class CommonController : BaseApiController
D.IS_NULLABLE,
D.data_type COLUMN_TYPE,
E.name AS ConstraintName,
E.definition AS COLUMN_DEFAULT
E.definition AS COLUMN_DEFAULT,
A.object_id,
B.object_id
FROM sys.columns A
LEFT JOIN sys.tables B ON A.object_id = B.object_id
LEFT JOIN sys.extended_properties C
@ -200,7 +202,8 @@ FROM sys.columns A
ON D.column_name = A.name AND D.TABLE_NAME = B.[name]
LEFT JOIN sys.default_constraints E
ON E.parent_object_id = A.object_id
AND E.parent_column_id = A.column_id";
AND E.parent_column_id = A.column_id
WHERE B.name IS NOT NULL";
#region step 1.1 加载表结构
// 源数据库
@ -357,7 +360,7 @@ FROM sys.columns A
#region 2.2 生成需要创建的表
bool b_hasConetnt = false;
sb.AppendLine("SET FOREIGN_KEY_CHECKS = 0;\r\n");
//sb.AppendLine("SET FOREIGN_KEY_CHECKS = 0;\r\n");
var temp = except.Select(o => o.TableName).Distinct();
Console.WriteLine("", $"字段不同数量为 {except.Count}");
var sTempNames = srcCloumns.Select(o => o.TableName);
@ -371,54 +374,98 @@ FROM sys.columns A
{
string sql1 = @$"DECLARE @TableName NVARCHAR(128) = '{tname}';
DECLARE @SQL NVARCHAR(MAX);
DECLARE @SQL NVARCHAR (MAX);
--
SET @SQL = 'CREATE TABLE ' + @TableName + ' (' + CHAR(13) + CHAR(10);
SET @SQL = 'CREATE TABLE ' + @TableName + ' (' + CHAR (13) + CHAR (10);
--
SELECT @SQL = @SQL +
' ' + c.name + ' ' +
t.name +
CASE
WHEN t.name IN ('nvarchar', 'varchar', 'char', 'nchar') THEN '(' + CAST(c.max_length AS NVARCHAR(10)) + ')'
WHEN t.name IN ('decimal', 'numeric') THEN '(' + CAST(c.precision AS NVARCHAR(10)) + ', ' + CAST(c.scale AS NVARCHAR(10)) + ')'
ELSE ''
END +
CASE
WHEN c.is_nullable = 0 THEN ' NOT NULL'
ELSE ' NULL'
END +
CASE
WHEN ep.value IS NOT NULL THEN ' -- ' + CAST(ep.value AS NVARCHAR(MAX))
ELSE ''
END + ',' + CHAR(13) + CHAR(10)
FROM
sys.columns c
INNER JOIN
sys.types t ON c.user_type_id = t.user_type_id
LEFT JOIN
sys.extended_properties ep ON ep.major_id = c.object_id AND ep.minor_id = c.column_id AND ep.class = 1
WHERE
c.object_id = OBJECT_ID(@TableName);
SELECT @SQL =
@SQL
+ ' '
+ c.name
+ ' '
+ t.name
+ CASE
WHEN t.name IN ('nvarchar',
'varchar',
'char',
'nchar')
THEN
'('
+ CASE
WHEN c.max_length = -1 THEN 'max'
ELSE CAST (c.max_length AS NVARCHAR (10))
END
+ ')'
WHEN t.name IN ('decimal', 'numeric')
THEN
'('
+ CAST (c.precision AS NVARCHAR (10))
+ ', '
+ CAST (c.scale AS NVARCHAR (10))
+ ')'
ELSE
''
END
+ CASE WHEN c.is_nullable = 0 THEN ' NOT NULL' ELSE ' NULL' END
+ CASE
WHEN E.definition IS NOT NULL
THEN
' default '
+ REPLACE
(
REPLACE
(CAST (E.definition AS NVARCHAR (MAX)), ')', ''),
'(',
'')
ELSE
''
END
+ ','
+ CASE
WHEN ep.value IS NOT NULL
THEN
' -- ' + CAST (ep.value AS NVARCHAR (MAX))
ELSE
''
END
+ CHAR (13)
+ CHAR (10)
FROM sys.columns c
INNER JOIN sys.types t ON c.user_type_id = t.user_type_id
LEFT JOIN sys.extended_properties ep
ON ep.major_id = c.object_id
AND ep.minor_id = c.column_id
AND ep.class = 1
LEFT JOIN sys.default_constraints E
ON E.parent_object_id = c.object_id
AND E.parent_column_id = c.column_id
WHERE c.object_id = OBJECT_ID (@TableName);
--
SET @SQL = LEFT(@SQL, LEN(@SQL) - 2);
SET @SQL = LEFT (@SQL, LEN (@SQL) - 2);
--
SELECT @SQL = @SQL + CHAR(13) + CHAR(10) +
' CONSTRAINT PK_' + @TableName + ' PRIMARY KEY (' +
COL_NAME(ic.object_id, ic.column_id) + ')' + CHAR(13) + CHAR(10) +
')'
FROM
sys.indexes i
INNER JOIN
sys.index_columns ic ON i.object_id = ic.object_id AND i.index_id = ic.index_id
WHERE
i.object_id = OBJECT_ID(@TableName) AND i.is_primary_key = 1;
SELECT @SQL =
@SQL
+ CHAR (13)
+ CHAR (10)
+ ' CONSTRAINT PK_'
+ @TableName
+ ' PRIMARY KEY ('
+ COL_NAME (ic.object_id, ic.column_id)
+ ')'
+ CHAR (13)
+ CHAR (10)
+ ')'
FROM sys.indexes i
INNER JOIN sys.index_columns ic
ON i.object_id = ic.object_id AND i.index_id = ic.index_id
WHERE i.object_id = OBJECT_ID (@TableName) AND i.is_primary_key = 1;
-- SQL
select @SQL SQL ;";
SELECT @SQL SQL;";
DataTable ds = DbAccess.GetDataTable(sql1);
if (ds.Rows.Count > 0)
{
@ -444,7 +491,7 @@ select @SQL SQL ;";
deleteTablesNames.ForEach(tname =>
{
b_hasConetnt = true;
sb.AppendLine($"DROP TABLE `{tname}`;\r\n");
sb.AppendLine($"DROP TABLE {tname};\r\n");
Console.WriteLine("", $"生成表[{tname}]删除语句");
});
Console.WriteLine("", $"生成需要删除的表完毕");
@ -470,7 +517,7 @@ select @SQL SQL ;";
//sb.AppendLine($"ALTER TABLE `hdis`.`{t.TableName}`" +
// $" ADD COLUMN `{t.ColumnName}` {t.DataType}{GetCharacter_Set_Name(t.CharacterSet)}{GetCollate(t.Collsion)}{GetNull(t.Null)}{GetDefaultValue(t.DefaultValue, t.DataType)};\r\n");
sb.AppendLine($"ALTER TABLE [{t.TableName}] ADD [{t.ColumnName}] {t.DataType} NULL");
sb.AppendLine($"ALTER TABLE [{t.TableName}] ADD [{t.ColumnName}] {t.DataType} NULL;\r\n");
//ALTER TABLE[dbo].[Ghre_StudyRule] ADD[Column_42] int NOT NULL DEFAULT 1
});
#endregion
@ -492,24 +539,40 @@ select @SQL SQL ;";
//if (!string.IsNullOrEmpty(forignKey)) sb.AppendLine(forignKey);
//if (!string.IsNullOrEmpty(indexs)) sb.AppendLine(indexs);
sb.AppendLine($"ALTER TABLE [dbo].[`{t.TableName}`] DROP COLUMN `{t.ColumnName}`;\r\n");
sb.AppendLine($"ALTER TABLE [{t.TableName}] DROP COLUMN {t.ColumnName};\r\n");
//ALTER TABLE [dbo].[Ghre_StudyRule] DROP COLUMN [IsDeptLower]
deletedColumns.Add((t.TableName, t.ColumnName));
});
#endregion
#region 2.4.3 修改列语句
//except
//.Where(t => t.TableName == o && srcCloumns.Where(p => p.TableName == o).Select(p => p.ColumnName).ToList().Contains(t.ColumnName)
// && desrcCloumns.Where(p => p.TableName == o).Select(p => p.ColumnName).ToList().Contains(t.ColumnName))
// .ToList()
//.ForEach(t =>
//{
// b_hasConetnt = true;
// string renovate = RenovateNotNull("hdis", t.TableName, t.ColumnName, t.Null, t.DefaultValue, t.DataType);
// sb.AppendLine(renovate);
// sb.AppendLine($"ALTER TABLE `hdis`.`{t.TableName}` CHANGE `{t.ColumnName}` `{t.ColumnName}` {t.DataType}{GetCharacter_Set_Name(t.CharacterSet)}{GetCollate(t.Collsion)}{GetNull(t.Null)}{GetDefaultValue(t.DefaultValue, t.DataType)};\r\n");
//});
except
.Where(t => t.TableName == o && srcCloumns.Where(p => p.TableName == o).Select(p => p.ColumnName).ToList().Contains(t.ColumnName)
&& desrcCloumns.Where(p => p.TableName == o).Select(p => p.ColumnName).ToList().Contains(t.ColumnName))
.ToList()
.ForEach(t =>
{
b_hasConetnt = true;
var old = desrcCloumns.Where(x => x.TableName == t.TableName && x.ColumnName == t.ColumnName).FirstOrDefault();
if (old != null && old.DataType != t.DataType)
{
if (t.DataType == "varchar")
{
sb.AppendLine($"ALTER TABLE [dbo].[{t.TableName}]");
sb.AppendLine($"ALTER COLUMN [{t.ColumnName}] {t.DataType} COLLATE Chinese_PRC_CI_AS;\r\n");
}else if (t.DataType == "date" || t.DataType == "datetime" || t.DataType == "datet"|| t.DataType == "bigint" || t.DataType == "int")
{
sb.AppendLine($"ALTER TABLE [dbo].[{t.TableName}]");
sb.AppendLine($"ALTER COLUMN [{t.ColumnName}] {t.DataType};\r\n");
}
}
//string renovate = RenovateNotNull("hdis", t.TableName, t.ColumnName, t.Null, t.DefaultValue, t.DataType);
//sb.AppendLine(renovate);
//sb.AppendLine($"ALTER TABLE `hdis`.`{t.TableName}` CHANGE `{t.ColumnName}` `{t.ColumnName}` {t.DataType}{GetCharacter_Set_Name(t.CharacterSet)}{GetCollate(t.Collsion)}{GetNull(t.Null)}{GetDefaultValue(t.DefaultValue, t.DataType)};\r\n");
});
#endregion
});
Console.WriteLine("", $"生成需要删除的表完毕");

Loading…
Cancel
Save