w14243 Ответов: 2

Как отфильтровать системную базу данных в SQL server?


Я хочу перечислить пользовательскую базу данных в SQL server, например

выберите имя из sys. databases

Он возвращает ниже содержание:

мастер
база данных tempdb
модель
msdb
ReportServer$SQLEXPRESS
ReportServer$SQLEXPRESSTempDB
xsxk
MyDatabase2

Первые 6 баз данных-это системные базы данных, они мне не нужны.
Мне просто нужны последние 2 базы данных. Последние 2 базы данных созданы пользователем.

Пожалуйста, предоставьте исходный код на C# или SQL, чтобы отфильтровать системную базу данных.
Имя базы данных пользователя не имеет правил.

Что я уже пробовал:

Использование SMO:

Майкрософт.От SQLServer.Управления.СМО.Сервер так = новый Microsoft.От SQLServer.Управления.СМО.Сервер();
Майкрософт.От SQLServer.Управления.СМО.DatabaseCollection постоянного тока = так.Баз данных;

Он также возвращает все базы данных.

PIEBALDconsult

Смотреть также:
https://www.codeproject.com/Questions/694915/How-to-determine-which-databases-are-and-are-not-s

2 Ответов

Рейтинг:
2

CHill60

К сожалению, если вы основываете свой запрос на дате, то tempdb будет (как правило) по-прежнему отображаться в вашем списке (в зависимости от того, как управляется экземпляр).

Если вы используете стандартный подход

select [name] from sys.databases where database_id > 4 
тогда (в вашем случае) вы все равно получите записи для ReportServer$SQLEXPRESS и ReportServer$SQLEXPRESSTempDB Вы не можете просто изменить предложение WHERE на
where database_id > 6
потому что если ты не если Службы Reporting services установлены, то вы ошибочно опустите некоторые подлинные базы данных, созданные пользователями.

Это может выглядеть так, как будто вы могли бы использовать
select * from sys.databases where owner_sid = 0x01
т. е. перечислить все базы данных, созданные учетной записью администратора. Но что, если ваш DBA использовал эту учетную запись для создания баз данных от имени пользователя? Опять же, вы можете ошибочно опустить некоторые подлинные базы данных, представляющие интерес.

Вероятно, самый безопасный маршрут-это
select * from sys.databases where database_id > 5 and [name] NOT LIKE 'ReportServer%'


Рейтинг:
0

pradiprenushe

В master db НАЖМИТЕ этот запрос

(SQL 2012)

select * from sysdatabases order by crdate


Проверьте дату создания первой базы данных.
Сделайте конфигурацию для даты со значением равным первой созданной пользователем БД
Теперь используйте нижеприведенный запрос для извлечения вашей базы данных


select * from sysdatabases where crdate > @date order by crdate


значение @date должно быть извлечено из конфигурации

Не встречайся жесткий код @в СП, потому что ты дева,Квебек,ЕСХН,прод среде БД дата создания будет отличаться


pradiprenushe

Любая причина для понижения голоса

CHill60

Я должен предположить, что это потому, что это не совсем работает - проверьте базу данных msdb - это *та* дата, которая вам нужна. На всех моих экземплярах SQL модель и мастер датированы 2003-04-09. msdb датируется, когда я установил экземпляр на компьютер. Я подозреваю, что записи ReportServer будут иметь ту же проблему.
Кстати, если вы используете sys. databases, а не sysdatabases, то вы можете использовать этот метод в более ранних версиях SQL Server.

pradiprenushe

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

CHill60

Вы можете тестировать его сколько угодно - классическим ответом "разработчиков "всегда было"он работает на моей машине". Я привел вам пример того, что msdb имеет другую дату, чем дата установки экземпляра SQL Server. ReportServer* может снова иметь совершенно другую дату, и дата на tempdb зависит от того, как управляется SQL Server - мой, например, датирован прошлым месяцем, но я установил SQL Server на эту машину 3 года назад.
Кстати, это не я вас понизил, я просто отвечал на ваш вопрос: "Есть ли причина для понижения"