我有一个使用SQL脚本将更改应用于客户数据库的工具。通常这会调用更改列定义(数据类型等)。问题是,用户通常会使用我们不知道的主键(并且他们不记得),这会使进程启动(例如,在更改属于索引或主键的列时)。
给予我的要求是,这个更新过程应该是“无缝的”,没有人为参与做好准备。我也在这个论坛上对此进行了研究,据我所知,我的特定问题尚未被提出。
我知道如何禁用然后重建数据库上的所有索引,甚至只在某些表中重建这些索引,但如果索引在主键上,我仍然无法更改属于主键的任何列除非我按名称显式删除PK,然后显式重新创建它,这意味着我必须在代码时间知道它。我可以编写一个查询来查找表中主键的名称(如果有),但是如何知道如何重新创建它?
我如何使用Transact-SQL(或PL / SQL)检测,删除然后重新创建给定表上的主键,而无需在代码时知道它们是什么或哪些列属于它们?关键是该工具不能事先知道任何给定表上的主键是什么,也不知道它们包含什么。 SQL代码必须自己处理。
更好的方法是检测已知列是否属于主键,然后删除,稍后在更改列后重新创建该列。
这需要在Oracle和Sql Server中完成,理想情况下完全使用SQL代码。
TIA
答案 0 :(得分:0)
我真的不明白为什么客户会为表定义自己的主键?而且,我不明白你为什么要放他们?在我的世界中,如果客户以任何方式更改架构,这自动意味着终止对它们的支持。
我强烈建议不要在生产数据库上删除和重新创建主键。可能发生任何数量的坏事,导致数据丢失。
它不仅仅是PK,你必须首先删除外键约束。而且FKs不仅可以参考PK,还可以参考独特的约束,所以yao也必须处理这些。
您最好的选择是创建一个包含所需架构的新表,复制数据,删除原始表并重命名新表。当然,你必须处理FK,但它更容易。查看此链接示例:
http://sqlblog.com/blogs/john_paul_cook/archive/2009/09/17/script-to-create-all-foreign-keys.aspx