как узнать имя экземпляра sql server
Как узнать имя экземпляра Microsoft SQL Server на T-SQL
Всем привет! Сегодня мы с Вами рассмотрим несколько способов определения имени экземпляра Microsoft SQL Server на языке T-SQL, а также с использованием других программных средств.
Способы определения имени экземпляра Microsoft SQL Server
Существует несколько способов узнать, какое имя экземпляра у SQL Server. Мы рассмотрим способы, которые подразумевают обращение к определенным системным функциям на языке T-SQL, а также способ, с помощью которого мы можем узнать имена всех экземпляров SQL Server, которые установлены на конкретном сервере.
Кроме этого я покажу способ определения имени экземпляра SQL Server без выполнения SQL инструкций, например, для случаев, когда нет возможности подключиться к SQL Server. Данный способ предполагает выполнение определённой инструкции на языке PowerShell.
Таким образом, для того чтобы определить имя экземпляра Microsoft SQL Server, Вы можете использовать тот способ, который будет удобнее в Вашем конкретном случае.
Способ 1 – функция @@SERVERNAME
Первый способ предполагает использование системной функции @@SERVERNAME, которая возвращает имя локального сервера, на котором работает SQL Server.
Функция @@SERVERNAME возвращает следующие данные:
Исходные данные | Данные, которые возвращает функция |
Если используется экземпляр по умолчанию | «Имя_сервера» |
Если используется именованный экземпляр | «Имя_сервера\Имя_экземпляра» |
Если используется экземпляр по умолчанию отказоустойчивого кластера | «Сетевое_имя_экземпляра_отказоустойчивого_ кластера_windows_server» |
Если используется именованный экземпляр отказоустойчивого кластера | «Сетевое_имя_экземпляра_отказоустойчивого_ кластера_windows_server\имя_экземпляра» |
Пример использования функции
В моем случае используется именованный экземпляр Microsoft SQL Server, поэтому функция вернула соответствующие данные, где SQLEXPRESS и есть имя экземпляра SQL Server.
Способ 2 – функция @@SERVICENAME
Второй способ определения имени экземпляра Microsoft SQL Server предполагает использование функции @@SERVICENAME, которая возвращает имя раздела реестра, согласно которому запущен SQL Server.
Если текущий экземпляр является экземпляром по умолчанию, то данная функция возвращает «MSSQLSERVER», однако если же текущий экземпляр является именованным экземпляром, то эта функция возвращает имя этого экземпляра.
Пример использования функции
В данном случае, так как у меня именованный экземпляр, функция @@SERVICENAME вернула имя экземпляра.
Способ 3 – функция SERVERPROPERTY
Следующий способ определения имени экземпляра SQL Server предполагает использование системной функции SERVERPROPERTY, которая возвращает много различных сведений о свойствах экземпляра Microsoft SQL Server.
Данная функция принимает один параметр, и если мы передадим значение «InstanceName», то она нам вернет имя экземпляра.
Однако здесь стоит учитывать, что если используется экземпляр по умолчанию, то функция вернет NULL.
Пример использования функции
У меня именованный экземпляр, поэтому функция вернула имя экземпляра.
Способ 4 – процедура xp_regread
Если Вам необходимо узнать имена всех экземпляров SQL Server, которые установлены на конкретном сервере, то для этого Вы можете использовать системную хранимую процедуру xp_regread, которая умеет считывать параметры реестра Windows, в котором как раз и можно найти всю интересующую нас информацию об экземплярах Microsoft SQL Server.
Процедура принимает три параметра: в первом мы указываем название раздела реестра, во втором — путь к нужной нам ветке реестра, и третий — параметр, значение которого нам нужно считать.
Пример использования процедуры
У меня установлен только один экземпляр, поэтому инструкция вернула одну строку данных.
Как узнать имя экземпляра Microsoft SQL Server на PowerShell
Способ предполагает простое считывание названия службы Microsoft SQL Server, т.е. мы с помощью определенной инструкции на PowerShell ищем название службы по префиксу «MSSQL$» (данный префикс имеет «Имя службы, а не «Отображаемое имя службы»).
Пример инструкции на PowerShell
Кроме этого, узнать имя экземпляра Microsoft SQL Server можно, если зайти в оснастку «Службы» в Windows и посмотреть, какое имя указано в названии службы SQL Server.
Заметка! Всем тем, кто только начинает свое знакомство с языком SQL, рекомендую прочитать книгу «SQL код» – это самоучитель по языку SQL, которую написал я, и в которой я подробно, и в то же время простым языком, рассказываю о языке SQL.
На сегодня это все, надеюсь, материал был Вам полезен, пока!
Как определить установленные экземпляры SQL Server и их версии?
Я пытаюсь определить, какие экземпляры sql server / sql express я установил (вручную или программно), но все примеры говорят мне запустить SQL-запрос, чтобы определить это, что предполагает, что я уже подключен к определенному экземпляру.
18 ответов
в командной строке:
(Примечание: должна быть заглавная L)
в этом списке будут перечислены все серверы sql, установленные в вашей сети. Существуют параметры конфигурации, которые можно задать для предотвращения отображения SQL Server в списке. Сделать это.
в командной строке:
в списке включенные протоколы выберите «TCP / IP», затем нажмите кнопку Свойства. Существует флажок «скрыть сервер».
вы можете запросить это значение реестра, чтобы получить версию SQL напрямую:
кроме того, вы можете запросить имя экземпляра, а затем использовать sqlcmd с именем экземпляра, которое вы хотели бы:
чтобы увидеть свое имя пример:
затем выполнить это:
все установленные экземпляры должны отображаться в оснастке «службы» в консоли управления Microsoft. Чтобы получить имена экземпляров, перейдите в меню Пуск | запуск / тип служб.msc и найдите все записи с » Sql Server (имя экземпляра)».
— T-SQL запрос для поиска списка экземпляров, установленных на компьютере
однако, если вы ищете более широкий процесс обнаружения, вы можете рассмотреть сторонние инструменты, такие как SQLRecon и SQLPing, которые будут сканировать вашу сеть и создавать отчет обо всех экземплярах служб SQL, найденных на любом сервере, к которому они имеют доступ. Прошло некоторое время с тех пор, как я использовал такие инструменты, но я был удивлен тем, что они нашли (а именно, несколько случаев, которые я не сделал знать, что существовал). YMMV. Вы можете Google для деталей, но я считаю, что эта страница имеет соответствующие загрузки:http://www.sqlsecurity.com/Tools/FreeTools/tabid/65/Default.aspx
Я знаю, что этот поток немного староват, но я наткнулся на этот поток, прежде чем нашел ответ, который я искал, и думал, что поделюсь. Если вы используете SQLExpress (или localdb), есть более простой способ найти имена экземпляров. В командной строке введите:
Это будет список имен инстанции установлено локально. Таким образом, ваше полное имя сервера должно включать (localdb)\ перед именем экземпляра для подключения. Кроме того, sqllocaldb позволяет создавать новые экземпляры или удалите их,а также настройте их. См.: Утилита SqlLocalDB.
SQL Server позволяет приложениям находить экземпляры SQL Server в текущей сети. Класс SqlDataSourceEnumerator предоставляет эту информацию разработчику приложения, предоставляя объект DataTable, содержащий сведения обо всех видимых серверах. Эта возвращенная таблица содержит список экземпляров сервера, доступных в сети, который соответствует списку, предоставляемому при попытке пользователя создать новое соединение, и расширяет раскрывающийся список, содержащий все доступные серверы на диалоговое окно свойства соединения. Отображаемые результаты не всегда являются полными. Чтобы получить таблицу, содержащую сведения о доступных экземплярах SQL Server, необходимо сначала получить перечислитель, используя свойство shared/static Instance:
Если вы заинтересованы в определении этого в скрипте, вы можете попробовать следующее:
Примечание: grep является частью gnuwin32 tools
из командной строки Windows, типа:
это требует достаточно разрешений, конечно.
У меня была та же проблема. Команда» osql-L » отображает только список серверов, но без имен экземпляров (отображается только экземпляр моего локального SQL Sever). С Wireshark, sqlbrowser.exe (который можно найти в общей папке вашей установки SQL) я нашел решение для своей проблемы.
в моей конфигурации используется 1 физический и 3 виртуальных сетевых адаптера. Если я использовал команду» osql-L», sqlbrowser отобразил запрос от одного из виртуальных адаптеров (который находится в другом сегменте Сети) вместо физического. osql выбирает adpater по его метрике. Вы можете увидеть метрику с командой «route print». Для моей конфигурации таблица маршрутизации показала более низкую метрику для виртуального адаптера, а затем для физического. Поэтому я изменил метрику интерфейса в свойства сети путем отмены выбора автоматической метрики в расширенных параметрах сети. osql теперь использует физический адаптер.
этот запрос должен получить имя сервера и имя экземпляра :
У меня была такая же проблема, когда я оценивал 100 + серверов, у меня был сценарий, написанный на C#, чтобы просмотреть имена служб, состоящие из SQL. При установке экземпляров на сервере SQL Server добавляет службу для каждого экземпляра с именем службы. Он может отличаться для разных версий, таких как 2000 до 2008, но наверняка есть служба с именем экземпляра.
Я беру имя службы и получаю имя экземпляра из имени службы. Вот пример кода, используемого с запросом WMI Результат:
Если ваш в SSMS вы можете найти его проще в использовании:
Я только что установил Sql server 2008, но мне не удалось подключиться к экземплярам базы данных. В опубликованных командах @G Mastros нет активных экземпляров.
поэтому я посмотрел в службах и обнаружил, что агент SQL server отключен. Я исправил это, установив его на автоматический, а затем запустив его.
вот простой способ: идти к Начнем Затем программы Затем Microsoft SQL Server 2005 Затем Инструменты Настройки Затем диспетчер конфигурации SQL Server Затем конфигурация сети SQL Server 2005 Здесь вы можете найти все экземпляры, установленные на вашем компьютере.
Я знаю его старый пост, но я нашел хорошее решение с PoweShell, где вы можете найти экземпляры SQL, установленные на локальном или удаленном компьютере, включая версию, а также расширить получить другие свойства.
еще один вариант-запустить отчет обнаружения SQLSERVER..перейдите на установочный носитель sqlserver и дважды щелкните настройка.exe
и на следующем экране перейдите в сервис и нажмите отчет об обнаружении, как показано ниже
Это покажет вам все экземпляры, присутствующие вместе со всеми функциями..ниже приведен снимок на моем ПК
Имя установленного экземпляра Sql Server
Помощь в написании контрольных, курсовых и дипломных работ здесь.
Ошибка:instance name ms sql server is already in use. Возникает при установке,где нужно указать имя экземпляра
Здравствуйте. Как исправить данную ошибку: instance name ms sql server is already in use. Она.
Создание экземпляра SQL Server
Всем привет!! Умные люди, помогите! Есть сервер на RedHat’е, на нем развернуто две виртуалки. На.
Добавление дополнительного экземпляра в SQL Server
Привет всем. Я пытаюсь создать новый экземпляр для уже существующего SQL сервера, а точнее.
Не удается найти имя сервера Sql Server
Не могу найти имя сервера SQL сервера, даже переустановил SQL. Не получиться Даже с помощью.
Решение
В командной строке выполнить
или,чтоб получить список всех серверов
Помощь в написании контрольных, курсовых и дипломных работ здесь.
Как в среде SQL Server Managment Studio создать имя входа, для отображения конкретной БД?
Здравствуйте, я уже долго пытаюсь найти ответ к вопросу: «Как в среде SQL Server Management Studio.
Работа с файлом БД без установленного MS SQL Server
Здравствуйте! Подскажите, пожалуйста, можно ли получить информацию из файла БД установленной СУБД.
Как запустить программу содержащую базу данных, не имея установленного SQL Server
Используется Entity Framework 5.0 (VS2013) code first для создания базы данных. На моей машине.
Краткое руководство. Подключение к экземпляру SQL Server и выполнение запросов с помощью SQL Server Management Studio (SSMS)
Начало работы с SQL Server Management Studio (SSMS) для подключения к экземпляру базы данных SQL Server и выполнения некоторых команд Transact-SQL (T-SQL).
В статье показано, как выполнять следующие задачи:
Предварительные условия
Подключение к экземпляру SQL Server
Запустите среду SQL Server Management Studio. При первом запуске SSMS откроется окно Подключение к серверу. Если этого не происходит, вы можете открыть его вручную, последовательно выбрав Обозреватель объектов > Подключить > Ядро СУБД.
Параметр | Рекомендуемые значения | Описание |
---|---|---|
Тип сервера | Ядро СУБД | В поле Тип сервера выберите Ядро СУБД (обычно это параметр по умолчанию). |
Имя сервера | Полное имя сервера | В поле Имя сервера введите имя SQL Server (при локальном подключении в качестве имени сервера также можно использовать localhost). Если вы НЕ ИСПОЛЬЗУЕТЕ экземпляр по умолчанию — MSSQLSERVER — необходимо ввести имя сервера и имя экземпляра. Если вы не знаете, как определить имя экземпляра SQL Server, см. раздел Дополнительные советы и рекомендации по использованию SSMS. |
Аутентификация | Проверка подлинности Windows Проверка подлинности SQL Server | По умолчанию используется проверка подлинности Windows. Также для подключения можно использовать режим Проверка подлинности SQL Server. Если выбран режим Проверка подлинности SQL Server, необходимо ввести имя пользователя и пароль. Дополнительные сведения о типах проверки подлинности см. в разделе Подключение к серверу (ядро СУБД). |
Имя входа | Идентификатор пользователя учетной записи сервера | Идентификатор пользователя учетной записи сервера, используемой для входа на сервер. Имя для входа, используемое для проверки подлинности SQL Server. |
Пароль | Пароль учетной записи сервера | Пароль учетной записи сервера, используемой для входа на сервер. Пароль, используемый для проверки подлинности SQL Server. |
После заполнения всех полей выберите Подключить.
Вы также можете изменить дополнительные параметры подключения, выбрав Параметры. Примеры параметров подключения: база данных, к которой вы подключаетесь, время ожидания подключения и сетевой протокол. В этой статье во всех полях указываются значения по умолчанию.
Чтобы убедиться в успешном подключении к экземпляру SQL Server, разверните и изучите объекты в обозревателе объектов, для которых отображаются имя сервера, версия SQL Server и имя пользователя. Эти объекты могут различаться в зависимости от типа сервера.
Устранение проблем подключения
Сведения о способах устранения неполадок с подключением к экземпляру ядра СУБД SQL Server на отдельном сервере см. в статье Устранение неполадок при соединении с ядром СУБД SQL Server.
Создание базы данных
Выполните следующие действия, чтобы создать базу данных с именем TutorialDB:
Щелкните правой кнопкой мыши экземпляр сервера в обозревателе объектов и выберите Создать запрос.
Вставьте в окно запроса следующий фрагмент кода T-SQL:
Чтобы запустить запрос, нажмите кнопку Выполнить (или клавишу F5).
После выполнения запроса в списке баз данных в обозревателе объектов появится новая база данных TutorialDB. Если она не отображается, щелкните правой кнопкой мыши узел Базы данных и выберите Обновить.
Создание таблицы в новой базе данных
В этом разделе вы создадите таблицу в новой базе данных TutorialDB. Так как редактор запросов все еще находится в контексте базы данных master, переключите контекст подключения на базу TutorialDB, сделав следующее.
Выберите нужную базу данных в раскрывающемся списке, как показано здесь:
Вставьте в окно запроса следующий фрагмент кода T-SQL:
Чтобы запустить запрос, нажмите кнопку Выполнить (или клавишу F5).
После выполнения запроса в списке таблиц в обозревателе объектов появится новая таблица Customers. Если таблица не отображается, щелкните правой кнопкой мыши узел TutorialDB > Таблицы в обозревателе объектов, а затем выберите Обновить.
Вставка строк в новую таблицу
Вставьте в созданную таблицу Customers какие-нибудь строки. Вставьте следующий фрагмент кода T-SQL в окно запросов и нажмите кнопку Выполнить.
Запрос к таблице и просмотр результатов
Результаты запроса выводятся под текстовым окном запроса. Чтобы запросить таблицу Customers и просмотреть вставленные строки, выполните следующие действия:
Вставьте следующий фрагмент кода T-SQL в окно запросов и нажмите кнопку Выполнить.
Результаты запроса отображаются под областью, где был введен текст.
Вы также можете изменить представление результатов одним из следующих способов:
Проверка свойств подключения с помощью таблицы окна запросов
Сведения о свойствах подключения приводятся под результатами запроса. После выполнения запроса из предыдущего этапа просмотрите свойства подключения в нижней части окна запросов.
Вы можете определить, к какому серверу и какой базе данных вы подключены и под каким именем пользователя выполнен вход.
Кроме того, вы можете проверить длительность запроса и число строк, возвращенных предыдущим запросом.
Дополнительные средства
Также с помощью Azure Data Studio вы можете выполнять подключения и запросы к SQL Server, базе данных SQL Azure и Azure Synapse Analytics.
Дальнейшие действия
Лучший способ познакомиться с SSMS — это поработать в среде самостоятельно. Эти статьи помогут вам ознакомиться с различными функциями SSMS.
Исследуем базы данных с помощью T-SQL
Как dba и консультант по оптимизации производительности SQL Server в Ambient Consulting, я часто сталкиваюсь с необходимостью анализа узких мест производительности на экземплярах SQL Server, которые вижу первый раз в жизни. Это может быть сложной задачей. Как правило, у большинства компаний нет документации по их базам данных. А если есть, то она устарела, или же её поиск занимает несколько дней.
В этой статье я поделюсь базовым набором скриптов, раскапывающим информацию о метаданных с помощью системных функций, хранимых процедур, таблиц, dmv. Вместе они раскрывают все секреты баз данных на нужном экземпляре – их размер, расположение файлов, их дизайн, включая столбцы, типы данных, значения по умолчанию, ключи и индексы.
Если вы когда-нибудь пытались получить часть этой информации, с помощью GUI, я думаю вы будете приятно удивлены количеством той информации, которая, с помощью этих скриптов, получается мнгновенно.
Как и с любыми скриптами, сначала проверьте их в тестовом окружении, прежде чем запускать в продакшене. Я бы рекомендовал вам погонять их на тестовых базах MS, таких как AdventureWorks или pubs.
Ну, хватит слов, давайте я покажу скрипты!
Изучаем сервера
Начнём с запросов, предоставляющих информацию о ваших серверах.
Базовая информация
Во-первых, несколько простых @@Функций, которые предоставят нам базовую информацию.
Как долго ваш SQL Server работает после последнего перезапуска? Помните, что системная база данных tempdb пересоздаётся при каждом перезапуске SQL Server. Вот один из методов определения времени последнего перезапуска сервера.
Связанные сервера
Связанные сервера – это соединения, позволяющие SQL Server’у обращаться к другим серверам с данными. Распределённые запросы могут быть запущенны на разных связанных серверах. Полезно знать – является ли ваш сервер баз данных изолированным от других, или он связан с другими серверами.
Список всех баз данных
Во-первых, получим список всех баз данных на сервере. Помните, что на любом сервере есть четыре или пять системных баз данных (master, model, msdb, tempdb и distribution, если вы пользуетесь репликацией). Вы, вероятно, захотите исключить эти базы в следующих запросах. Очень просто увидеть список баз данных в SSMS, но, эти запросы будут нашими «строительными блоками» для более сложных запросов.
Есть несколько путей для получения списка всех БД на T-SQL и ниже вы увидите некоторые из них. Каждый метод возвращает похожий результат, но с некоторыми отличиями.
Последний бэкап?
Стоп! Прежде чем двигаться дальше, каждый хороший dba должен узнать есть ли у него свежий бэкап.
Будет лучше, если вы сразу узнаете путь к файлу с последним бэкапом.
Активные пользовательские соединения
Хорошо было бы понимать какие БД сейчас используются, особенно, если вы собираетесь разбираться с проблемами производительности.
Примечание переводчика: это будет работать только в SQL Server 2012 и выше, в предыдущих редакциях, в dmv sys.dm_exec_sessions отсутствовал столбец database_id. Чтобы узнать в каких БД в данный момент работают пользователи, можно воспользоваться sp_who.
Изучаем базы данных
Давайте заглянем поглубже и посмотрим, как мы можем собрать информацию об объектах во всех ваших БД, используя различные представления каталога и dmv. Большинство из запросов, представленных в этом разделе, смотрят «внутрь» только одной БД, поэтому не забывайте выбирать нужную БД в SSMS или с помощью команды use database. Также помните, что вы всегда можете посмотреть в контексте какой БД будет выполнен запрос, с помощью select db_name().
Системная таблица sys.objects одна из ключевых для сбора информации об объектах, составляющих вашу модель данных.
Ниже представлен список типов объектов, информацию о которых мы можем получить (смотрите документацию на sys.objects в MSDN)
Другие представления каталога, такие как sys.tables и sys.views, обращаются к sys.objects и предоставляют информацию о конкретном типе объектов. С этими представлениями, плюс функцией OBJECTPROPERTY, мы можем получить огромное количество информации по каждому из объектов, составляющих нашу схему БД.
Расположение файлов баз данных
Физическое расположение выбранной БД, включая основной файл данных (mdf), и файл журнала транзакций (ldf), могут быть получены с помощью этих запросов.
Таблицы
Конечно, Object Explorer в SSMS показывает полный список таблиц в выбранной БД, но часть информации с помощью GUI получить сложнее, чем с помощью скриптов. Стандарт ANSI предполагает обращение к представлениям INFORMATION_SCHEMA, но они не предоставят информацию об объектах, которые не являются частью стандарта (такие как триггеры, extended procedures и т.д.), поэтому лучше использовать представления каталога SQL Server.
Количество записей в таблице
Если вы ничего не знаете о таблице, то все таблицы одинаково важны. Чем больше вы узнаёте о таблицах, тем больше вы их разделяете на условно более важные и условно менее важные. В целом, таблицы с огромным количеством записей чаще оказывают серьёзное влияние на производительность.
В SSMS мы можем нажать правой кнопкой мыши на любую таблицу, открыть свойства на вкладке Storage и увидеть количество записей в таблице.
Довольно тяжело собрать вручную эту информацию обо всех таблицах. Опять же, если мы будем писать SELECT COUNT(*) FROM TABLENAME для каждой таблицы, нам придётся очень много печатать.
Намного удобнее использовать T-SQL для генерирования скрипта. Скрипт, приведённый ниже, сгенерирует набор инструкций T-SQL для получения количества строк в каждой таблице текущей базы данных. Просто выполните его, скопируйте результат в новое окно и запустите.
Примечание переводчика: у меня запрос не работал, добавил схему к имени таблицы.
sp_msForEachTable
Sp_msforeachtable – это недокументированная функция, которая «проходит» по всем таблицам в БД и выполняет запрос, подставляя вместо ‘?’ имя текущей таблицы. Так же существует похожая функция sp_msforeachdb, работающая на уровне баз данных.
Известно несколько проблем с этой недокументированной функцией, например, использование спецсимволов в именах объектов. Т.е. если имя таблицы или базы данных содержит знак ‘-‘, хранимая процедура, листинг которой ниже, завершится с ошибкой.
Самый быстрый способ получения количества записей – кластерный индекс
Все предыдущие метода использовали COUNT(*), который медленно отрабатывает, если в таблице больше чем 500K записей.
Самый быстрый способ получения количества записей в таблице – получать количество записей в кластерном индексе или куче. Помните, что хоть этот метод и самый быстрый, MS говорит, что информация о количестве записей индекса и реальное количество строк в таблице может не совпадать, из-за того, что на обновление информации требуется хоть и небольшое, но время. В большинстве же случаев, эти значения или одинаковы, или очень-очень близки и вскоре станут одинаковыми.
Поиск куч (таблиц без кластерных индексов)
Работа с кучами – это как работа с плоским файлом, вместо базы данных. Если вы хотите гарантированно получать полное сканирование таблицы при выполнении любого запроса, используйте кучи. Обычно я рекомендую добавлять primary key ко всем таблицам-кучам.
Разбираемся с активностью в таблице
При работах по оптимизации производительности, очень важно знать какие таблицы активно читаются, а в какие идёт активная запись. Ранее мы узнали сколько записей в наших таблицах, сейчас посмотрим как часто в них пишут и читают.
Помните, что эта информация из dmv, очищается при каждом перезапуске SQL Server. Чем дольше сервер работает, тем более надёжна статистика. Я чувствую себя намного более уверенно со статистикой, собранной за 30 дней, чем со статистикой, собранной за неделю.
Намного более продвинутая версия этого запроса представлена курсором, собирающим информацию по всем таблицам всех баз данных на сервере. Вообще, я не фанат курсоров из-за их невысокой производительности, но перемещение по разным базам данных – это отличное применение для них.
Примечание переводчика: курсор не отработает, если у вас в списке есть базы данных с состоянием, отличным от ONLINE.
Представления
Представления – это, условно говоря, запросы, хранящиеся в БД. Вы можете думать о них, как о виртуальных таблицах. Данные не хранятся в представлениях, но в наших запросах мы ссылаемся на них точно так же, как и на таблицы.
В SQL Server, в некоторых случаях, мы можем обновлять данные с использованием представления. Чтобы получить представление «только для чтения», можно использовать SELECT DISTINCT при его создании. Данные «через» представление можно менять только в том случае, если каждой строке представления соответствует только одна строка в «базовой» таблице. Любое представление, не отвечающее этому критерию, т.е. построенное на нескольких таблицах, или с использованием группировок, агрегатных функций и вычислений, будет доступно только для чтения.
Синонимы
Несколько раз в моей карьере я сталкивался с ситуацией, когда не мог понять к какой же таблице обращается запрос. Представьте простой запрос SELECT * FROM Client. Я ищу таблицу под именем Client, но я не могу найти её. Хорошо, думаю я, должно быть это представление, ищу представление с именем Client и всё равно не могу найти. Может быть я ошибся базой данных? В итоге выясняется, что Client – это синоним для покупателей и таблица, на самом деле, называется Customer. Отдел маркетинга хотел обращаться к этой таблице как к Client и из-за этого был создан синоним. К счастью, использование синонимов – это редкость, но разбирательства могут вызвать определённые затруднения, если вы к ним не готовы.
Хранимые процедуры
Хранимые процедуры – это группа скриптов, которые компилируются в единственный план выполнения. Мы можем использовать представления каталога, чтобы определить какие ХП созданы, какие действия они выполняют и над какими таблицами.
Добавив простое условие в WHERE мы можем получить информацию только о тех хранимых процедурах, которые, например, выполняют операции INSERT.
Немного модифицировав условие в WHERE, мы можем собрать информацию о ХП, производящих обновление, удаление или же обращающихся к определённым таблицам.
Функции
Функции хранятся в SQL Server, принимают какие-либо параметры и выполняют определённые действия, либо вычисления, после чего возвращают результат.
Триггеры
Триггер – это что-то вроде хранимой процедуры, которая выполняется в ответ на определённые действия с той таблицей, которой этот триггер принадлежит. Например, мы можем создать INSERT, UPDATE и DELETE триггеры.
CHECK-ограничения
CHECK-ограничения – это неплохое средство для реализации бизнес-логики в базе данных. Например, некоторые поля должны быть положительными, или отрицательными, или дата в одном столбце должна быть больше даты в другом.
Углубляемся в модель данных
Ранее, мы использовали скрипты, которые дали нам представление о «верхнем уровне» объектов, составляющих нашу базу данных. Иногда нам нужно получить больше данных о таблице, включая столбцы, их типы данных, какие значения по умолчанию заданы, какие ключи и индексы существуют (или должны существовать) и т.д.
Запросы, представленные в этом разделе, предоставляют средства почти что реверс-инжиниринга существующей модели данных.
Столбцы
Следующий скрипт описывает таблицы и столбцы из всей базы данных. Результат этого запроса, можно скопировать в Excel, где можно настроить фильтры и сортировку и хорошо разобраться с типами данных, использующимися в БД. Так же, обратите внимание на столбцы с одинаковыми именами, но разными типами данных.
Значения по умолчанию
Значение по умолчанию – это значение, которое будет сохранено, если никакого значения для столбца не будет задано при вставке. Зачастую, для столбцов хранящих дату ставят get_date(). Также, значения по умолчанию используются для аудита – вставляется system_user для определения учётной записи пользователя, совершившего определённое действие.
Вычисляемые столбцы
Вычисляемые столбцы – это столбцы, значения в которых вычисляются на основании, как правило, значений в других столбцах таблицы.
Столбцы identity
Столбцы IDENTITY автоматически заполняются системой уникальными значениями. Обычно используются для хранения порядкового номера записи в таблице.
Ключи и индексы
Как я писал ранее, наличие первичного ключа и соответствующего индекса у таблицы – это одна из best practice. Ещё одна best practice заключается в том, что внешние ключи так же должны иметь индекс, построенный по столбцам, входящим во внешний ключ. Индексы, построенные «по внешним ключам» отлично подходят для соединения таблиц. Эти индексы так же хорошо сказываются на производительности при удалении записей.
Какие индексы у нас есть?
Скрипт для поиска всех индексов во всех таблицах текущей БД.
Каких индексов не хватает?
На основании ранее исполнявшихся запросов, SQL Server предоставляет информацию об отсутствующих индексах в БД, создание которых может увеличить производительность.
Не добавляйте эти индексы вслепую. Я бы подумал о каждом из предложенных индексов. Использование включенных столбцов, например, может аукнуться серьёзным увеличением объёмов.
Внешние ключи
Внешние ключи определяют связь между таблицами и используются для контроля ссылочной целостности. На диаграмме сущность-связь линии между таблицами обозначают внешние ключи.
Пропущенные индексы по внешним ключам
Как я уже говорил, желательно иметь индекс, построенный по столбцам, входящим во внешний ключ. Это значительно ускоряет соединения таблиц, которые, обычно, всё равно соединяются по внешнему ключу. Эти индексы так же значительно ускоряют операции удаления. Если такого индекса нет, SQL Server будет производить table scan связанной таблицы, при каждом удалении записи из «первой» таблицы.
Зависимости
Это зависит… Я уверен, вы слышали это выражение раньше. Я рассмотрю три разных метода для «реверс-инжиниринга» зависимостей в БД. Первый метода – использовать хранимую процедуру sp_msdependecies. Второй – системные таблицы, связанные со внешними ключами. Третий метод – использовать CTE.
sp_msdependencies
Sp_msdependencies – это недокументированная хранимая процедура, которая может быть очень полезна для разбора сложных взаимозависимостей таблиц.
Если мы выведем все зависимости, используя sp_msdependencies, мы получим четыре столбца: Type, ObjName, Owner(Schema), Sequence.
Обратите внимание на номер последовательности (Sequence) – он начинается с 1 и последовательно увеличивается. Sequence – это «порядковый номер» зависимости.
Я несколько раз использовал этот метод, когда мне нужно было выполнить архивирование или удаление на очень большой БД. Если вы знаете зависимости таблицы, значит у вас есть «дорожная карта» — в каком порядке вам нужно архивировать или удалять данные. Начните с таблицы с самым большим значение в столбце Sequence и двигайтесь от него в обратном порядке – от большего к меньшему. Таблицы с одинаковым значением Sequence могут быть удалены одновременно. Этот метод не нарушает ни одного из ограничений внешних ключей и позволяет перенести/удалить записи без временного удаления и перестроения ограничений (constraints).
В SSMS, если вы нажмёте правой кнопкой мыши на имя таблицы, вы сможете выбрать «View Dependencies» и «Объекты, которые зависят от TABLENAME»:
Мы также можем получить эту информацию следующим способом:
Если в SSMS, в окне просмотра зависимостей, выбрать «Объекты которые зависят от TABLENAME», а затем раскрыть все уровни, мы увидим следующее:
Ту же самую информацию вернёт sp_msdependencies.
Так же, в SSMS, мы можем увидеть от каких объектов зависит выбранная таблица.
Следующий запрос, с использованием msdependencies, вернёт ту же самую информацию.
Если вы хотите получить список зависимостей таблиц, вы можете использовать временную таблицу, чтобы отфильтровать зависимости по типу.
Запросы к системным представлениям каталога
Второй метод «реверс-инжиниринга» зависимостей в вашей БД – это запросы к системным представлениям каталога, связанным со внешними ключами.
Использование CTE
Третий метод, для получения иерархии зависимостей – использование рекурсивного CTE.
Заключение
Таким образом, за час или два, можно получить неплохое представление о внутренностях любой базы данных, используя методы «реверс-инжиниринга», описанные выше.
Примечание переводчика: все запросы в тексте (за исключением одного, в тексте он отмечен) будут работать на SQL Server 2005 SP3 и в более поздних редакциях. Текст достаточно объёмный, я старался как мог его вычитать и найти свои ошибки (стилистические, синтаксические, смысловые и прочие), но, наверняка что-то не заметил, напишите мне в личку, пожалуйста, если что-то будет резать глаз.