PageRenderTime 53ms CodeModel.GetById 24ms RepoModel.GetById 0ms app.codeStats 0ms

/src/FluentMigrator.Runner/Generators/SqlServer/SqlServer2005Generator.cs

https://github.com/timosaikkonen/fluentmigrator
C# | 327 lines | 256 code | 55 blank | 16 comment | 9 complexity | a52287e2e218949dafe60c4322663fc8 MD5 | raw file
  1. #region License
  2. //
  3. // Copyright (c) 2010, Nathan Brown
  4. //
  5. // Licensed under the Apache License, Version 2.0 (the "License");
  6. // you may not use this file except in compliance with the License.
  7. // You may obtain a copy of the License at
  8. //
  9. // http://www.apache.org/licenses/LICENSE-2.0
  10. //
  11. // Unless required by applicable law or agreed to in writing, software
  12. // distributed under the License is distributed on an "AS IS" BASIS,
  13. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  14. // See the License for the specific language governing permissions and
  15. // limitations under the License.
  16. //
  17. #endregion
  18. using System.Text;
  19. namespace FluentMigrator.Runner.Generators.SqlServer
  20. {
  21. using System;
  22. using System.Collections.Generic;
  23. using System.Linq;
  24. using FluentMigrator.Expressions;
  25. using FluentMigrator.Model;
  26. public class SqlServer2005Generator : SqlServer2000Generator
  27. {
  28. public SqlServer2005Generator()
  29. : base(new SqlServerColumn(new SqlServer2005TypeMap()))
  30. {
  31. }
  32. protected SqlServer2005Generator(IColumn column)
  33. : base(column)
  34. {
  35. }
  36. public override string CreateTable { get { return "{0} ({1})"; } }
  37. public override string DropTable { get { return "{0}"; } }
  38. public override string AddColumn { get { return "{0} ADD {1}"; } }
  39. public override string AlterColumn { get { return "{0} ALTER COLUMN {1}"; } }
  40. public override string RenameColumn { get { return "{0}.{1}', '{2}'"; } }
  41. public override string RenameTable { get { return "{0}', '{1}'"; } }
  42. public override string CreateIndex { get { return "CREATE {0}{1}INDEX {2} ON {3}.{4} ({5})"; } }
  43. public override string DropIndex { get { return "DROP INDEX {0} ON {1}.{2}"; } }
  44. public override string InsertData { get { return "INSERT INTO {0}.{1} ({2}) VALUES ({3})"; } }
  45. public override string UpdateData { get { return "{0} SET {1} WHERE {2}"; } }
  46. public override string DeleteData { get { return "DELETE FROM {0}.{1} WHERE {2}"; } }
  47. public override string IdentityInsert { get { return "SET IDENTITY_INSERT {0}.{1} {2}"; } }
  48. public override string CreateForeignKeyConstraint { get { return "ALTER TABLE {0}.{1} ADD CONSTRAINT {2} FOREIGN KEY ({3}) REFERENCES {4}.{5} ({6}){7}{8}"; } }
  49. public override string CreateConstraint { get { return "{0} ADD CONSTRAINT {1} {2}{3} ({4})"; } }
  50. public override string DeleteConstraint { get { return "{0} DROP CONSTRAINT {1}"; } }
  51. public override string Generate(CreateTableExpression expression)
  52. {
  53. return string.Format("CREATE TABLE {0}.{1}", Quoter.QuoteSchemaName(expression.SchemaName), base.Generate(expression));
  54. }
  55. public override string Generate(DeleteTableExpression expression)
  56. {
  57. return string.Format("DROP TABLE {0}.{1}", Quoter.QuoteSchemaName(expression.SchemaName), base.Generate(expression));
  58. }
  59. public override string Generate(CreateColumnExpression expression)
  60. {
  61. return string.Format("ALTER TABLE {0}.{1}", Quoter.QuoteSchemaName(expression.SchemaName), base.Generate(expression));
  62. }
  63. public override string Generate(AlterColumnExpression expression)
  64. {
  65. return string.Format("ALTER TABLE {0}.{1}", Quoter.QuoteSchemaName(expression.SchemaName), base.Generate(expression));
  66. }
  67. public override string Generate(RenameColumnExpression expression)
  68. {
  69. return string.Format("sp_rename '{0}.{1}", Quoter.QuoteSchemaName(expression.SchemaName), base.Generate(expression));
  70. }
  71. public override string Generate(RenameTableExpression expression)
  72. {
  73. return string.Format("sp_rename '{0}.{1}", Quoter.QuoteSchemaName(expression.SchemaName), base.Generate(expression));
  74. }
  75. public override string Generate(UpdateDataExpression expression)
  76. {
  77. return string.Format("UPDATE {0}.{1}", Quoter.QuoteSchemaName(expression.SchemaName), base.Generate(expression));
  78. }
  79. public override string Generate(DeleteDataExpression expression)
  80. {
  81. var deleteItems = new List<string>();
  82. if (expression.IsAllRows)
  83. {
  84. deleteItems.Add(string.Format(DeleteData, Quoter.QuoteSchemaName(expression.SchemaName), Quoter.QuoteTableName(expression.TableName), "1 = 1"));
  85. }
  86. else
  87. {
  88. foreach (var row in expression.Rows)
  89. {
  90. var whereClauses = new List<string>();
  91. foreach (KeyValuePair<string, object> item in row)
  92. {
  93. whereClauses.Add(string.Format("{0} {1} {2}", Quoter.QuoteColumnName(item.Key), item.Value == null ? "IS" : "=", Quoter.QuoteValue(item.Value)));
  94. }
  95. deleteItems.Add(string.Format(DeleteData, Quoter.QuoteSchemaName(expression.SchemaName), Quoter.QuoteTableName(expression.TableName), String.Join(" AND ", whereClauses.ToArray())));
  96. }
  97. }
  98. return String.Join("; ", deleteItems.ToArray());
  99. }
  100. public override string Generate(DeleteForeignKeyExpression expression)
  101. {
  102. return string.Format("ALTER TABLE {0}.{1}", Quoter.QuoteSchemaName(expression.ForeignKey.ForeignTableSchema), base.Generate(expression));
  103. }
  104. public override string Generate(InsertDataExpression expression)
  105. {
  106. List<string> columnNames = new List<string>();
  107. List<string> columnValues = new List<string>();
  108. List<string> insertStrings = new List<string>();
  109. if (IsUsingIdentityInsert(expression))
  110. {
  111. insertStrings.Add(string.Format(IdentityInsert,
  112. Quoter.QuoteSchemaName(expression.SchemaName),
  113. Quoter.QuoteTableName(expression.TableName),
  114. "ON"));
  115. }
  116. foreach (InsertionDataDefinition row in expression.Rows)
  117. {
  118. columnNames.Clear();
  119. columnValues.Clear();
  120. foreach (KeyValuePair<string, object> item in row)
  121. {
  122. columnNames.Add(Quoter.QuoteColumnName(item.Key));
  123. columnValues.Add(Quoter.QuoteValue(item.Value));
  124. }
  125. string columns = String.Join(", ", columnNames.ToArray());
  126. string values = String.Join(", ", columnValues.ToArray());
  127. insertStrings.Add(String.Format(InsertData
  128. , Quoter.QuoteSchemaName(expression.SchemaName)
  129. , Quoter.QuoteTableName(expression.TableName)
  130. , columns
  131. , values));
  132. }
  133. if (IsUsingIdentityInsert(expression))
  134. {
  135. insertStrings.Add(string.Format(IdentityInsert,
  136. Quoter.QuoteSchemaName(expression.SchemaName),
  137. Quoter.QuoteTableName(expression.TableName),
  138. "OFF"));
  139. }
  140. return String.Join("; ", insertStrings.ToArray());
  141. }
  142. public override string Generate(CreateForeignKeyExpression expression)
  143. {
  144. if (expression.ForeignKey.PrimaryColumns.Count != expression.ForeignKey.ForeignColumns.Count)
  145. {
  146. throw new ArgumentException("Number of primary columns and secondary columns must be equal");
  147. }
  148. List<string> primaryColumns = new List<string>();
  149. List<string> foreignColumns = new List<string>();
  150. foreach (var column in expression.ForeignKey.PrimaryColumns)
  151. {
  152. primaryColumns.Add(Quoter.QuoteColumnName(column));
  153. }
  154. foreach (var column in expression.ForeignKey.ForeignColumns)
  155. {
  156. foreignColumns.Add(Quoter.QuoteColumnName(column));
  157. }
  158. return string.Format(
  159. CreateForeignKeyConstraint,
  160. Quoter.QuoteSchemaName(expression.ForeignKey.ForeignTableSchema),
  161. Quoter.QuoteTableName(expression.ForeignKey.ForeignTable),
  162. Quoter.QuoteColumnName(expression.ForeignKey.Name),
  163. String.Join(", ", foreignColumns.ToArray()),
  164. Quoter.QuoteSchemaName(expression.ForeignKey.PrimaryTableSchema),
  165. Quoter.QuoteTableName(expression.ForeignKey.PrimaryTable),
  166. String.Join(", ", primaryColumns.ToArray()),
  167. FormatCascade("DELETE", expression.ForeignKey.OnDelete),
  168. FormatCascade("UPDATE", expression.ForeignKey.OnUpdate)
  169. );
  170. }
  171. public override string Generate(CreateIndexExpression expression)
  172. {
  173. string[] indexColumns = new string[expression.Index.Columns.Count];
  174. IndexColumnDefinition columnDef;
  175. for (int i = 0; i < expression.Index.Columns.Count; i++)
  176. {
  177. columnDef = expression.Index.Columns.ElementAt(i);
  178. if (columnDef.Direction == Direction.Ascending)
  179. {
  180. indexColumns[i] = Quoter.QuoteColumnName(columnDef.Name) + " ASC";
  181. }
  182. else
  183. {
  184. indexColumns[i] = Quoter.QuoteColumnName(columnDef.Name) + " DESC";
  185. }
  186. }
  187. return String.Format(CreateIndex
  188. , GetUniqueString(expression)
  189. , GetClusterTypeString(expression)
  190. , Quoter.QuoteIndexName(expression.Index.Name)
  191. , Quoter.QuoteSchemaName(expression.Index.SchemaName)
  192. , Quoter.QuoteTableName(expression.Index.TableName)
  193. , String.Join(", ", indexColumns));
  194. }
  195. public override string Generate(DeleteIndexExpression expression)
  196. {
  197. return String.Format(DropIndex, Quoter.QuoteIndexName(expression.Index.Name), Quoter.QuoteSchemaName(expression.Index.SchemaName), Quoter.QuoteTableName(expression.Index.TableName));
  198. }
  199. protected override void BuildDelete(DeleteColumnExpression expression, string columnName, StringBuilder builder)
  200. {
  201. builder.AppendLine(Generate(new DeleteDefaultConstraintExpression {
  202. ColumnName = columnName,
  203. SchemaName = expression.SchemaName,
  204. TableName = expression.TableName
  205. }));
  206. builder.AppendLine();
  207. builder.AppendLine(String.Format("-- now we can finally drop column\r\nALTER TABLE {2}.{0} DROP COLUMN {1};",
  208. Quoter.QuoteTableName(expression.TableName),
  209. Quoter.QuoteColumnName(columnName),
  210. Quoter.QuoteSchemaName(expression.SchemaName)));
  211. }
  212. public override string Generate(AlterDefaultConstraintExpression expression)
  213. {
  214. // before we alter a default constraint on a column, we have to drop any default value constraints in SQL Server
  215. var builder = new StringBuilder();
  216. builder.AppendLine(Generate(new DeleteDefaultConstraintExpression
  217. {
  218. ColumnName = expression.ColumnName,
  219. SchemaName = expression.SchemaName,
  220. TableName = expression.TableName
  221. }));
  222. builder.AppendLine();
  223. builder.Append(String.Format("-- create alter table command to create new default constraint as string and run it\r\nALTER TABLE {3}.{0} WITH NOCHECK ADD CONSTRAINT {4} DEFAULT({2}) FOR {1};",
  224. Quoter.QuoteTableName(expression.TableName),
  225. Quoter.QuoteColumnName(expression.ColumnName),
  226. Quoter.QuoteValue(expression.DefaultValue),
  227. Quoter.QuoteSchemaName(expression.SchemaName),
  228. Quoter.QuoteConstraintName(SqlServerColumn.GetDefaultConstraintName(expression.TableName, expression.ColumnName))));
  229. return builder.ToString();
  230. }
  231. public override string Generate(CreateConstraintExpression expression)
  232. {
  233. return string.Format("ALTER TABLE {0}.{1}", Quoter.QuoteSchemaName(expression.Constraint.SchemaName), base.Generate(expression));
  234. }
  235. public override string Generate(DeleteDefaultConstraintExpression expression)
  236. {
  237. const string sql =
  238. "DECLARE @default sysname, @sql nvarchar(max);\r\n\r\n" +
  239. "-- get name of default constraint\r\n" +
  240. "SELECT @default = name\r\n" +
  241. "FROM sys.default_constraints\r\n" +
  242. "WHERE parent_object_id = object_id('{2}.{0}')\r\n" + "" +
  243. "AND type = 'D'\r\n" + "" +
  244. "AND parent_column_id = (\r\n" + "" +
  245. "SELECT column_id\r\n" +
  246. "FROM sys.columns\r\n" +
  247. "WHERE object_id = object_id('{2}.{0}')\r\n" +
  248. "AND name = '{1}'\r\n" +
  249. ");\r\n\r\n" +
  250. "-- create alter table command to drop contraint as string and run it\r\n" +
  251. "SET @sql = N'ALTER TABLE {2}.{0} DROP CONSTRAINT ' + @default;\r\n" +
  252. "EXEC sp_executesql @sql;";
  253. return String.Format(sql, Quoter.QuoteTableName(expression.TableName), expression.ColumnName, Quoter.QuoteSchemaName(expression.SchemaName));
  254. }
  255. public override string Generate(DeleteConstraintExpression expression)
  256. {
  257. return string.Format("ALTER TABLE {0}.{1}", Quoter.QuoteSchemaName(expression.Constraint.SchemaName), base.Generate(expression));
  258. }
  259. public override string Generate(CreateSchemaExpression expression)
  260. {
  261. return String.Format(CreateSchema, Quoter.QuoteSchemaName(expression.SchemaName));
  262. }
  263. public override string Generate(DeleteSchemaExpression expression)
  264. {
  265. return String.Format(DropSchema, Quoter.QuoteSchemaName(expression.SchemaName));
  266. }
  267. public override string Generate(AlterSchemaExpression expression)
  268. {
  269. return String.Format(AlterSchema, Quoter.QuoteSchemaName(expression.DestinationSchemaName), Quoter.QuoteSchemaName(expression.SourceSchemaName), Quoter.QuoteTableName(expression.TableName));
  270. }
  271. }
  272. }