Топ-100

Редактор SQL запросов для СУБД MSSQL SERVER

Не нашли нужных функций? Пишите в комментариях на форуме и мы добавим нужный функционал
Создание нового листа
  1. Нажать кнопку "New list "MS SQL"" в окне редактора

  2. File -> New -> MSSQL Server

  3. Комбинация клавиш: Ctrl+F5

 
 
Менеджер соединений с сервером MS SQL

Group filter

Фильтр для отображения списка сохраненных соединений определенной группы  

Подключение к серверу MS SQL
  • Alias - синоним соединений

  • Group name - имя группы в списке соединений

  • Server name - DNS имя или IP адрес сервера

  • Port - порт на котором работает MSSQL (по умолчанию 1433)

  • Database - имя базы данных (по умолчанию база данных пользователя)

  • Authentication type - способ аутентификации в базе данных

    • Windows authentication - аутентификация на основе имени пользователя в  ОС 

    • MS SQL authentication - аутентификация на основе введенного логина и пароля

Если метод аутентификации "MS SQL authentication" 

  • User name - имя пользователя в БД

  • Password - пароль пользователя

Подключение к серверу Azure
  • Alias - синоним соединений

  • Group name - имя группы в списке соединений

  • Server name - DNS имя или IP адрес сервера

  • Port - порт на котором работает MSSQL (по умолчанию 1433)

  • Database - имя базы данных (по умолчанию база данных пользователя)

  • Authentication type - способ аутентификации в базе данных

    • MS SQL authentication - аутентификация на основе введенного логина и пароля

    • AZURE active directory - аутентификация на основе логина и пароля в домене Azure

  • Encrypt traffic -> Yes - шифровать трафик  

Если метод аутентификации "MS SQL authentication" 

  • User name - имя пользователя в БД

  • Password - пароль пользователя

Если метод аутентификации "AZURE active directory" 

  • User name - логин домене azure в формате логин@домен

  • Password - пароль

  • Provider - имя провайдера соединения (ODBC Driver 17 for SQL Server, ODBC Driver 16 for SQL Server, ...)

После подключения к СУБД, смена текущей базы выполняется в том числе, через выпадающий список "Current database".​

Для отключения от БД всех соединений текущего листа нажать на кнопку "Disconnect

Дерево объектов
 

Дерево объектов - интерфейс для визуализации структуры кластера, управления объектами. 

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

-----

Каждый лист создает несколько соединений с БД:

  • соединение для отображения информации в дереве объектов

  • соединение для выполнения SQL запросов, команд (основной процесс)

  • соединение для выполнения SQL запросов, команд (дополнительный процесс)

 
DATABASE

Список баз данных созданных на сервере MSSQL Server

->Запрос для извлечения данных<-

select d.name, lower(d.state_desc) "state_desc"
  from sys.databases d with (nolock)
order by d.database_id

-----

SCHEMA LIST

->Запрос для извлечения данных<-

SELECT s.name AS schema_name
  FROM tdb.sys.schemas s 
where schema_id <10000
ORDER BY s.name 

-----

 
TABLE

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

->Запрос для извлечения данных<-

select s.name "Schemaname",
       t.name "Tablename",
       t.object_id
  from $$DBNAME.sys.tables t,
       $$DBNAME.sys.schemas s
where t.schema_id = s.schema_id
   and s.name =$$SCHEMANAM

-----

Меню:

  • Edit data tablle (show all) - открыть таблицу в режиме редактирования записей. В сетке добавляется панель редактора данных. Таблица открывается полностью но в сетке выводятся первые 50 строк.

  • Show data (top 100) - вывести в сетке первые 100 записей в таблице

  • Get source - сформировать и добавить в редактор код создания таблицы и ее индексов

  • Script - select - сформировать и добавить в редактор текст запроса для выборки данных из таблицы. 

  • Script - insert - сформировать и добавить в редактор текст команды insert для вставки данных из таблицу.

  • Export data to CSV - запустить мастер выгрузки данных из таблицы  

  • Import data from CSV - запустить мастер импорта данных из CSV файла в выбранную таблицу

Узел "COLUMNS"

Список колонок таблицы с указанием типа данных

->Запрос для извлечения данных<-

select c.name "ColumnName",
       t.name "CoolumnType",
       c.max_length,
       c.precision,
       c.scale
  from $$DBNAME.sys.columns c,
       $$DBNAME.sys.types t
  where object_id =$$OBJECT_ID
    and c.user_type_id = t.user_type_id
order by c.column_id

-----

Узел "INDEXES"

Список индексов построенных по колонкам таблицы

 
 

Список индексов с подробной информацией

->Запрос для извлечения данных<-

SELECT
  Object_id = ind.object_id,
  TableName = t.name,
  IndexName = ind.name,
  IndexId = ind.index_id,
  ind.type_desc,
  ind.is_unique,
  ind.ignore_dup_key,
  ind.is_primary_key,
  ind.is_unique_constraint,
  ind.fill_factor,
  ind.is_disabled,
  ind.is_ignored_in_optimization,
  ind.compression_delay
FROM
  tdb.sys.indexes ind INNER JOIN tdb.sys.tables t ON ind.object_id = t.object_id
inner join tdb.sys.schemas sch on sch.schema_id = t.schema_id
where sch.name = $$SCHEMA_NAME
    and t.name =$$TABLE_NAME
    and ind.name is not null

-----

Список о колонок по которым построен индекс

->Запрос для извлечения данных<-

SELECT col.name
  FROM tdb.sys.indexes ind
       INNER JOIN tdb.sys.index_columns ic ON  ind.object_id = ic.object_id and ind.index_id = ic.index_id
       INNER JOIN tdb.sys.tables t ON ind.object_id = t.object_id
       INNER JOIN tdb.sys.columns col ON ic.object_id = col.object_id and ic.column_id = col.column_id
where ind.name = $$INDEX_NAME
   and t.name   =$$TABLE_NAME
order by ic.index_column_id

-----

Узел "CONSTRAINTS"

Список ограничений таблицы

 

->Запрос для извлечения данных<-

select table_view,
    object_type,
    constraint_type,
    constraint_name,
    details
from (
    select schema_name(t.schema_id) + '.' + t.[name] as table_view,
        case when t.[type] = 'U' then 'Table'
            when t.[type] = 'V' then 'View'
            end as [object_type],
        case when c.[type] = 'PK' then 'Primary key'
            when c.[type] = 'UQ' then 'Unique constraint'
            when i.[type] = 1 then 'Unique clustered index'
            when i.type = 2 then 'Unique index'
            end as constraint_type,
        isnull(c.[name], i.[name]) as constraint_name,
        substring(column_names, 1, len(column_names)-1) as [details]
    from $$DBNAME.sys.objects t
        left outer join $$DBNAME.sys.indexes i
            on t.object_id = i.object_id
        left outer join $$DBNAME.sys.key_constraints c
            on i.object_id = c.parent_object_id
            and i.index_id = c.unique_index_id
       cross apply (select col.[name] + ', '
                        from $$DBNAME.sys.index_columns ic
                            inner join $$DBNAME.sys.columns col
                                on ic.object_id = col.object_id
                                and ic.column_id = col.column_id
                        where ic.object_id = t.object_id
                            and ic.index_id = i.index_id
                                order by col.column_id
                                for xml path ('') ) D (column_names)
    where is_unique = 1
    and t.is_ms_shipped <> 1
    union all
    select schema_name(fk_tab.schema_id) + '.' + fk_tab.name as foreign_table,
        'Table',
        'Foreign key',
        fk.name as fk_constraint_name,
        schema_name(pk_tab.schema_id) + '.' + pk_tab.name
    from $$DBNAME.sys.foreign_keys fk
        inner join $$DBNAME.sys.tables fk_tab
            on fk_tab.object_id = fk.parent_object_id
        inner join $$DBNAME.sys.tables pk_tab
            on pk_tab.object_id = fk.referenced_object_id
        inner join $$DBNAME.sys.foreign_key_columns fk_cols
            on fk_cols.constraint_object_id = fk.object_id
    union all
    select schema_name(t.schema_id) + '.' + t.[name],
        'Table',
        'Check constraint',
        con.[name] as constraint_name,
        con.[definition]
    from $$DBNAME.sys.check_constraints con
        left outer join $$DBNAME.sys.objects t
            on con.parent_object_id = t.object_id
        left outer join $$DBNAME.sys.all_columns col
            on con.parent_column_id = col.column_id
            and con.parent_object_id = col.object_id
    union all
    select schema_name(t.schema_id) + '.' + t.[name],
        'Table',
        'Default constraint',
        con.[name],
        col.[name] + ' = ' + con.[definition]
    from $$DBNAME.sys.default_constraints con
        left outer join $$DBNAME.sys.objects t
            on con.parent_object_id = t.object_id
        left outer join $$DBNAME.sys.all_columns col
            on con.parent_column_id = col.column_id
            and con.parent_object_id = col.object_id) a
where a.table_view = $$TABLE_SCHEMA.$$TABLE_NAME
order by table_view, constraint_type, constraint_name

-----

 
Узел "TRIGGERS"

Список триггеров на таблице

->Запрос для извлечения данных<-

select tr.name,
       tr.object_id,
       tr.create_date,
       tr.is_ms_shipped,
       tr.is_disabled,
       tr.is_not_for_replication,
       t.name "table_name",
       sc.name "schema_name"
  from $$DBNAME.sys.triggers tr,
       $$DBNAME.sys.tables t,
       $$DBNAME.sys.schemas sc
where tr.parent_id = t.object_id
   and t.schema_id = sc.schema_id
   and tr.parent_id = $$OBJECT_ID
order by sc.name, t.name, tr.name

-----

 
Узел "SIZE"

Информация о текущем размере таблицы и ее индексов, свободном месте

->Запрос для извлечения данных<-

SELECT
  t.Name                                       AS TableName,
  s.Name                                       AS SchemaName,
  p.Rows                                       AS RowCounts,
  SUM(a.total_pages) * 8                       AS TotalSpaceKB,
  SUM(a.used_pages) * 8                        AS UsedSpaceKB,
  (SUM(a.total_pages) - SUM(a.used_pages)) * 8 AS UnusedSpaceKB
FROM
  $$DBNAME.sys.tables t
  INNER JOIN $$DBNAME.sys.indexes i ON t.object_id = i.object_id
  INNER JOIN $$DBNAME.sys.partitions p ON i.object_id = p.object_id AND i.index_id = p.index_id
  INNER JOIN $$DBNAME.sys.allocation_units a ON p.partition_id = a.container_id
  LEFT OUTER JOIN $$DBNAME.sys.schemas s ON t.schema_id = s.schema_id
WHERE
  t.Name = $$TABLE_NAME
  and S.name = $$SCHEMA_NAME
  AND t.is_ms_shipped = 0
  AND i.object_id > 255
GROUP BY
  t.Name, s.Name, p.Rows

-----

 
VIEW

Список представлений в выбранной БД сгруппированные по схемам

->Запрос для извлечения данных<-

SELECT av.name
FROM $$DBNAME.sys.all_views av,
     $$DBNAME.sys.schemas s
where s.schema_id=av.schema_id
  and s.name ='dbo'
order by 1

-----

Меню:

  • Show data - показать данные представления. Выбираются первые 100 строк в режиме грязного чтения (with (nolock))

  • Get source - сформировать и вывести в редактор команду на создание представления

 
SYNONYM

Список синонимов в выбранной БД сгруппированный по схемам

->Запрос для извлечения данных<-

select s.name,
       s.object_id,
       s.create_date,
       s.modify_date,
       s.is_ms_shipped,
       s.is_published,
       s.base_object_name
  from $$DBNAME.sys.synonyms s,
       $$DBNAME.sys.schemas sc
where s.schema_id = sc.schema_id
   and sc.name = $$SCHEMA_NAME

-----

 
PROCEDURE

Список процедур в выбранной БД сгруппированный по схемам

->Запрос для извлечения данных<-

select o.name "name", o.object_id
  from $$DBNAME.sys.all_objects o,
       $$DBNAME.sys.schemas s
where o.type in ('P','PC')
   and o.schema_id = s.schema_id
   and lower(s.name) = lower('sys')
order by 1

-----

Меню

  • Get source - сформировать и добавить в редактор текст команды создания процедуры

->Запрос для извлечения данных<-

use $$DBNAME

go

SELECT OBJECT_DEFINITION (OBJECT_ID(N'$$SCHEMA_NAME.$$PROCEDURE_NAME')) AS [Definition]

-----

 
FUNCTION

Список функций в выбранной БД сгруппированный по схемам

->Запрос для извлечения данных<-

select o.name "name", o.object_id
  from tdb.sys.all_objects o,
       tdb.sys.schemas s
where o.type in ('AF','FN','FS','FT','IF') 
   and o.schema_id = s.schema_id
   and lower(s.name) = lower($$SCHEMA_NAME) 
order by 1

-----

Меню

  • Get source - сформировать и добавить в редактор текст команды создания процедуры

->Запрос для извлечения данных<-

use $$DBNAME

go

SELECT OBJECT_DEFINITION (OBJECT_ID(N'$$SCHEMA_NAME.$$PROCEDURE_NAME')) AS [Definition]

-----

 
TRIGGER

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

->Запрос для извлечения данных<-

select tr.name,
       tr.object_id,
       tr.create_date,
       tr.is_ms_shipped,
       tr.is_disabled,
       tr.is_not_for_replication,
       t.name "table_name",
       sc.name "schema_name"
  from $$DBNAME.sys.triggers tr,
       $$DBNAME.sys.tables t,
       $$DBNAME.sys.schemas sc
where tr.parent_id = t.object_id
   and t.schema_id = sc.schema_id
order by sc.name, t.name, tr.name

-----

Меню

  • Disable trigger - сформировать и добавить в редактор команду для отключения триггер

  • Enable trigger - сформировать и добавить в редактор команду для включения триггера

  • Get source - сформировать и добавить в редактор текст команды на создание триггера

 
TYPE

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

->Запрос для извлечения данных<-

select t.name
  from $$DBNAME.sys.types t,
       $$DBNAME.sys.schemas s
where s.schema_id = t.schema_id
   and s.name = $$SCHEMA_NAME
order by t.name 

-----

 
SEQUENCE

Список последовательностей созданных в выбранной БД сгруппированный по схемам 

->Запрос для извлечения данных<-

select s.name,
       s.object_id,
       s.create_date,
       s.modify_date,
       s.start_value,
       s.current_value,
       s.maximum_value
  from $$DBNAME.sys.sequences s,
       $$DBNAME.sys.schemas sc
where sc.schema_id = s.schema_id
   and sc.name = $$SCHEMA_NAME
order by s.name

-----

 
SECURITY

Список ролей и пользователей созданных на сервере MSSQL

->Запрос для извлечения данных<-

select createdate,
       updatedate,
       name,
       dbname,
       language,
       denylogin,
       hasaccess,
       case when isntname = 1
            then 'USER'
            else 'SYSTEM' end "isntname",
       case when isntgroup = 1
            then 'GROUP'
            else 'USER' end "isntgroup",
       sysadmin,
       securityadmin,
       serveradmin,
       setupadmin,
       processadmin,
       diskadmin,
       dbcreator,
       bulkadmin
  from master.sys.syslogins
  order by name desc

-----

 
 
MONITOR

Единый центр управления, мониторинга и оптимизации

Страница "SESSION LIST"

Список сессий на сервере MSSQL

Список сессий, обновляется в ручную нажатием кнопки "Refresh list session" или нажатием клавиши F5

->Запрос для извлечения данных<-

exec sp_who2

-----

При выделении строки в списке сессий, в блоке "Details" отображается подробная информация о сессии, в поле Query выводится текст текущего SQL запроса

->Запрос для извлечения данных<-

SELECT (SELECT [text]
          FROM sys.dm_exec_sql_text(sql_handle)) AS SqlCommand,
       spid AS [Process ID], status AS [Status],
       hostname AS [Host Name],
       hostprocess AS [Host Process],
       SPACE(3) AS [Company],
       0 AS [Task],
       SPACE(64) AS [Description],
       loginame AS [User],
       open_tran AS [Open Trans],
       cmd AS [Command],
       blocked AS [Blocked],
       CONVERT(VARCHAR(19), waittime) AS [Wait Time],
       [Waiting] = Case waittype
                     WHEN 0x0000 THEN SPACE(256)
                     Else waitresource END,
       login_time AS [Login Time],
       SPACE(64) AS [WTS Client], SPACE(12) AS [WTS ID],
       program_name AS [Application]
  FROM sys.sysprocesses WITH (NOLOCK)
WHERE spid = $$SESSION_ID

-----

При переключении на вкладку "PLAN" отображается план выполнения запроса

Страница "Missing indexes"

Список индексов необходимых для оптимизации работы запросов (повышение производительности работы БД).

Обновление списка рекомендованных индексов осуществляется по нажатию кнопки F5

 

->Запрос для извлечения данных<-

SELECT TOP 100  
       dm_mid.database_id AS DatabaseID,
       dm_migs.avg_user_impact*(dm_migs.user_seeks+dm_migs.user_scans) Avg_Estimated_Impact,
       dm_migs.last_user_seek AS Last_User_Seek,
       OBJECT_NAME(dm_mid.OBJECT_ID,dm_mid.database_id) AS [TableName],
       'CREATE INDEX [IX_' + OBJECT_NAME(dm_mid.OBJECT_ID,dm_mid.database_id) + '_'
          + REPLACE(REPLACE(REPLACE(ISNULL(dm_mid.equality_columns,''),', ','_'),'[',''),']','')
          + CASE
             WHEN dm_mid.equality_columns IS NOT NULL
              AND dm_mid.inequality_columns IS NOT NULL THEN '_'
             ELSE ''
             END
          + REPLACE(REPLACE(REPLACE(ISNULL(dm_mid.inequality_columns,''),', ','_'),'[',''),']','')
          + ']'
          + ' ON ' + dm_mid.statement
          + ' (' + ISNULL (dm_mid.equality_columns,'')
          + CASE WHEN dm_mid.equality_columns IS NOT NULL AND dm_mid.inequality_columns 
            IS NOT NULL THEN ',' ELSE '' END
          + ISNULL (dm_mid.inequality_columns, '')
          + ')'
          + ISNULL (' INCLUDE (' + dm_mid.included_columns + ')', '') AS Create_Statement 
FROM sys.dm_db_missing_index_groups dm_mig 
     INNER JOIN sys.dm_db_missing_index_group_stats dm_migs 
        ON dm_migs.group_handle = dm_mig.index_group_handle
     INNER JOIN sys.dm_db_missing_index_details dm_mid
        ON dm_mig.index_handle = dm_mid.index_handle
ORDER BY Avg_Estimated_Impact DESC 

-----

Страница "Wait stats"

Статистика по ожиданиям сессий в базах данных MSSQL отсортированная по частоте появления

 
 

->Запрос для извлечения данных<-

SELECT TOP 30
[Wait_type] = wait_type,
[Wait_time] = wait_time_ms / 1000,
[waiting] = CONVERT(DECIMAL(12,2), wait_time_ms * 100.0
               / SUM(wait_time_ms) OVER())
FROM sys.dm_os_wait_stats
WHERE wait_type NOT LIKE '%SLEEP%'
ORDER BY wait_time_ms DESC

-----

Страница "Edit configuration"

Редактор параметров сервера MS SQL

->Запрос для извлечения данных<-

select s.configuration_id,
       s.name,
       s.value,
       s.minimum,
       s.maximum,
       s.value_in_use,
       s.description,
       s.is_dynamic,
       s.is_advanced
  from master.sys.configurations s
order by name

-----

Изменение значения параметра

  • Выбрать базу из списка "Database name"

  • В списке "Parameter list" выбрать нужный параметр конфигурации

  • В поле "New value" ввести новое значение

  • Нажать кнопку "Apply"

Страница "Server log"

Просмотр логов работы MSSQL Server

 
 

Кнопки управления

  • Execute current SQL - Выполнить текущий выделенный запрос или все запросы на листе 

Execute - аналогично нажатию на кнопку

To run the script from a file - выполнить скрипт с диска. Скрипт не загружается в редактор.

Check the script file for validate - проверить на корректность скрипт на диске без его выполнения

Show a list of command for execute - произвести разбор команд в редакторе на блоки выполнения. Выводится внутренний код и текст единичной команды

  • Commit - зафиксировать изменения

  • Rollback - откатить изменения внесенные в данные последними запросами

  • Stop execute - остановить выполнение текущего запроса

  • Close open cursor - закрыть текущий набор данных

  • Show plan - показать план выполнения выделенного запроса

->Запрос для извлечения данных<-

EXPLAIN VERBOSE <query> 

-----

  • Export data in file - выгрузка данных грида (видимой части данных) в файл на диске в:

Export data in XLS - выгрузить данные в файл в формате XLS

Export data in TXT - выгрузить данные в файл в формате TXT

Export data in CSV - выгрузить данные в файл в формате CSV

Export data in HTML - выгрузить данные в файл в формате HTML

Export data in RTF - выгрузить данные в файл в формате RTF

  • Save current list in file - сохранить содержимое текущего листа в файл на диске

  • Open file - открыть менеджер файлов

  • List saving code - открыть менеджер создания блоков кода. Блоки кода - это конструкции кода сохраненные в программе, доступ к которым осуществляется из выпадающего меню кнопки

Создание блока кода

  1. Нажать кнопку "New"

  2. Из выпадающего списка "Parent name" выбрать имя корневого узла. Корневой узел так же является родителем в меню. Для добавления новой записи в список нажать кнопку "Add new parent" и внести новые значения

  3. Из выпадающего списка "Page type" выбрать тип СУБД для которых должен отображаться блок кода в списке

  4. В поле "Code" ввести текст блока кода, данный текст добавляется в редактор

  5. Нажать кнопку "Save

 
 
  • Project manager - открыть менеджер проектов

Рабочая область

 

Это поле на листе для ввода запросов/команд.

Разделение кода на составные части

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

Для разделения кода используются специальные символы (; - точка с запятой, / - слеш, go - ключевое слово на отдельной строке).

Программа поддерживает два синтаксиса кода:

  • Классический синтаксис Oracle: для отделения команд друг от друга используется символ ; (точка с запятой) за исключением команд create, begin, declate - данные команды отделяет от других символ / (слеш) на отдельной строке

  • Синтаксис MSSQL Server: для отделения команд друг от друга используется ключевое слово go на отдельной строке

Разрешено использовать любой из двух синтаксисов, в том числе оба одновременно

 

Логирование выполняемых операций

Текст любой команды/запроса языка SQL после выполнения сохраняется в локальном хранилище (база Core - таблица cer_history_query). В базе фиксируется: текст запроса/команды фактически выполненной ядром программы, статус выполнения, время выполнения, количество измененных строк, сообщения БД (output)

Дополнительно к сохранению данных в БД прогресс выполнения каждой команды фиксируется на вкладке "Messages" листа: отображается статус выполнения команд, время выполнения, номера строк в редакторе на которых располагается выполненная команда. Данные вкладки очищаются перед запуском выполнения команд

 

Иконки в левой части окна отображают прогресс выполнения(выполненные команды, текущая команда, ожидают выполнения, ошибка выполнения запроса, строка с ошибкой в запросе)

Подсказчик кода

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

Для схем - отображаются все объекты схемы

Для алиасов таблиц, представлений - список колонок

 

По части имени объекта - отображаются объекты в БД имя которых начинается с введенного текста. Подсказка отображается по комбинации клавиш Crtl+Space

 
Алиасы запросов

В программе для запросов можно назначить алиас и в последствии выполнять запрос по нему, подробно смотрите в разделе "Диспетчер алиасов запросов"

Меню рабочей области
  • Copy - скопировать выделенный текст в буфер обмена

  • Past - вставить содержимое буфера обмена в окно редактора

  • Cut - вырезать выделенный текст

  • SelectAll - выделить весь текст в рабочей области

  • View table - просмотр подробной информации по выделенной таблице

  • Get DDL - показать код создания выделенной таблицы

  • Show command help - показать справку по выбранной команде

  • Show object data - показать данные выделенной таблицы, представления, синонима

  • Project manager -> Add object - создать страницу для выделенного кода в текущем проекте по умолчанию

  • Project manager -> Search object card - найти карточку выделенного объекта в текущем проекте по умолчанию

  • Comment -> Add current line - добавить символы комментария в начало текущей строки 

  • Comment -> Remove current line - удалить символы комментария в начале текущей строки

  • Comment -> Add selected text - добавить символы комментария в начало каждой из выделенных строк

  • Comment -> Remove selected text - удалить символы комментария в начале каждой из выделенных строк

  • YouTube Social  Icon
  • Facebook Социальной Иконка