有没有指代一个数据库的同义词?
sql2005开始有“同义词”指代一个表、视图了,但是它必须明确到最具体的对象
如果想指代一个库,能不能做到呢?
比如,指明curdb指代xxx_2013,那么,所有使用“xxx_2013.dbo.任何表或视图”的地方,都可以写为“curdb.dbo.任何表或视图”
这有什么好处呢?
如果明年了,本来n个使用到xxx_2013的地方,都要逐一改为xxx_2014了
现在只需要改一个地方,让curdb指代xxx_2014,具体使用的n个地方都无须修改了!
(有些系统是每年建一个库的,如用友)
如果没有数据库的同义词,而使用现有的同义词,相当于需要 为每个表或视图都分别建立同义词了,显然麻烦很多
------解决方案--------------------看了一下联机丛书,同义词只到架构级别,导不了数据库级别。或者你的库命名可以使用一定的“规则”来实现咯,比如xxx+'当年日期'
------解决方案--------------------可不可以用linkedserver
------解决方案--------------------你可以批量改脚本,然后一次执行就可以了,使用sys.sql_modules查找定义,然后替换数据库名称。
------解决方案--------------------使用链接服务器就可以,引用technet文档的说明这样:
例如,名为 Server1 的服务器上有 AdventureWorks2008R2 示例数据库的 Employee 表。若要从另一服务器 Server2 引用此表,则客户端应用程序必须使用由四个部分构成的名称 Server1.AdventureWorks.HumanResources.Employee。另外,如果更改表的位置(例如,更改为另一服务器),则必须修改客户端应用程序以反映此更改。
若要解决这两个问题,您可以在 Server2 上为 Server1 上的 Employee 表创建一个同义词 EmpTable。这样,客户端应用程序只需使用由一个部分构成的名称 EmpTable 来引用 Employee 表。另外,如果 Employee 表的位置发生变化,则必须修改同义词 EmpTable 以指向 Employee 表的新位置。由于不存在 ALTER SYNONYM 语句,因此必须首先删除同义词 EmpTable,然后重新创建同名的同义词,但是要将同义词指向Employee 的新位置。
http://technet.microsoft.com/zh-cn/library/ms187552(v=sql.105).aspx
------解决方案--------------------sql、视图、存储过程全部统一到存储过程
然后存储过程用动态写法(根据哭的命名规则动态找出库和表),可以作到只修改一次