2017-02-17 2 views
0

У меня есть приложение, которое я использую для подключения к двум различным базам данных, которые имеют синхронизированные хранимые процедуры и прочее помимо данных. В настоящее время эти два разных сервера, но я хочу привести их в один и переименовать базы данных. Но у меня есть небольшая проблема, где мои хранимые процедуры ссылки на базы данных, например,Как ссылаться на имя базы данных в хранимых процедурах?

выберите * из DatabaseA.Table1

Я хочу, чтобы управлять базой данных из конфигурации приложения, так что я просто изменить строку подключения ,

<add key="DatabaseName" value="DatabaseA"/> 
    or 
<add key="DatabaseName" value="DatabaseB"/> 
+2

Не знаю, насколько я понимаю, но, похоже, здесь могут помочь синонимы (от DatabaseA, указывающие на объекты в DatabaseB и наоборот). – dean

+0

Да, изменение работы соединения, но некоторые из хранимых процедур завершаются с ошибкой, потому что его ссылка в тех случаях, где пункты – CodeBox

+1

Вы отметили свою очередь с двумя системами управления базами данных: SQL Server и MySQL. Вы фактически используете оба из них? –

ответ

-1

Что я сделал в прошлом, является следующее:

CREATE PROCEDURE test 
    @dbName varchar(150) 
AS 
BEGIN 
    DECLARE @SqlStatement VARCHAR(MAX) 
    SELECT @SqlStatement = 'SELECT * FROM ' + @dbName + '.SchemaName.TableName' 
    EXEC sp_executesql @SqlStatement; 
END 
GO 

В основном это позволяет передавать в DbName хранимой прок и использовать его, как вам хотелось бы. Вы даже можете передать имя таблицы, если хотите, чтобы это тоже было динамическим.

Одно из основных предостережений заключается в том, что вам необходимо убедиться в том, что вы защищаете SQL Injection, и нет никакой проверки, сделанной таким подходом.

Вы можете дать эту статью для чтения, если вы запутались SQL Инъекции: http://www.sommarskog.se/dynamic_sql.html

Однако, с целью того, что вы пытаетесь достичь, я не верю, что инъекции будет проблемой, это просто что-то, о чем нужно помнить.

UPDATE 1: Учитывая, что вы не хотите, чтобы передать в переменном для каждого из хранимого прока единственной другой альтернативы, что я могу думать о том, чтобы сделать следующее:

  • Создать различные хранимые proc (которые ссылаются на разные базы данных/s, которые вы хотите).
  • Затем управляйте различным сохраненным именем proc из config.
+2

https://www.xkcd.com/327/ – gvee

+0

Для целей, которые пытается выполнить OP, похоже, он не ожидал ввода пользователем хранимой процедуры (по крайней мере, для dbName) как таковое, это должно быть достаточно. – Sanity1123

+0

Посредством этого потребуется, чтобы я изменил все sp, чтобы передать дополнительный параметр – CodeBox

0

Выработать на мой комментарий по синонимам -

В DatabaseA, создавать synomyms указывающие на объекты в DatabaseB и наоборот, как это:

USE DatabaseA 
GO 
CREATE SYNONYM dbo.otherdb_table1 FOR DatabaseB.dbo.table1 
GO 
CREATE SYNONYM dbo.otherdb_table2 FOR DatabaseB.dbo.table2 
GO 
... 

USE DatabaseB 
GO 
CREATE SYNONYM dbo.otherdb_table1 FOR DatabaseA.dbo.table1 
GO 
CREATE SYNONYM dbo.otherdb_table2 FOR DatabaseA.dbo.table2 
GO 
... 

Таким образом, вы всегда можете ссылаться на таблицы в базе данных второй как

select col1, col2 from dbo.otherdb_table1 

Это будет работать независимо от того, где вы создаете хранимую процедуру, являясь ее DatabaseA или DatabaseB, хранимая процедура может быть одинаковой.

+0

Спасибо за ответ, но что делать, если хранятся процедуры, соединяющие разные базы данных? – CodeBox

Смежные вопросы