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

Обновлено: 05.07.2024

Если вас интересует получение данных для динамических списков не из базы данных, а из массивов, вам нужна другая статья.

Если же ваши данные хранятся в таблице СУБД MySQL или какой-то иной, вам будет полезна информация из этой статьи. Я описываю алгоритм получения данных для раскрывающихся списков в HTML-теге SELECT с помощью JavaScript. Сам сценарий написан на PHP.

Если кому-то лень читать и хочется открыть книгу на последней странице, можно скачать все файлы в архиве.

Задача ясна. Что мы можем добавить от себя? Если выбранный производитель меняется, значит из перечня моделей нужно удалить всё то, что имело отношение к предыдущему производителю. Если производитель не выбран, поле выбора модели должно быть пустым. А лучше сделать его еще и неактивным.

Начать нужно с таблиц в MySQL. Для того, чтобы решить задачу, нужно создать две таблицы в базе данных: producers (производители) и models (модели).

Теперь пополним таблицы данными.

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

Теперь можно создать HTML-форму. Сразу скажу, что здесь у нас будут работать в связке PHP, MySQL и jQuery. Именно с помощью jQuery select с перечнем моделей автомобилей будет получать данные из базы данных (динамические списки, так сказать).

Если вы внимательно просмотрите код, заметите в нем ранее нигде не объявленную функцию getModels(). В самом начале кода для файла HTML-формы мы подключили два внешних файла: database.php (для подключения к СУБД) и functions.php (для объявления пользовательских функций). Вот во втором файле и была объявлена функция getModels(). Код самого файла я приведу ниже. А упомянутая функция просто получает из базы данных MySQL перечень производителей автомобилей.

Теперь нашей форме нужно придать какой-нибудь простенький внешний вид. Для этого мы создадим очень небольшой CSS-файл со стилями.

После этого наша форма будет выглядеть примерно вот так:


Приведу код содержимого файла functions.php . Комментарии внутри файла достаточны. Думаю, более ничего дописывать нет необходимости.

Именно в этом файле написан обработчик события выбора производителя, после которого создается AJAX-запрос к веб-серверу, способный вернуть в ответ перечень моделей автомобиля выбранного производителя.

Если вы внимательно просмотрите код JavaScript, увидите, что AJAX-запросы будут отправляться файлу requests.php . Этот файл обратно в ответ на запрос будет отправлять данные. Если говорить конкретно — перечень моделей автомобилей в ответ на выбор производителя машин. Привожу его код.

Вот и всё. Задача решена. Можно выбрать производителя.


После этого можно выбрать модель автомобиля.


Можно сменить производителя. Тогда содержимое списка моделей очистится и обновится новым перечнем.


А можно вообще ничего не выбрать среди производителей. Тогда список моделей сбросится, а потом отключится.


Все файлы, упомянутые в статье, я поместил в архив.

Как я могу выбрать данные в одном запросе из двух разных баз данных, которые находятся на двух разных серверах в SQL Server?

ОТВЕТЫ

Ответ 1

То, что вы ищете, это связанные серверы. Вы можете получить к ним в SSMS из следующего места в дереве обозревателя объектов:

Server Objects-->Linked Servers

или вы можете использовать sp_addlinkedserver.

Вам нужно только настроить один. Когда у вас есть это, вы можете вызвать таблицу на другом сервере следующим образом:

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

Ответ 2

Вы можете сделать это с помощью Linked Server.

Обычно связанные серверы настроены так, чтобы позволить Database Engine выполнять оператор Transact-SQL, который включает таблицы в другом экземпляре SQL Server или другой продукт базы данных, такой как Oracle. Многие типы источников данных OLE DB могут быть настроены как связанные серверы, включая Microsoft Access и Excel.

Связанные серверы предлагают следующие преимущества:

  • Возможность доступа к данным из-за пределов SQL Server.
  • Возможность выдавать распределенные запросы, обновления, команды и транзакции на гетерогенных источниках данных на предприятии.
  • Возможность одинаково обращаться к различным источникам данных.

Для создания связанного сервера выполните следующие действия:

Объекты сервера → Связанные серверы → Новый связанный сервер

Укажите имя удаленного сервера.

Выберите тип удаленного сервера (SQL Server или другое).

Выберите "Безопасность" → Создайте этот контекст безопасности и укажите логин и пароль удаленного сервера.

Нажмите "ОК", и все готово!

Здесь - это простой учебник по созданию связанного сервера.

ИЛИ

Вы можете добавить связанный сервер, используя запрос.

Вам нужно создать связанный сервер только один раз. После создания связанного сервера мы можем запросить его следующим образом:

Ответ 3

Вы также можете посмотреть на использование связанных серверов. Связанными серверами могут быть и другие типы источников данных, такие как платформы DB2. Это один из способов попыток доступа к DB2 с помощью SQLQL TSQL или вызова Sproc.

Ответ 4

Запрос через две разные базы данных - это распределенный запрос. Вот список некоторых методов плюс плюсы и минусы:

  • Связанные серверы: Предоставление доступа к более широкому спектру источников данных, чем репликация SQL Server, обеспечивает
  • Связанные серверы:. Соединитесь с источниками данных, которые не поддерживают репликацию или которые требуют доступа ad hoc.
  • Связанные серверы: Выполнять лучше, чем OPENDATASOURCE или OPENROWSET
  • OPENDATASOURCE и Функции OPENROWSET: Удобно для получения данных из источников данных на разовой основе. OPENROWSET также имеет BULK-объекты, которые могут/не могут потребовать файл формата, который может быть fiddley
  • OPENQUERY: не поддерживает переменные
  • Все - это решения T-SQL. Относительно легко реализовать и настроить
  • Все зависят от соединения между источником и удалением, что может повлиять на производительность и масштабируемость.

Ответ 5

Ответ 6

Это все хорошие ответы, но этот отсутствует, и он имеет свои мощные возможности. Возможно, это не соответствует тому, что хотел ОП, но вопрос был расплывчатым, и я чувствую, что другие могут найти свой путь здесь. Как правило, вы можете использовать 1 окно для одновременного выполнения запроса к нескольким серверам, вот как:

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

Теперь вернитесь к группе, которую вы создали на первом шаге, щелкните правой кнопкой мыши и выберите New Query. Откроется новое окно запроса, и любой выполняемый вами запрос будет выполнен на каждом сервере в группе. Результаты представлены в одном наборе данных с дополнительным именем столбца, указывающим, с какого сервера поступила запись. Если вы используете строку состояния, вы заметите, что имя сервера заменено на несколько.

Ответ 7

У меня была такая же проблема, чтобы подключить SQL_server 2008 к SQL_server 2016, размещенному на удаленном сервере. Другие ответы не спомогли мне прямо. Я пишу здесь свое решение, так как думаю, что оно может быть полезным для кого-то другого.

Расширенный ответ для удаленных соединений БД IP:

Шаг 1: связать серверы

. где SRV_NAME - выдуманное имя. Мы будем использовать его для обращения к удаленному серверу из наших запросов. aaa.bbb.ccc.ddd - это IP-адрес удаленного сервера, на котором размещена ваша БД SQLserver.

Шаг 2: Запустите ваши запросы Например:

Ответ 8

Когда в SSMS подключен к server1.DB1 и попробуйте:

как отмечали другие, если он не работает, потому что сервер не связан.

Не удалось найти сервер DB2 в sys.servers. Убедитесь, что правильный имя сервера. При необходимости выполните хранимую процедуру sp_addlinkedserver, чтобы добавить сервер в sys.servers.

Чтобы добавить сервер:

ссылка: добавить сервер с помощью sp_addlinkedserver Ссылка: [1]: Чтобы добавить сервер с помощью sp_addlinkedserver

Чтобы узнать, что находится в ваших sys.servers, просто запросите его:

Ответ 9

Создал определение Linked Server на одном сервере другому (вам нужно SA для этого), а затем просто ссылайтесь на него с 4-парным именем (см. BOL).

Ответ 10

Ответ 11

поэтому он должен выглядеть следующим образом:

Ответ 12

Объекты сервера --- > связанный сервер --- > новый связанный сервер

В связанном сервере введите имя сервера или IP-адрес для другого сервера и выберите SQL Server В разделе Безопасность выберите (сделайте это с помощью этого контекста безопасности) Записать логин и пароль для другого сервера

Теперь подключитесь, используйте

Ответ 13

Я знаю, что это старый вопрос, но я использую синонимы. Предположительно запрос выполняется в сервере базы данных A и ищет таблицу на сервере базы данных B, которая не существует на сервере A. Затем добавьте синоним в базу данных A, которая вызывает вашу таблицу с сервера B. В вашем запросе не требуется включая любые схемы или разные имена баз данных, просто вызовите имя таблицы в обычном режиме, и оно будет работать.

Нет необходимости связывать серверы, так как синонимы для одного говорят, это своего рода привязка.

Ответ 14

Упрощенное решение для добавления связанных серверов

Выполнять запросы из связанных с локальными БД

Ответ 15

Как @Super9 рассказал об OPENDATASOURCE с использованием аутентификации SQL Server с поставщиком данных SQLOLEDB. Я просто публикую здесь фрагмент кода для одной таблицы в текущей базе данных сервера, где выполняется код, а другой на другом сервере '192.166.41.123'

Итак, per ответ Мехрдада на соответствующий вопрос, Я сделать это что" правильный " столбец таблицы базы данных не хранит список. Скорее, вы должны создать другую таблицу, которая эффективно содержит элементы указанного списка, а затем связать с ней напрямую или через таблицу соединений. Однако тип списка, который я хочу создать, будет состоять из уникальных элементов (в отличие от связанного вопроса фруктовое примеру). Кроме того, элементы в моем списке явно сортировка-это означает, что если я сохраню элементы в другой таблице, мне придется сортировать их каждый раз, когда я обращаюсь к ним. Наконец, список в основном атомарен в том, что каждый раз, когда я хочу получить доступ к списку, я хочу получить доступ ко всему списку, а не только к его части, поэтому кажется глупым выдавать запрос базы данных для сбора частей списка.

решение AKX (связанное выше) заключается в сериализации списка и сохранении его в двоичном столбце. Но это также кажется неудобно, потому что это означает, что я должен беспокоиться о сериализации и десериализации.

есть ли лучшее решение? Если есть is нет лучшего решения, тогда почему? Кажется, что эта проблема должна время от времени возникать.

. просто немного больше информации, чтобы вы знали, откуда я. Как только я только начал понимать SQL и базы данных в целом, я был включен в LINQ to SQL, и поэтому теперь я немного избалован, потому что я ожидайте работы с моей объектной моделью программирования без необходимости думать о том, как объекты запрашиваются или хранятся в базе данных.

кроме того, чтобы дать вам лучшее представление о том, что я: в моей базе данных у меня есть таблица функций это будет иметь список (x,y) пар. (В таблице также будет содержаться другая информация, которая не имеет значения для нашего обсуждения.) Мне никогда не нужно будет видеть часть списка (x,y) пар. Скорее, я возьму их все и выведу на экран. Я позволю пользователю перетаскивать узлы, чтобы время от времени изменять значения или добавлять больше значений на график.

нет, нет "лучшего" способа сохранить последовательность элементов в одном столбце. Реляционные базы данных разработаны в частности для хранения одного значения в комбинации строка / столбец. Чтобы сохранить более одного значения, вы должны сериализовать свой список в одно значение для хранения, а затем десериализовать его при извлечении. Нет другого способа сделать то, о чем вы говорите (потому что то, о чем вы говорите, - это плохая идея, которая вообще не должна быть сделал).

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

в принципе ты нарушаешь называется первая нормальная форма, что является первым шагом в нормализации баз данных.

рискуя упростить вещи, нормализация базы данных-это процесс определения вашей базы данных на основе того, что данные is, Так что вы можете писать осмысленные, последовательные запросы к ним и иметь возможность легко поддерживать его. Нормализация предназначена для ограничения логических несоответствий и коррупции в ваши данные, и в них много уровней. Статья в Википедии о нормализация базы данных на самом деле очень хорошо.

в основном, первое правило (или форма) нормализации гласит, что ваша таблица должна представлять отношение. Это означает, что:

  • вы должны уметь отличать одну строку от любой другой строки (другими словами, таблица должна иметь то, что can служить в качестве первичного ключа. Это также означает, что ни одна строка не должна быть продублированы.
  • любой порядок данных должен определяться данными, а не физическим порядком строк (SQL основан на идее набора, что означает, что только заказ, на который вы должны полагаться, - это то, что вы явно определяете в своем запросе)
  • каждое пересечение строк / столбцов должно содержать одно и только один стоимостью

последняя точка, очевидно, является заметной точкой здесь. SQL предназначен для храните свои наборы для вас, а не для того, чтобы предоставить вам "ведро" для хранения набора самостоятельно. Да, это возможно. Нет, Конец света не наступит. Вы, однако, уже покалечили себя в понимании SQL и лучших практик, которые идут вместе с ним, немедленно прыгнув в использование ORM. LINQ to SQL фантастичен, как и графические калькуляторы. В том же духе, однако, они должны не использоваться в качестве замены для знания того, как процессы, которые они используют на самом деле работа.

теперь ваш список может быть полностью "атомарным", и это может не измениться для этого проекта. Но вы, тем не менее, войдете в привычку делать подобные вещи в других проектах, и в конце концов (вероятно, быстро) столкнетесь со сценарием, в котором вы теперь приспосабливаете свой быстрый-N-легкий подход к списку в столбце, где он совершенно неуместен. Существует не так много дополнительной работы в создании правильной таблицы для того, что вы пытаетесь сохранить, и вы не будете высмеивать других разработчиков SQL когда они увидят дизайн вашей базы данных. Кроме того, LINQ to SQL увидит ваше отношение и даст вам правильный объектно-ориентированный интерфейс для вашего списка автоматически. Почему бы вам отказаться от удобства, предлагаемого вам ORM, чтобы вы могли выполнять нестандартные и неразумные хакерские базы данных?

Из списка видно, что в базе имеются учетные данные суперпользователя root с возможностью подключаться только локально с данного сервера(адреса 127.0.0.1, localhost и имя сервера testhost).
Еще есть системная учетная запись debian-sys-maint служит для внутренних системных целей СУБД MySQL.

В предыдущей части я рассказывал как настроить в конфигурационном файле /etc/mysql/my.cnfудаленное подключение к серверу баз данных MySQL.
Напомню: для этого в параметре bind-address выставляется IP адрес 0.0.0.0 вместо 127.0.0.1, т.е. демон mysqld будет слушать не только локальный интерфейс 127.0.0.1, а все адреса имеющиеся на сервере.
В этой части я расскажу как создать пользователя mysql, какие права выдать для различных пользователей, как выставить пароль и хост с которого будет производиться подключение.

Пользователь для веб сайта
Обычно различные веб приложения которые хранят информацию в базе mysql требуют создать отдельную учетную запись. Создадим пользователя website-user от имени которого будет работать наше веб приложение.
Пользователя можно создать через команду create user, а потом выдать права grant select,insert. но удобнее и быстрее сразу воспользоваться командой grant

Здесь я сразу указал:

  • выдать права GRANT SELECT,INSERT,UPDATE,ALTER,DELETE,CREATE,DROP,INDEX (возможно для вашего веб приложения список прав будет иной, обратитесь к документации веб приложения);
  • на базу website.* — имя базы указывается по маске (все файлы с названием website). Здесь можно указать *.*, тогда пользователь будет иметь права на все базы;
  • 'websiteuser'@'localhost' — имя пользователя, и хост с которого этот пользователь может подключаться в базу;
  • IDENTIFIED BY 'website-password' — указываем пароль пользователя.

Администратор баз данных
В следующем примере создадим учетную запись администратора баз данных который будет подключаться с IP адреса компьютера администратора 192.168.8.10

Выдадим полные права пользователю admin на базу website:

Теперь администратор может подключиться со своего компьютера к серверу баз данных. В этом примере я использовал команду create user, а уже потом grant в принципе разницы нет как будут создаваться пользователи.

Пользователь backup
Создадим пользователя backup для резервного копирования всех базы данных

  • GRANT SHOW DATABASES, SELECT, LOCK TABLES, RELOAD — Здесь я указал необходимый набор прав для удаленного резервного копирования и в то же время достаточный для безопасного бэкапа;
  • *.* — Пользователь backup может просматривать все базы;
  • 'backup'@'%' — пользователь backup может подключаться с любого IP адреса. Обычно не требуется разрешать подключения с любого ip для целей резервного копирования, так как у сервера backup всегда постоянный IP адрес.

Как поменять пароль?
Чтобы поменять пароль можно воспользоваться командой mysqladmin эту команду нужно запускать в bash.

А так же можно воспользоваться командой (SQL синтаксис) из консоли MySQL

Как сбросить пароль root?
Поменять пароль root можно всеми теми же командами, что и для обычного пользователя. Но вот что делать если вы забыли пароль рута или по каким-то причинам его утеряли, тогда проделаем следующие операции.

1) Останавливаем MySQL:

2) Запускаем MySQL с особыми параметрами:

3) Запускаем клиента MySQL:

4) Выполняем запрос SQL:

где newpassword — новый пароль

5) Применяем изменения:

6) Выходим из клиента MySQL:

7) Перезапускаем MySQL сервер:

как создавать из командной строки mysql новую базу данных и нового пользователя mysql с полными правами на только что созданную базу.

Посмотрим существующих пользователей

Дадим права пользователю test на чтение всех таблиц базы scada

Дадим все права пользователю test на все таблицы базы scada

Для того чтобы выставить новому пользователю полные права на все базы данных используем следующую команду:

Доступ к базе для данного пользователя возможен только с localhost. Если вы хотите дать ему доступ к базе с любого хоста, используете % вместо localhost:

Проверить права пользователя :

Удаляются пользователи проще, чем создаются :). Например, если мы решим избавиться от пользователя ’my_user’

Читайте также: