Buderus-trade.ru

Теплотехника Будерус
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

SQL ALTER TABLE

SQL ALTER TABLE

Команда ALTER TABLE используется для добавления, удаления или модификации колонки в уже существующей таблице.

Команда ALTER TABLE

Команда ALTER TABLE изменяет определение таблицы одним из следующих способов:

  • добавляет столбец
  • добавляет ограничение целостности
  • переопределяет столбец (тип данных, размер, умалчиваемое значение)
  • удаляет столбец
  • модифицирует характеристики памяти или иные параметры
  • включает, выключает или удаляет ограничение целостности или триггер.

Условие: Таблица должна быть в схеме пользователя, или пользователь должен иметь системную привилегию ALTER ANY TABLE.

Добавляя столбец с ограничением NOT NULL, разработчик или администратор БД должны учесть ряд обстоятельств. Сначала нужно создать столбец без ограничения, а затем ввести значения во все его строки. После того как все значения столбца станут не NULL-значениями, к нему можно применить ограничение NOT NULL. Если столбец с ограничением NOT NULL пытается добавить пользователь, возвращается сообщение об ошибке, говорящее о том, что либо таблица должна быть пустой, либо в столбце должны содержаться значения для каждой существующей строки (напомним, что после наложения на столбец ограничения NOT NULL в нем не могут присутствовать NULL-значения ни в одной из существующих строк). В СУБД Oracle, начиная с версии 8i, можно удалять столбцы.

Изменяя типы данных существующих столбцов или добавляя столбцы в таблицу базы данных, нужно соблюдать ряд условий. Общепринято, что увеличение – это хорошо, а уменьшение, как правило, — не очень. Допустимые увеличения:

  • Увеличение размера столбца CHAR или VARCHAR2
  • Увеличение размера столбца NUMBER
  • Добавление новых столбцов в таблицу

Уменьшение различных характеристик таблицы, в том числе некоторых типов данных столбцов и реального числа столбцов таблицы, требует особых действий. Часто перед внесением изменения нужно убедиться в том, что в соответствующем столбце или столбцах все значения являются NULL-значениями. Для выполнения подобных операций над столбцами таблицы, содержащими данные, разработчик должен найти или создать какую-то область для временного хранения этих данных. Например, создать таблицу с помощью команды CREATE TABLE AS SELECT, в которой извлекаются данные из первичного ключа и изменяемого столбца или столбцов. Допустимые изменения:

  • Уменьшение размера столбца NUMBER (только при пустом столбце для всех строк)
  • Уменьшение размера столбца CHAR или VARCHAR2 (только при пустом столбце для всех строк)
  • Изменение типа данных столбца (только при пустом столбце для всех строк)

ALTER TABLE Пример 1

Добавление столбца в таблицу:

ALTER TABLE t1(pole1 char(10));

ALTER TABLE Пример 2

Изменение размера столбца таблицы:

ALTER TABLE t1 MODIFY (pole1 char(20));

ALTER TABLE Пример 3

Удаление столбца таблицы:

ALTER TABLE t1 DROP COLUMN pole1;

С помощью команды ALTER TABLE можно изменить имя таблицы без реального переноса физической информации в БД:

ALTER TABLE t1 RENAME TO t2;

Аналогичную операцию можно выполнить с помощью команды RENAME:

RENAME t1 TO t2;

Ограничения целостности столбцов и таблиц БД можно изменять, а также запрещать, разрешать и удалять. Это дает разработчику возможность создавать, модифицировать и удалять бизнес-правила, ограничивающие данные. Рассмотрим добавление ограничений в БД. Простота или сложность этого процесса зависит от определенных обстоятельств. Если вместе с БД создать ограничение нельзя, проще всего добавить его перед вводом данных:

ALTER TABLE Пример 4

Модификация структуры таблицы

ALTER TABLE t1 MODIFY (pole1 NOT NULL);

CREATE TABLE t2

(pole1 CHAR(10) PRIMARY KEY);

ALTER TABLE t1 ADD

(CONSTRAINT fk_t1 FOREIGN KEY (pole1)

REFERENCES t2 (pole1));

ALTER TABLE t1 ADD (UNIQUE (p_name));

ALTER TABLE t1 ADD (p_size CHAR(4) CHECK

(p_size IN (‘P’,’S’,’M’,’L’,’XL’,’XXL’,’XXXL’)));

В первой из приведенных выше команд для добавления ограничения NOT NULL для столбца используется конструкция MODIFY, а для добавления всех табличных ограничений целостности других типов – конструкция ADD. Столбец, для которого добавляется ограничение, должен уже существовать в таблице БД; в противном случае создать ограничение не удастся.

Читайте так же:
Поменять счетчик до июля

ALTER TABLE Пример 5

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

ALTER TABLE t1 ADD FOREIGN KEY (pole1) REFERENCES t2 (pole1);

Существует ряд условий создания ограничений:

  • Первичные ключи: в столбцах не могут содержаться NULL-значения, и все значения должны быть уникальны.
  • Внешние ключи: в тех столбцах других таблиц, на которые производятся ссылки, должны содержаться значения, соответствующие всем значениям ссылающихся столбцов, либо значения этих последних должны быть NULL-значениями.
  • Ограничения UNIQUE: все значения столбцов должны быть уникальными или NULL-значениями.
  • Ограничения CHECK: новое ограничение будет применяться только по отношению к данным, добавляемым или модифицируемым после его создания.
  • NOT NULL: NULL-значения в столбцах запрещены.

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

ALTER TABLE Пример 6

ALTER TABLE t1 DISABLE PRIMARY KEY;
ALTER TABLE t1 DISABLE UNIQUE (p_name);

ALTER TABLE Пример 7

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

ALTER TABLE t2 DISABLE PRIMARY KEY;

Error at line 1: Cannot disable constraint …. – dependencies exist (невозможно запретить ограничение – существуют зависимости)

Для удаления первичного ключа при наличии зависящих от него внешних ключей в команде ALTER TABLE DISABLE <ограничения> обязательна конструкция CASCADE:

ALTER TABLE t2 DISABLE PRIMARY KEY CASCADE;

ALTER TABLE Пример 8

Запрещенное ограничение разрешается следующим образом:

ALTER TABLE t1 ENABLE PRIMARY KEY;

ALTER TABLE t1 ENABLE UNIQUE (p_name);

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

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

ALTER TABLE t1 DROP UNIQUE (p_name);

Изменение таблиц в Microsoft SQL Server или как добавить, удалить, изменить столбец в таблице?

В этом материале я покажу, как вносятся изменения в таблицы в Microsoft SQL Server, под изменениями здесь подразумевается добавление новых столбцов, удаление или изменение характеристик уже существующих столбцов в таблице. По традиции я покажу, как это делается в графическом конструкторе среды SQL Server Management Studio и, конечно же, как это делается на языке T-SQL.

Скриншот 1

Напомню, в прошлых статьях я показывал, как создаются базы данных в Microsoft SQL Server, а также как создаются новые таблицы. Сегодня Вы узнаете, как изменить уже существующие таблицы в Microsoft SQL Server, при этом, как было уже отмечено, будет рассмотрено два способа изменения таблиц: первый – с помощью SQL Server Management Studio (SSMS), и второй – с помощью T-SQL.

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

Заметка! Для комплексного изучения языка T-SQL рекомендую посмотреть мои видеокурсы по T-SQL, в которых используется последовательная методика обучения и рассматриваются все конструкции языка SQL и T-SQL.

Исходные данные для примеров

Сначала давайте определим исходные данные, а точнее таблицу, которую мы будем изменять. Допустим, это будет точно такая же таблица, которую мы использовали в прошлых статьях, а именно наша тестовая таблица Goods – она содержит информацию о товарах и имеет следующие столбцы:

  • ProductId – идентификатор товара, столбец не может содержать значения NULL, первичный ключ;
  • Category – ссылка на категорию товара, столбец не может содержать значения NULL, но имеет значение по умолчанию, например, для случаев, когда товар еще не распределили в необходимую категорию, в этом случае товару будет присвоена категория по умолчанию;
  • ProductName – наименование товара, столбец не может содержать значения NULL;
  • Price – цена товара, столбец может содержать значения NULL, например, с ценой еще не определились.
Читайте так же:
Счетчик напечатанных страниц epson

Если у Вас нет такой таблицы, то создайте ее и добавьте в нее несколько строк данных, например, следующей инструкцией.

Скриншот 2

Данные мы добавили инструкцией INSERT INTO языка T-SQL.

Примечание! В качестве сервера у меня выступает версия Microsoft SQL Server 2017 Express, как ее установить, можете посмотреть в моей видео-инструкции.

Итак, давайте начнем.

Изменение таблиц в конструкторе SQL Server Management Studio

Сначала я покажу, как изменяются таблицы с помощью графического интерфейса SQL Server Management Studio, а изменяются они точно так же, как и создаются, с помощью того же самого конструктора.

Чтобы открыть конструктор таблиц в среде SQL Server Management Studio, необходимо в обозревателе объектов найти нужную таблицу и щелкнуть по ней правой кнопкой мыши, и выбрать пункт «Проект». Увидеть список таблиц можно в контейнере «Базы данных -> Нужная база данных -> Таблицы».

Скриншот 3

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

Скриншот 4

Важно! При работе в конструкторе с таблицей, в которой есть данные, обязательно стоит учитывать один очень важный момент, большинство изменений внести не получится, например, изменить свойства столбцов. Это связано с тем, что по умолчанию в конструкторе «Запрещено сохранение изменений, требующих повторного создания таблицы», именно так и называется параметр, который по умолчанию включён, за счет чего все соответствующие изменения будут блокироваться и, при попытке сохранить такие изменения, Вы будете получать, например, ошибки следующего характера

Скриншот 5

В случае если Вы работаете исключительно в конструкторе (если делать все то же самое с помощью T-SQL, то такая ошибка возникать не будет) и четко уверены в своих действиях, то этот параметр можно отключить. Для этого зайдите в меню «Сервис -> Параметры» и в разделе «Конструкторы -> Конструкторы таблиц и баз данных» снимите соответствующую галочку.

Скриншот 6

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

Как работать с конструктором, я думаю, понятно, например, для добавления нового столбца просто пишем название столбца в новую строку, выбираем тип данных и указываем признак, может ли данный столбец хранить значения NULL. Для сохранения изменений нажимаем сочетание клавиш «Ctrl+S» или на панели инструментов нажимаем кнопку «Сохранить» (также кнопка «сохранить» доступна и в меню «Файл», и в контекстном меню самой вкладки конструктора).

Скриншот 7

Для внесения изменений в существующие столбцы точно так же изменяем параметры, и сохраняем изменения.

Важно!

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

Например, изменить тип данных можно, только если он явно преобразовывается без потери данных или в столбце нет данных вообще. Допустим, если в столбце с типом данных VARCHAR(100) есть данные, при этом максимальная длина фактических данных в столбце, к примеру, 80 символов, то изменить тип данных, без потери данных можно только в сторону увеличения или уменьшения до 80 символов (VARCHAR(80)).

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

Читайте так же:
Инструкция по эксплуатации счетчика се 102

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

Изменение таблиц в Microsoft SQL Server на языке T-SQL (ALTER TABLE)

Теперь давайте я покажу, как изменять таблицы в Microsoft SQL Server на T-SQL. Все изменения в таблицы вносятся с помощью инструкции ALTER TABLE. Для начала давайте рассмотрим упрощённый синтаксис инструкции ALTER TABLE, чтобы Вы лучше понимали структуру тех запросов, которые мы будем рассматривать далее в примерах.

Упрощенный синтаксис инструкции ALTER TABLE

Добавление нового столбца в таблицу на T-SQL

Чтобы добавить новый столбец в таблицу, мы пишем инструкцию ALTER TABLE с параметром ADD, указываем название нового столбца (в нашем случае ProductDescription, т.е. описание товара), его тип данных и возможность принятия значения NULL (как было уже отмечено ранее, если в таблице есть строки, то сначала столбец должен принимать значения NULL).

Скриншот 8

Удаление столбца из таблицы на T-SQL

Если Вам столбец не нужен, то его легко удалить (если он не участвует ни в каких связях) параметром DROP COLUMN, например, мы передумали добавлять новый столбец с описанием товара, и чтобы его удалить, пишем следующую инструкцию.

Скриншот 9

Задаем свойство NOT NULL для столбца на T-SQL

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

Допустим, в нашем случае цена стала обязательной, чтобы это реализовать в нашей таблице, пишем следующую инструкцию (просто указываем все фактические параметры столбца и изменяем тот, который нужно, в данном конкретном случае возможность принятия значения NULL).

Изменяем тип данных столбца на T-SQL

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

Допустим, у нас возникла необходимость увеличить длину строки для хранения наименования товара (например, до 200 символов).

Работа с MS SQL в Delphi. Создаем поле-счетчик в таблицах MS SQL Server

ms-sql-server-delphi

Доброго времени суток дорогие друзья. Давненько я ничего не писал. Решил написать статью про Microsoft SQL Server, так как много вопросов было по этому поводу, а если быть точным, то о том, как можно создать поле Счетчик в MS SQL Server.

Все знают замечательный тип данных в MS Access – Счетчик, который сам увеличивает значение при добавлении новой строке данных в таблицу. Многие бы хотели сделать тоже самое и в Microsoft SQL Server. Это возможно и очень просто, поэтому в данной статье мы рассмотрим эту возможность. Кроме этого, я расскажу: как я создаю БД, к ним таблицы и другие данные. Ну и напоследок, мы рассмотрим, как можно подключиться к SQL Server через ADO в Delphi.

Ничего сложного нет и для начала нам необходим MS SQL Server, который можно взять с официального сайта Microsoft (я установил 2005 версию). Поэтому скачиваете, если у Вас нет его еще, устанавливаете и запускаете. Для создания баз данных, их редактирования, присоединения к серверу, я использую среду Microsoft SQL Server Management Server Studio Express. Если честно, то довольно мощное средство. Поэтому, для нашей статьи, данное программное обеспечением нам также понадобится. Его Вы также можете скачать с официального сайта Microsoft, делаем это и устанавливаем.

После того как у нас установлен MS SQL Server и приложение для доступа к нашему серверу, нам необходимо подключиться к нему. Поэтому, запускаем SQL Server Management Server Studio Express и подключаемся к нашему серверу (из списка выбрать нужный сервер, если у Вас их несколько):

Читайте так же:
Кто должен поверять счетчик наниматель или собственник

ms-sql-server-delphi_1

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

ms-sql-server-delphi_2

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

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

ms-sql-server-delphi_3

В следующем окне нам необходимо создать таблицу: задать список полей, задать имя таблицы и внимание. Задать типы данных полей, в том числе и для нашего поля-счетчика. Если Вы определились со списком полей, с именем таблицы и с типами, то давайте зададим тип счетчик для нашего поля. Оно у меня называется id и тип я ему задал int:

ms-sql-server-delphi_4

Для того чтобы в нем увеличивалось значение на единицу автоматически, Вам необходимо перейти в окно Свойства столбцов, которое находится ниже. То есть, Вы выделяете наш столбец (id) и переходим в его свойства, где находим свойство – Спецификация идентифицирующего столбца. Раскрываем данное свойство и в поле (Является идентифицирующим столбцом) устанавливаем значение Да.

Дальше у Вас станут доступны следующие свойства: Начальное значение и Приращение. Вы можете при помощи них задать значение, с которого у Вас будет начинаться счетчик, а также значение – на которое у Вас будет увеличиваться счетчик. Все, сохраняете таблицу, затем открываете ее в среде и пробуйте ввести какие-то значение, поле id у Вас будет не доступно для ввода, так как его значение будет формироваться автоматически:

ms-sql-server-delphi_5

Вот так вот, теперь Вы знаете, как можно создать поле Счетчик в таблицах базы данных MS SQL Server. Ничего в этом сложного нет. Нам теперь остается лишь рассмотреть возможность подключение к базе данных SQL Server в Delphi, при помощи компонентов ADO. Ну что, давайте приступим к рассмотрению нашей последней части статьи.

Устанавливаем на форму компонент TADOConnection и TADOQuery, связываем их. В свойстве Connection компонента TADOQuery указываем имя компонента TADOConnection. Затем выделяем компонент TADOConnection и следующие его свойства устанавливаем в значения:

  • Mode=cmShareDenyWrite
  • LoginPromt=False

Открываем свойства ConnectionString и настраиваем строку подключения к нашему серверу и соответственно базе данных. В первой вкладке, выбираем поставщика данных – Microsoft OLE DB Provider for SQL Server, затем нажимаем кнопку Далее>>, где указываем имя сервера, а затем и имя нашей базы данных.

ms-sql-server-delphi_6

Все, затем нажимаем на кнопку Проверить подключение, если оно прошло успешно, то нажимаем на кнопку ОК и устанавливаем свойство Connected компонента TADOConnection в True.

Вот примерно и все. Далее Вы можете делать запросы, либо работать с данными SQL Server как и в работа с ADO в Delphi.

Кстати, Вы можете присоединить свою базу данных к серверу при помощи среды Microsoft SQL Server Manegement Studio Express, либо же при помощи Delphi (когда делаете подключение). В итоге, в данной статье мы рассмотрели ответы на следующие вопросы (которые задавали Вы):

  • Создать базу данных на SQL Server
  • Создать таблицу
  • Создать поле Счетчик в таблице MS SQL Server
  • Подключиться к MS SQL Server в Delphi (использовали технологию ADO)
  • Присоединить БД к MS SQL Server
Читайте так же:
Счетчики для учета рабочего времени

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

Настройка системного монитора для контроля производительности Windows и MS SQL Server

При работе с любой системой необходимо понимать качество ее работы. Для этого необходимо собирать, контролировать и анализировать определенные показатели этой системы. В данной статье мы рассмотрим «экспресс» настройку инструмента «Системный монитор» (performance monitor, perfmon), входящий в поставку операционной системы Windows, а так же рассмотрим какие показатели нас интересуют в первую очередь при мониторинге системы на базе Windows и MS SQL Server.

Создание группы сборщиков данных

Во-первых, нам необходимо открыть «Системный монитор». Для этого можно воспользоваться командной Win+R, в строке ввести команду perfmon.exe и нажать ОК. Альтернативой способ: перейти в «Панель управления» (Control panel) → «Администрирование» (Administrative tools) → «Системный монитор» (Performance monitor). После этого необходимо в дереве (в окне системного монитора) перейти в «Группы сборщиков данных» (Data Collector Sets), далее «Особый» (User Defined), сделать клик правой клавишей мыши, в контекстном меню выбрать «Создать» (New) → Группа сборщиков данных (Data Collector Set)».

Создание группы сборщиков данных в системном мониторе

Создание группы сборщиков данных в системном мониторе

В открывшемся окне зададим пользовательское имя для группы и выберем «Создать вручную (для опытных)» (Create manually (advanced)) и кнопку «Далее» (Next).

Зададим имя группы сборщика данных и вариант создания "вручную"

Зададим имя группы сборщика данных и вариант создания «вручную»

На следующем шаге укажем «Создать журналы данных» (Create data logs) и выберем «Счетчик производительности» (Performance counter).

Выбор типа данных группы сборщиков

Выбор типа данных группы сборщиков

Далее установим интервал выборки (sample interval) в значение 5 секунд и нажмем «Добавить» (Add).

Установим интервал выборки и нажмем "Добавить"

Установим интервал выборки и нажмем «Добавить»

В новом окне в списке «Имеющиеся счетчики» (Available counters) найдем интересующий нас счетчик, например, «% загруженности процессора» (% processor time), из списка «Экземпляры выбранного объекта» (Instances of selected object) выберем интересующий нас, например, «_Total» и нажмем «Добавить» (Add), после чего счетчик появится в правом окне «Добавленные счетчики» (Added counters). Если Вы плохо знакомы с назначением счетчиков, тогда стоит установить флажок «Отображать описание» (Show description), при включении которого будет выведено окошко с описанием счетчика. Нажмем «ОК» и вернемся к предыдущему окну, в котором нажмем «Далее» (Next). Список наиболее интересных счетчиков, их назначение и рекомендуемые интервалы значений будут приведены ниже в этой статье.

Добавление счетчиков производительности

Добавление счетчиков производительности

На следующем этапе необходимо указать системе в каком каталоге будут сохраняться данные группы сборщиков и нажать «Далее» (Next)

Выбор каталога хранения

Выбор каталога хранения

И, наконец, на последней странице мастера создания группы сборщиков данных необходимо выбрать одно из завершающих действий: «Открыть свойства группы сборщиков данных» (Open properties for this data collector set) — для более тонкой настройки группы, которую можно выполнить и в любой момент позднее; «Запустить группу сборщиков данных сейчас» (Start this data collector set now) — для того чтобы сохранить и начать замер немедленно; «Сохранить и закрыть» (Save and close) — только для того чтобы сохранить.

На этом «экспресс» создание группы сборщиков данных завершено, теперь давайте же вернемся к вопросу о том какие счетчики нас интересуют.

Счетчики производительности

В таблицах ниже приведены наиболее интересные счетчики производительности для ОС Windows и MS SQL Server. Там же можно найти описания счетчиков и рекомендуемые значения показателей.

голоса
Рейтинг статьи
Ссылка на основную публикацию
Adblock
detector