Как получить базы данных SQL Server, которые находятся на связанном сервере через SMO?Получение привязанных таблиц и представлений базы данных сервера через SMO
Server server = GetServer("server");
Database db = server.Databases["db"];
LinkedServer ls = server.LinkedServers["ls"];
Вторая строка выше возвращает обычную базу данных. Третья строка возвращает определенный связанный сервер, который обеспечивает доступ к соединенному серверному соединению, но не к его данным. Как я могу получить что-то вроде:
Database db1 = server.LinkedServers["ls"].Databases["db"];
? Причина, по которой мне это нужно, это то, что я буду перебирать разные объекты в связанной базе данных, такие как таблицы или представления.
UPDATE
Для дальнейшего уточнения, я в настоящее время этот код:
public void GenerateViews(string objectName = null)
{
Server server = new Server("server");
//Database a = server.Databases["a"];
Database b = server.Databases["b"];
b.Tables.OfType<Table>().ToList().ForEach(o => ProcessSqlObject(o));
b.Views.OfType<View>().ToList().ForEach(o => ProcessSqlObject(o));
}
//takes all tables and views in database b that have a custom extended property "CreateView", and create a view for it in database a
private void ProcessSqlObject(dynamic o) //o MUST be an SMO table or view (since they don't implement a common interface, I'm using a dynamic)
{
Database ct = (Database)o.Parent;
Database a = ct.Parent.Databases["a"];
const string viewPrefix = "V_CTC_";
const string SourceIDColumnName = "SourceID";
string objectName = (string)o.Name; //name of table or view
objectName = objectName.StartsWith("V_", StringComparison.InvariantCultureIgnoreCase) ? objectName.Substring(2) : objectName;
string viewName = viewPrefix + objectName; //remove V_ from view, so that we don't have "V_V_".
ExtendedProperty ep = (ExtendedProperty)o.ExtendedProperties["CreateView"];
bool AlreadyExists = a.Views.OfType<View>().Any(v => v.Name == viewName);
if (ep != null && ep.Value.ToString() == "1") //there IS an extended property, and its value is 1, meaning, we want a view
{
if (!AlreadyExists) //we don't already have the view
{
//ProcessSqlObject(t, viewName, SourceIDColumnName, ct, a);
StringBuilder ws = new StringBuilder();
ws.AppendLine("SELECT");
ws.AppendLine("\t2 [" + SourceIDColumnName + "]");
((ColumnCollection)o.Columns).OfType<Column>().ToList().ForEach(c =>
{
ws.AppendLine("\t, [" + c.Name + "]");
});
string linkedServer = "[ls].";
ws.AppendLine("FROM " + linkedServer + "[" + ct.Name + "].[dbo].[" + o.Name + "] WITH(NOLOCK)");
string rt = ws.ToString();
rt = rt.Replace("wholesale", "retail");
rt = rt.Replace("2 [" + SourceIDColumnName + "]", "3 [" + SourceIDColumnName + "]");
StringBuilder sql = new StringBuilder();
sql.AppendLine("CREATE VIEW " + viewName + " AS");
sql.AppendLine();
sql.AppendLine(ws.ToString());
//sql.AppendLine();
sql.AppendLine("UNION ALL");
sql.AppendLine();
sql.AppendLine(rt);
Console.WriteLine(sql);
a.ExecuteNonQuery(sql.ToString());
}
}
else //we DON't want the view
{
a.Views.OfType<View>().Single(v => v.Name == viewName).Drop();
a.Refresh();
}
}
}
я в настоящее время проходящий второй функции все таблицы и представления в данной базе данных. Это без использования связанного сервера. Я хочу иметь возможность делать то же самое, но для связанного сервера, не переписывая код.
Спасибо.
У меня уже есть метод, который проходит через таблицы для не связанных с сервером db, и я хочу передать это этому методу, не переписывая все. Есть ли другой путь? – as9876
Можете ли вы обновить вопрос своей сигнатурой метода? И что он делает с таблицами/представлениями? – Juan
Я обновил его, ty. – as9876