修改表名后, 如何方便快捷地更新所有的视图,存储过程以及自定义方法。
数据库比较大,根据客户需求把里面的表都按照新的命名规则重命名了,但数据库里面的视图,存储过程以及自定义方法都比较多,而且互相引用嵌套,关系十分复杂,如果一个一个地去修改代码的话,工作量十分庞大,请教各位大神有没有简单可行的解决方案。
[最优解释]
[其他解释]
create view 修改前表名
as
select * from 修改后表名
[其他解释]
改表a名为a_t
建个名为a的视图:select * from a_t
[其他解释]
补充一下问题:所有对数据库的操作都要求用脚本,然后提供脚本给客户去它的服务器上运行脚本,修改数据库。
[其他解释]
表示没懂啊,可有详细说明?
[其他解释]
看看有没有第三方工具协助吧。那个vs的你没用过的话一时半刻说不清楚。red gate看看有没有破解的。
[其他解释]
因为对数据库的所有修改都要提供SQL脚本,所以根据同事的建议,先重命名所有的Table,把重命名前后的Table Name 存放在内存中,通过这些新老Table Name去替换掉视图中所有的Table Name。这个思路是不是看上去很可行啊,于是我花了大半天的时间研究出了以下这段SQL脚本。
想法很好很天真,可到头来替换的时候问题多多,白做了,不得不一个一个地去修改。
各位大神帮我鉴定一下这样的解决方案能行不?
declare @new_table_name varchar(50);
declare @table_name varchar(50);
declare @pre_name varchar(50);
declare @name_record Table(
OldTableName VARCHAR(100),
NewTableName VARCHAR(100)
);
declare table_cursor cursor for
select name from sys.objects where type = 'U' and name like 'AT_%'
open table_cursor
fetch next from table_cursor into @table_name
while @@fetch_status = 0
begin
-- replace table name, eg: 'AT_CRM_Client' -> 'CRM.Client'
set @new_table_name = Replace(Replace(@table_name, 'AT_', ''), '_', '.');
-- eg:CRM -> Crm
set @pre_name = LOWER(Substring(@new_table_name,0,Charindex('.',@new_table_name)));
set @pre_name = STUFF(@pre_name,1,1,UPPER(SUBSTRING(@pre_name,1,1)));
--reorganize table name ge:CRM.Client -> Crm.Client
set @new_table_name = STUFF(@new_table_name,1,Charindex('.',@new_table_name)-1,@pre_name);
--rename all the tables
exec sp_rename @table_name,@new_table_name;
--Save the old table and new table name
Insert @name_record values(@table_name,@new_table_name);
fetch next from table_cursor into @table_name
end
close table_cursor
deallocate table_cursor
--select * from @name_record;
------------------------------
--modify all the views
-------------------------------
declare @view_name VARCHAR(100);
declare @view_text VARCHAR(MAX);
declare view_cursor cursor for
select top 1 name from sys.views
open view_cursor
fetch next from view_cursor into @view_name
while @@FETCH_STATUS = 0
begin
set @view_text = (select top 1 text from syscomments where id = OBJECT_id(@view_name));
-----------------------------------------------------------------
--replace view_text
declare name_record_cursor cursor for select * from @name_record;
open name_record_cursor;
declare @old_name VARCHAR(100);
declare @new_name VARCHAR(100);
fetch next from name_record_cursor into @old_name,@new_name;
while @@FETCH_STATUS = 0
begin
set @view_text = Replace(@view_text, 'dbo.'+@old_name, '[dbo].['+@new_name+'] ')
--print @old_name + @new_name;
fetch next from name_record_cursor into @old_name,@new_name;
end
close name_record_cursor
deallocate name_record_cursor
---------------------------------------------
--replace CREATE to ALTER
set @view_text = Replace(@view_text,'CREATE','ALTER');
--print @view_text;
exec @view_text;
fetch next from view_cursor into @view_name
end
close view_cursor
deallocate view_cursor