Add extended properties for MSSQL table and column comments (#464)

This commit is contained in:
moonheart
2025-05-27 23:28:41 +08:00
committed by GitHub
parent 0e45b0ede6
commit 89d4c29076

View File

@@ -1,65 +1,117 @@
import { exportFieldComment, parseDefault } from "./shared"; import { parseDefault, escapeQuotes } from "./shared";
import { dbToTypes } from "../../data/datatypes"; import { dbToTypes } from "../../data/datatypes";
function generateAddExtendedPropertySQL(value, level1name, level2name = null) {
if (!value || value.trim() === "") {
return "";
}
const escapedValue = escapeQuotes(value.replace(/\n/g, " "));
const escapedTableName = escapeQuotes(level1name);
if (level2name) {
const escapedColumnName = escapeQuotes(level2name);
return `
EXEC sys.sp_addextendedproperty
@name=N'MS_Description', @value=N'${escapedValue}',
@level0type=N'SCHEMA',@level0name=N'dbo',
@level1type=N'TABLE',@level1name=N'${escapedTableName}',
@level2type=N'COLUMN',@level2name=N'${escapedColumnName}';
GO
`;
} else {
return `
EXEC sys.sp_addextendedproperty
@name=N'MS_Description', @value=N'${escapedValue}',
@level0type=N'SCHEMA',@level0name=N'dbo',
@level1type=N'TABLE',@level1name=N'${escapedTableName}';
GO
`;
}
}
export function toMSSQL(diagram) { export function toMSSQL(diagram) {
return `${diagram.tables const tablesSql = diagram.tables
.map( .map((table) => {
(table) => const fieldsSql = table.fields
`${ .map(
table.comment === "" ? "" : `/**\n${table.comment}\n*/\n` (field) =>
}CREATE TABLE [${table.name}] (\n${table.fields `\t[${field.name}] ${field.type}${
.map( field.notNull ? " NOT NULL" : ""
(field) => }${field.increment ? " IDENTITY" : ""}${
`${exportFieldComment(field.comment)}\t[${ field.unique ? " UNIQUE" : ""
field.name }${
}] ${field.type}${ field.default !== ""
field.notNull ? " NOT NULL" : "" ? ` DEFAULT ${parseDefault(field, diagram.database)}`
}${field.increment ? " IDENTITY" : ""}${ : ""
field.unique ? " UNIQUE" : "" }${
}${ field.check === "" ||
field.default !== "" !dbToTypes[diagram.database][field.type].hasCheck
? ` DEFAULT ${parseDefault(field, diagram.database)}` ? ""
: "" : ` CHECK(${field.check})`
}${ }`,
field.check === "" || )
!dbToTypes[diagram.database][field.type].hasCheck .join(",\n");
? ""
: ` CHECK(${field.check})` const primaryKeys = table.fields.filter((f) => f.primary);
}`, const primaryKeySql =
) primaryKeys.length > 0
.join(",\n")}${ ? `,\n\tPRIMARY KEY(${primaryKeys
table.fields.filter((f) => f.primary).length > 0 .map((f) => `[${f.name}]`)
? `,\n\tPRIMARY KEY(${table.fields .join(", ")})`
.filter((f) => f.primary) : "";
.map((f) => `[${f.name}]`)
.join(", ")})` const createTableSql = `CREATE TABLE [${
: "" table.name
}\n);\nGO\n${`${table.indices }] (\n${fieldsSql}${primaryKeySql}\n);\nGO\n`;
.map(
(i) => const tableCommentSql = generateAddExtendedPropertySQL(
`\nCREATE ${i.unique ? "UNIQUE " : ""}INDEX [${ table.comment,
i.name table.name,
}]\nON [${table.name}] (${i.fields
.map((f) => `[${f}]`)
.join(", ")});\nGO\n`,
)
.join("")}`}`,
)
.join("\n")}\n${diagram.references
.map((r) => {
const { name: startName, fields: startFields } = diagram.tables.find(
(t) => t.id === r.startTableId,
); );
const { name: endName, fields: endFields } = diagram.tables.find( const columnCommentsSql = table.fields
(t) => t.id === r.endTableId, .map((field) =>
); generateAddExtendedPropertySQL(field.comment, table.name, field.name),
return `ALTER TABLE [${startName}]\nADD FOREIGN KEY([${ )
startFields.find((f) => f.id === r.startFieldId).name .join("");
}]) REFERENCES [${endName}]([${
endFields.find((f) => f.id === r.endFieldId).name const indicesSql = table.indices
}])\nON UPDATE ${r.updateConstraint.toUpperCase()} ON DELETE ${r.deleteConstraint.toUpperCase()};\nGO`; .map(
(i) =>
`\nCREATE ${i.unique ? "UNIQUE " : ""}INDEX [${
i.name
}]\nON [${table.name}] (${i.fields
.map((f) => `[${f}]`)
.join(", ")});\nGO\n`,
)
.join("");
return `${createTableSql}${tableCommentSql}${columnCommentsSql}${indicesSql}`;
}) })
.join("\n")}`; .join("\n");
const referencesSql = diagram.references
.map((r) => {
const startTable = diagram.tables.find((t) => t.id === r.startTableId);
const endTable = diagram.tables.find((t) => t.id === r.endTableId);
if (!startTable || !endTable) return "";
const startField = startTable.fields.find(
(f) => f.id === r.startFieldId,
);
const endField = endTable.fields.find((f) => f.id === r.endFieldId);
if (!startField || !endField) return "";
return `\nALTER TABLE [${startTable.name}]
ADD FOREIGN KEY([${startField.name}])
REFERENCES [${endTable.name}]([${endField.name}])
ON UPDATE ${r.updateConstraint.toUpperCase()} ON DELETE ${r.deleteConstraint.toUpperCase()};
GO`;
})
.join("");
return `${tablesSql}\n${referencesSql}`;
} }