Stored procedures 如何在另一个数据库中创建一个数据库对象';什么是存储过程?
场景是,我有2个数据库。db1和db2。我在db2中有大约45个以上的存储过程,它们与db1中的表连接。我可以通过Stored procedures 如何在另一个数据库中创建一个数据库对象';什么是存储过程?,stored-procedures,sql-server-2008-r2,synonym,object-oriented-database,Stored Procedures,Sql Server 2008 R2,Synonym,Object Oriented Database,场景是,我有2个数据库。db1和db2。我在db2中有大约45个以上的存储过程,它们与db1中的表连接。我可以通过db1.dbo.tablename来完成,但是如果我将db1重命名为db3。所有db2存储过程都失败。我们应该采取什么措施?按照客户的要求,像往常一样,他想重命名db1。在脚本db1到db3中按find replace不是好方法。因为若客户机再次要求将db3数据库重命名为另一个名称,那个么这将是一项长期乏味且不专业的工作。我应该在这里用什么 创建同义词。引用对象中的同义词。如果数据库
db1.dbo.tablename
来完成,但是如果我将db1重命名为db3。所有db2存储过程都失败。我们应该采取什么措施?按照客户的要求,像往常一样,他想重命名db1。在脚本db1到db3中按find replace不是好方法。因为若客户机再次要求将db3数据库重命名为另一个名称,那个么这将是一项长期乏味且不专业的工作。我应该在这里用什么 创建同义词。引用对象中的同义词。如果数据库发生更改,您只需更改每个对象的一个同义词。无法避免更改代码中的逻辑名称,但如果通过同义词控制访问,则只需在一个位置更改它
比如说
没有同义词:
db2中的六个存储过程引用对象db1..Table1
和db1..Table2
将db1
重命名为db7
时,需要更改六个存储过程中的两个对象
同义词:
六个存储过程引用同义词snTable1
和snTable2
(在本地数据库中-注意此处没有数据库引用)
同义词snTable1
指的是db1。Table1
将db1
重命名为db7
时,需要更改两个同义词以指向新数据库。不需要更改存储过程。所有引用同义词的对象仍然有效
这要求您在db2
中创建同义词,指向db1
中的对象,并在db2
中对存储过程进行初始重写,以引用本地同义词,而不是数据库限定的对象。但你还是要这么做,对吗
示例程序
db2
中创建一个名为snTable1的同义词,它引用db1
中的Table1
使用db2
为db1.Table1创建同义词snTable1
snTable1
,而不是db1.Table1
。你只需要做一次。注意:这些存储过程引用的是本地数据库中的对象使用DB2
删除同义词snTable1
为xyz.Table1创建同义词snTable1
db1
,其默认数据库为db1
MyLinkedServer
)db2
中的所有代码,通过该链接服务器使用四部分命名:SELECT*FROM MyLinkedServer…Table1
这只是一个理论,如果它起作用,它的坏习惯。。。比需要重命名数据库更糟糕的做法。但是同义词表示表名而不是数据库名。我说得对吗?是的。您引用了本地数据库中的同义词。此同义词指向的对象可能在另一个数据库中,也可能不在另一个数据库中。在同义词中定义数据库链接,而不是在引用同义词的存储过程中定义数据库链接。请参见上面的示例。没有,但是在db2中使用同义词时,我仍然需要使用db1名称,比如,从db1.dbo.synonym1中选择*。或者希望使用一些可配置的名称,而不是db1.No。您可以在与存储过程相同的数据库中创建同义词。然后,在引用它时,不需要使用DB名称来限定它。创建同义词时,即硬编码数据库名称时。没有办法避免对数据库名称进行硬编码,但可以大大减少需要维护的对象数量。我想我的例子是错误的。我会澄清。请提供参考链接或例子。我找不到。