Задать вопрос
  • Как из alertmanager передать алерты с кликабельными ссылками и изображениями в алертах?

    @Oraclist
    Текст алерта формируется на ваше усмотрение.
    Есть стандартные интегрированные шаблоны default.tmpl и email.tmpl
    Их можно скачать отсюда, положить рядом с Alertmanager, откорректировать и подключить в alertmanager.yml
    templates:
    - "/path/to/template/default.tmpl"
    - "/path/to/template/email.tmpl"

    Тогда все сообщения будут в новом формате.

    Можно создать свой файл шаблонов example.tmpl
    {{ define "bla-bla-bla.subject" }}Subject Example{{ end }}
    {{ define "bla-bla-bla.html" }}Тут какой-то текст алерта{{ end }}

    и подключить в alertmanager.yml
    templates:
    - "/path/to/template/example.tmpl"
    receivers:
    - name: "test"
      email_configs:
      - to: "email@email.mail"
        headers:
          subject: '{{ "{{" }} template "bla-bla-bla.subject" . {{ "}}" }}'
        html: '{{ "{{" }} template "bla-bla-bla.html" . {{ "}}" }}'

    Внутри шаблона определить корректные адреса ссылок, чтобы они стали кликабельными

    P.S. Либо запустить alertmanager с параметром --web.external-url=https://внешняя_ссылка_на_alertmanager
    Ответ написан
    Комментировать
  • Как добавить свой столбец в SQL вывод?

    @Oraclist
    SELECT COUNT(d.id) AS КОЛИЧЕСТВО, CASE WHEN d.status = '3' THEN 'ОШИБКА' ELSE 'УСПЕШНО' END AS СТАТУС
    FROM deal d
    WHERE d.status IN ('3', '4')
    GROUP BY CASE WHEN d.status = '3' THEN 'ОШИБКА' ELSE 'УСПЕШНО' END
    Ответ написан
    Комментировать
  • Как исключить ошибку пустого запроса в ORACLE?

    @Oraclist
    Простейший способ, таки, обработать ошибку no_data_found.
    Ориентировочный скрипт такой
    AS 
      INSERTED VARCHAR(200);
      ID_ NUMBER;
    BEGIN
    ...
    BEGIN
    SELECT ID_MATERIAL INTO INSERTED FROM SOURCE WHERE SHORTNAME_MATERIAL=SHORT_NAME;
    EXCEPTION
    WHEN NO_DATA_FOUND THEN NULL ; (или INSERTED := NULL)
    END;
    ...
    IF INSERTED IS NULL THEN
    ...
    ELSE
    ...
    END IF ;
    ...
    END <PROCEDURE_NAME> ;

    А вообще, по приведенному примеру можно сказать, что над оформлением кода (стандартом оформления) надо работать. Имена переменных и таблиц такими делать не принято. Используют преффиксы VAR_, V_, GV_, LV_ для переменных и преффиксы TBL_, T_ или суффикс _TBL для таблиц. Вместо VARCHAR должен быть VARCHAR2. Обязательно указывать тип размерности для строковых - BYTE or CHAR. Алиасы для таблиц являются хорошим тоном даже в таких простых запросах. Невозможно понять условие SHORTNAME_MATERIAL=SHORT_NAME - это сравнение полей картежа, двух скалярных внутренних или внешних переменных, или констант, или сравнение поля с переменной/константой.
    Ответ написан
    1 комментарий
  • Как создать точную копию таблицы?

    @Oraclist
    Можно попробовать приладить DBMS_REDEFINITION. Но как-то криво это.
    Ответ написан
    Комментировать
  • Аудит пользователя SYS, как?

    @Oraclist
    Оффтоп. По-моему, вы боретесь с симптомами, а не с болезнью. SYS имеет исключительные права. Если надо он может всё, в том числе включить и отключить любой аудит. В аудите нет смысла, если его можно обойти. Это как аудировать пользователя root в Unix.
    Ответ написан
    4 комментария
  • Какую из этих книг лучше купить для изучения СУБД компании Oracle?

    @Oraclist
    "Том Кайт - Oracle для профессионалов" или ее оригинал Thomas Kyte "Expert one-on-one Oracle"
    Ответ написан
    1 комментарий
  • На чтение чего нужны права, что бы прочитать представление?

    @Oraclist
    Во-первых, права на функции в пакете не выдаются. Выдаются права на EXECUTE пакета.
    Во-вторых, если из-под пользователя ASD запрос выполняется без ошибки, значит с правами все ОК.
    В-третьих, разницу результатов можно объяснить тем, что в представление на вход подаются разные значения параметров. К ним в том числе надо отнести пользовательские и системный контексты.
    Считаю необходимым обратить внимание, что если используется конвейерная функция, то она проглатывает ошибку NO_DATA_FOUND.
    Ответ написан
    Комментировать
  • Что должен знать SQL разработчик?

    @Oraclist
    Прежде, чем развивать компетенции в какой-то конкретной технологии СУБД, надо сначала прокачаться в теории БД.
    Что такое множества. Операции над множествами. Сущности (поля, кортежи, таблицы, индексы, последовательности, транзакции и т.д.). Связи таблиц (виды и типы связей). Доступ к данным и т.д.
    А уже потом выбирать или не выбирать конкретную технологию.

    А то бывает приходят люди с опытом PLSQL, вроде и код пишет и стандартные функции знает.
    А про левое/правое соединение ни гугу.

    Добавлено: про нормальные формы забыл еще написать
    Ответ написан
    2 комментария
  • Как убрать пробелы в столбце в начале каждого значения?

    @Oraclist
    update product t 
    set t.product_code = trim(t.product_code) 
    where t.product_code != trim(t.product_code);

    Можно без условия where. Смотреть надо не сломается ли чего (например, какие-нибудь потребители смотрят на дату последнего обновления строки).
    Ответ написан
    3 комментария
  • Какая последовательность выполнения у group by, having, order by?

    @Oraclist
    Последовательность понял правильно. Молодец!
    1. WHERE -> 2. GROUP BY -> 3. HAVING -> 4. ORDER BY
    Т.е. сначала фильтруем - получаем тот набор кортежей, с которыми будем работать дальше.
    Затем группируем в нужном разрезе.
    Затем накладываем условие на результат группировки (а условие на результат можно наложить только после получения результата). Затем сортируем полученный результат для возвращения клиенту.
    Никаких временных таблиц не создается (привет любителям materialize). Порядок выполнения определяется планом запроса и он в общем случае может сильно отличаться от структуры текста запроса.

    Теперь можно разбираться последовательностью выполнения в иерархических запросах (connect by).
    Ответ написан
  • Как написать сложный SQL запрос?

    @Oraclist
    Вопрос не понятен от слова совсем.

    Сразу скажу.
    Несмотря на то, что условия пишутся одинаково, необходимо разделять условия связи двух таблиц и условия фильтрации/отбора. Логически условия отбора фильтруют итоговый массив строк, полученный после связывания всех таблиц. Технически фильтрация может выполняться раньше.
    Т.о. условия связи в данной задаче надо оставить под инструкцией ON, а условия фильтрации вынести в инструкцию WHERE.

    И да, (совет №1) не забывайте писать алиас таблицы перед именем поля, даже если в другой таблице такого поля нет. Ведь завтра оно может там появиться и код работать не будет. Научитесь (совет №2) придумывать короткие алиасы к таблица. А лучше систему получения коротких алиасов. Это пригодится в будущем, когда количество таблиц в системе и в запросе станет увеличиваться.

    Возможно, я неправильно предположил суть вопроса, но должно получиться что-то похожее на
    SELECT
    	c.id
      , c.pagetitle
      , c.parent
      , tv.id
      , tv.tmplvarid
      , tv.contentid
      , tv.value 
    FROM modx_site_content AS c 
    RIGHT JOIN modx_site_tmplvar_contentvalues AS tv ON c.id = tv.contentid
    WHERE c.parent = 22923
      AND ( tv.tmplvarid, tv.value ) IN ( ( 20, 4 ), ( 20, 6 ), ( 19, 10 ) )
    ORDER BY c.id ASC


    И последнее. Мне на 99% кажется, что исходя из имен таблиц, здесь должен быть не RIGHT, а LEFT JOIN.
    Ответ написан
    Комментировать
  • Разрешено ли при покупке Oracle Database Standard 2 (т.е. 12с) использовать предыдущую 11g?

    @Oraclist
    А смысл? 12c поддерживает все (или почти все) функции 11g. Я думаю, можно выставить на 12c параметры (compatible & optimizer_features_enable) в 11.2.0.4.0 и будет счастье.

    А по теме ... Покупая Oracle, вы покупаете не только СУБД, но и ее поддержку. А, насколько я помню, по 11g поддержка прекращена.
    Ответ написан
  • Можно ли sql запросом получить схему БД Oracle?

    @Oraclist
    Ну и последний вариант export/import схемы с ROWS=0 (без данных). Не совсем SQL, но может пригодиться.
    Ответ написан
    Комментировать
  • Почему оператор update не работает?

    @Oraclist
    Я вам рекомендую переделать этот код.
    В наличие пренебрежение некоторыми нормами разработки.
    1.
    id in number

    СУБД дает вам возможность создавать имена переменных длинной до 32 символов. Так пользуйтесь этим. Придумайте нормальное имя, например, id_certificate.

    2.
    currentSequence NUMBER(10,0);
    BEGIN
    currentSequence := 0;
    Я верю, что вам платят не за строчки кода. Такое надо объединять в
    currentSequence NUMBER(10,0) := 0 ;


    3. Поле с именем ID это зло. Когда сущностей в системе станет к 100. Вы будете путаться в этих ID как ребенок в буквах.

    4.
    currentSequence := 0;
    SELECT
    max(vr.CERTIFICATE) INTO currentSequence
    FROM
    VAGON_REGISTR vr
    WHERE
    vr.ID = id;

    На этот код должен был ругнуться WARNING'ом компилятор. Типа, значение присваивается, но не используется и снова присваивается в команде выбора.

    5. Команда выхода из блока return должна быть одна. Для ветвления алгоритмов есть If & Case etc.

    6. Про commit (или rollback) уже писали выше.

    7. И да, Oracle не знает camelcase'а GetCertificateSeq. Лучше делать так Get_Certificate_Seq
    Ответ написан
    Комментировать
  • Как исправить ошибку ORA-00904 в Oracle?

    @Oraclist
    ORA-00904 часто отражает отсутствие доступа к объекту.
    Возможно, объекта нет вообще.
    1. Проверить наличие объекта.
    2. Проверить, что обращаемся к нужному объекту правильно (имя схемы и имя объекта корректны и полны)
    3. Проверить наличие прав доступа на выбор для этого объекта и пользователя, выполняющего запрос.
    4. Для представления: пользователю-владельцу представления должны быть выданы права на доступ к таблицам из представления с опцией WITH GRANT OPTION.
    Ответ написан
    Комментировать
  • Какую из IDE выбрать для Oracle PL/SQL?

    @Oraclist
    Для написания кода мне удобней PLSQL Developer.
    Для администрирования у TOAD лучше инструментарий.
    Ответ написан
    Комментировать
  • Почему не соединяется клиент с базой данных Oracle?

    @Oraclist
    По пунктам:
    1. Пробуй подключиться к БД локально (подключаешься по SSH, в командной строке su - oracle, прыгаешь в папку размещения sqlplus, запускаешь sqlplus /nolog, далее conn / as sysdba, вводишь пароль SYS'a.
    Если, ОК значит БД может принимать подключения.
    Заодно проверь, что экземпляр запущен.
    2. Там же из SSH пробуй подключиться через листенер (sqlplus /nolog, вводишь sys@имя_БД, если получишь приглашение на ввод пароля, то всё ОК.
    3. Если нет, то tnsping имя_БД. Если пинга нет, то настраивай tnsnames.ora. Рекомендую хранить только один экземпляр файла с таким именем на хосте. Путь к файлу можно задать через переменную окружения TNS_ADMIN.
    4. Если в п.2. ОК, то повтори п.3 с удаленного хоста.
    5. Если в п.4. ОК, то выгони инопланетян из компьютера)
    6. Если в п.4 не ОК. Пробуй сначала "telnet имя_хоста 1521". Есть приглашение - есть доступ к хосту. Нет приглашения - кури файрвол.
    7. Если есть доступ к хосту и нет связи, настраивай удаленный tnsnames.ora. Рекомендации теже.

    tnsnames.ora расположен в ORA_HOME/NETWORK/ADMIN или по пути в переменной окружения TNS_ADMIN.

    Вот пример одной настройки из файла
    Имя_БД=
    (DESCRIPTION=
    (ADDRESS=(PROTOCOL=TCP)(HOST=IP_хоста_или_доменное_имя)(PORT=1521))
    (CONNECT_DATA=(SID=SID_БД)(SERVER=DEDICATED))
    )
    SID_БД можно глянуть командой lsnrctl status в командной строке по SSH
    Ответ написан
    Комментировать
  • Как одним запросом получить данные из 2х строк выборочно?

    @Oraclist
    Сергей, не понятна постановка задачи.
    Будьте добры, то же самое, только другими словами.
    Ответ написан
  • Как составить запрос к бд с удалением дубликатов и изменением id?

    @Oraclist
    Описание задачи недостаточное
    Не понятен смысл таблиц. Где Primary? Где справочники и значения? и т.д.
    Ответ написан
    Комментировать
  • Какая последовательность в разборе select unique ... у оракла?

    @Oraclist
    CREATE TABLE table1 ( ID NUMBER, KEY NUMBER ) ;
    INSERT INTO table1 ( ID, KEY ) VALUES ( 1, 0 ) ;
    INSERT INTO table1 ( ID, KEY ) VALUES ( 2, 1 ) ;
    INSERT INTO table1 ( ID, KEY ) VALUES ( 3, 0 ) ;
    INSERT INTO table1 ( ID, KEY ) VALUES ( 4, 5 ) ;
    INSERT INTO table1 ( ID, KEY ) VALUES ( 5, 4 ) ;
    INSERT INTO table1 ( ID, KEY ) VALUES ( 6, 1 ) ;
    CREATE TABLE table2 ( ID NUMBER ) ;
    INSERT INTO table2 ( ID ) VALUES ( 3 ) ;
    INSERT INTO table2 ( ID ) VALUES ( 4 ) ;
    INSERT INTO table2 ( ID ) VALUES ( 5 ) ;
    INSERT INTO table2 ( ID ) VALUES ( 6 ) ;
    COMMIT ;
    SELECT UNIQUE t1.key FROM table1 t1, table2 t2 WHERE t1.id = t2.id ;

    План исполнения будет следующий
    Plan Hash Value  : 1501084449 
    
    ----------------------------------------------------------------------
    | Id  | Operation              | Name   | Rows | Bytes | Cost | Time |
    ----------------------------------------------------------------------
    |   0 | SELECT STATEMENT       |        |      |       |      |      |
    |   1 |   SORT UNIQUE          |        |      |       |      |      |
    |   2 |    MERGE JOIN          |        |      |       |      |      |
    |   3 |     SORT JOIN          |        |      |       |      |      |
    |   4 |      TABLE ACCESS FULL | TABLE2 |      |       |      |      |
    | * 5 |     SORT JOIN          |        |      |       |      |      |
    |   6 |      TABLE ACCESS FULL | TABLE1 |      |       |      |      |
    ----------------------------------------------------------------------
    
    Predicate Information (identified by operation id):
    ------------------------------------------
    * 5 - access("T1"."ID"="T2"."ID")
    * 5 - filter("T1"."ID"="T2"."ID")

    План читается с самого "правого" к самому "левому".
    Т.е. сначала самая вложенная строка и вверх по дереву.
    Собственно SORT UNIQUE выполняет предпоследним пунктом.
    Отвечая на вопрос, сначала будет соединение и фильтрация ( строка 5 плана ) и только потом отбор уникальных строк/значений.
    Правильный ответ такой ( не забываем про сортировку )
    SQL> SELECT UNIQUE t1.key FROM table1 t1, table2 t2 WHERE t1.id = t2.id ;
           KEY
    ----------
             0
             1
             4
             5
    
    SQL>
    Ответ написан
    Комментировать