Задать вопрос
  • Как временно повышать права пользователю?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    security definer и есть: проверка прав вызова функции (grant execute) будет проверять, может ли её вызвать этот пользователь, но сама функция дальше будет выполняться с правами владельца функции. В том числе с правами супера, если владелец - суперпользователь.

    Не забудьте revoke execute on function .. from public;
    begin;
    create role specific_activity;
    create function stat_activity() .. security definer;
    revoke execute on function stat_activity() from public; -- права на запуск не всем
    grant execute on function stat_activity() to specific_activity; -- а только этой роли
    commit;
    grant specific_activity to someuser;


    btw, для pg_terminate_backend есть предопределённая роль pg_signal_backend.
    Ответ написан
    1 комментарий
  • Как объединить запросы в транзакцию?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Поскольку быстрым поиском готовый ответ на Тостере не находится, стоит написать канонический.

    Сначала общая информация:

    Транзакция служит для обеспечения принципа "всё или ничего", гарантируя, что либо все запросы выполнились без ошибок, либо, если в каком-то из запросов произошла ошибка, то все предыдущие будут отменены, как будто их и не было вовсе. Из чего можно сделать следующие выводы:
    • транзакция не нужна для любого количества запросов на выборку данных, поскольку там нечего откатывать
    • транзакция не нужна для одного запроса на изменение данных (вставка, обновление, удаление) - такой запрос представляет из себя мини-транзакцию, которая сама автоматом откатывается при ошибке
    • не следует путать транзакции с блокировками. Хотя при определённых параметрах транзакции могут выполнять и блокировку, в общем случае это два разных механизма, которые могут выполняться как вместе, так и по отдельности. По умолчанию транзакция НЕ обеспечивает блокировку таблиц, участвующих в запросе


    Самым простым вариантом будет заключить запросы между вызовами beginTransaction() и commit(), как показано например в документации к последнему.
    $db->beginTransaction();
    $db->prepare("UPDATE `tab1` SET `col` = ?")->execute($data1);
    $db->prepare("UPDATE `tab2` SET  `col` = ?")->execute($data2);
    $db->prepare("UPDATE `tab3` SET  `col` = ?")->execute($data3);
    $db->commit();

    Для современных версий РНР этого должно быть достаточно: начиная с РНР 8.0 ошибочный запрос по умолчанию выбрасывает исключение. Не пойманное исключение прерывает выполнение РНР скрипта. При прерывании выполнения скрипта РНР закрывает соединение с Mysql, а при закрытии соединения Mysql откатывает все открытые в нём транзакции.

    Соответственно, при ошибке в любом из запросов транзакция автоматически откатится. А при успешном выполнении всех запросов транзакция, соответственно, закоммитится.

    В редких случаях, когда после отката транзакции предполагается дальнейшее выполнение кода, можно заключить код транзакции в try-catch и откатить её вручную.

    Важно помнить некоторые особенности.
    • в mysql не все движки таблиц поддерживают транзакции. впрочем ,учитывая что innodb является движком по умолчанию уже лет 20, это вряд ли будет проблемой
    • запросы на изменение страктуры таблиц автоматически коммитят стартовавшую транзакцию, то есть их следует избегать. Кажется, в новых версиях какие-то уже не коммитят, но я предпочитаю избегать всё равно.


    Также желательно помнить, что в любом более-менее сложном коде очень быстро появляются вложенные транзакции, а PDO при попытке стартовать транзакцию при уже открытой, выбросит исключение, что, соответственно, приведёт к откату родительской (и это гораздо лучше поведения MySQL по умолчанию, которая автоматически коммитит старую). И имеет смысл накидать простой кодик, который считает вложенные транзакции, и не стартует, если уже был старт, а при коммите вычитает вложенность, а реально коммитит только если вложенности не осталось. Что-то вроде кода из комментариев к beginTransaction(), подравняв его напильником
    class \MyPDO extends \PDO
    {
        protected $transactionCounter = 0;
    
        public function beginTransaction()
        {
            if($this->transactionCounter++ === 0) {
                return parent::beginTransaction();
            }
        }
        public function commit()
        {
            $this->transactionCounter--;
            if($this->transactionCounter === 0) {
                return parent::commit();
            }
        }
        public function rollback()
        {
            $this->transactionCounter = 0;
            return parent::rollback();
        }
    }

    разместив его либо прямо в PDO, либо в своем враппере.
    Ответ написан
    3 комментария
  • Как сделать полное кэширование базы данных?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Вопрос сформулирован по-дурацки, из серии преждевременной оптимизации. "У меня ещё ни базы, ни запросов, ни нагрузки и никогда не будет, но желаю чтобы всё летало!"

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

    Во-первых, увеличить innodb_buffer_pool_size до 80% от доступной памяти на сервере. Mysql совсем не дура, и прекрасно сама подтянет используемые таблицы в оперативку. И вселенская проблема нашего фантазёра будет решена.
    Отдельно здесь следует упомянуть случай, когда этому буферу не просто задан недостаточный размер, а жалкие 128 мегабайт, поскольку никто не догадался поменять значение, стоявшее в конфиге по умолчанию.

    Во-вторых, добавить нужные индексы. Поскольку даже в оперативке искать по миллиону записей перебором будет гораздо дольше чем в 5-10 хопов по заранее упорядоченному индексу.
    Ответ написан
    5 комментариев
  • Можно ли тянуть от оператора два кабеля интернета?

    @elderl
    Можно. Половина будет на одном, другая — на втором.
    Ответ написан
    3 комментария
  • Почему i? Почему переменную, используемую в циклах, обычно называют именно i?

    @alexalexes
    index. А вообще, индексы элементов массива пришли из математики - i, j, k для первых трех измерений.
    Просто, первыми компухтеры оседлали математики, отсюда и традиция в циклах использовать эти буквы.
    Ответ написан
    2 комментария
  • Какие есть утилиты для автоматизированного проектирования БД?

    @d-stream
    Готовые решения - не подаю, но...
    Хм.. может стоит ткнуть преподавателя в определение термина проектирование вообще и в проектирование баз данных в частности

    Потом проиллюстрировать накидывание структуры, связей и далее в одной из визуальных систем, потом в ней же generate DDL и следом execute SQL
    Ответ написан
    Комментировать
  • Как установить связь "2 ко многим" без промежуточной таблицы?

    @Everything_is_bad
    Не понятно в чем проблема? Что мешает два ForeignKey сделать и почему вдруг тут появится промежуточная таблица?
    Ответ написан
    Комментировать
  • Как разбить сеть на подсети?

    @SunTechnik
    Задача учебная или практическая?
    Какой ёмкости должны получиться сети?
    Сети с адресом 10.1.12.192 /23 не существует, так как биты закрытые маской не равны нулю.
    Адрес 10.1.12.192 /23 принадлежит сети
    10.1.12.0
    Подсеть задаётся маской.
    Бьём текущую сеть на 2:
    10.1.12.0/24
    10.1.13.0/24
    В каждой по 256 адресов.

    Далее одну из них бьём ещё на2. Например первую
    Получаем подсети:
    10.1.12.0/25
    10.1.12.128/25
    10.1.13.0/24
    В первых - по 128 адресов, в третьей - 256 адресов
    Ответ написан
    Комментировать
  • Как лучше сделать базу данных?

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

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

    Короче, у тебя нет опыта, ты подобную базы не способен самостоятельно спроектировать. Начни делать правильно, как написано в книгах, оптимизаций займешься потом, с 99% у тебя не будет столько пользователей, чтобы возникли проблемы.
    Ответ написан
    Комментировать
  • Почему Server 2016 и server 2003 не понимают друг друга?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    Копать тут - в поддерживаемые протоколы шифрования для Kerberos: недоступность по имени при доступности по IP - вообще типичный признак проблем с Kerberos, а тут ещё в наше время MS повадилась отключать старые протоколы как "небезопасные" - потому что безопасность (показная) стала продаваемой, ее якобы наличие увеличивает ценность продукта в глазах клиентов.
    Ответ написан
    1 комментарий
  • Как работать с датой записанной в поле формата числа с плавающей точкой?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Этот способ хранения даты тянется ещё с Lotus 1-2-3. Когда Microsoft добавляла дату/время в Excel, то для совместимости использовали тот же формат.
    Отсчёт ведётся от 30.12.1899. Целая часть - количество дней, прошедших с этой даты, дробная часть - время. Если дробную часть умножить на 24*60*60, то получим количество секунд с начала дня.
    Встроенных функция для преобразования в PostgreSQL нет, так что, видимо, это прямой перенос из чего-то типа MSAccess.
    45672.38114849537 соответствует 2025-01-15 09:08:51.230
    Получить можно, например, так:
    SELECT
      date_lotus,
      '1899-12-30'::date + MAKE_INTERVAL(days => date_lotus::int, secs => ((date_lotus - date_lotus::int) * 24*60*60)::int) AS datetime
      FROM test;
    
    | date_lotus        | datetime            |
    | ----------------- | ------------------- |
    | 45672.38114849537 | 2025-01-15 09:08:51 |
    Ответ написан
    Комментировать
  • Правильно ли работает вентиляторы на видеокарте?

    yakovlev_13
    @yakovlev_13
    Шаманство, экзорцизм и некромантия.
    Если прокрутить пальцем то кулер закрутиться.

    Если вентилятор не крутится, но если помочь пальцем, то начинает - это к замене вентилятора
    Ответ написан
    Комментировать
  • Ошибка в запросе, в чём причина?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    SELECT [u.id](u.id)

    а где вы такой синтаксис нашли? Совершенно очевидно непонимание от сервера, что вы этим пытаетесь сказать, я тоже не понимаю, что этот синтаксис должен значить.
    https://dev.mysql.com/doc/refman/8.4/en/identifier...
    Ответ написан
    2 комментария
  • Как подключить мониторы?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    DVI-порт к монитору с DVI
    DisplayPort к монитору с D-Sub через конвертер.
    Ответ написан
    1 комментарий
  • Чем вызвано появление большого числа папок на диске C?

    VoidVolker
    @VoidVolker Куратор тега Windows
    Dark side eye. А у нас печеньки! А у вас?
    Судя по названиям файлов - это временные каталоги какого-то установщика, вероятно графических драйверов каких-то или ещё чего-то. Возможно установка не завершается до конца или это баг в установщике, который не чистит за собой. Их можно просто удалить. Ну и выяснить что это за драйвер или приложение и там уже решать что делать - жаловаться в саппорт с багрепортом или просто удалить это приложение.
    Ответ написан
    2 комментария
  • Как правильно собрать сеть в квартире?

    @Drno
    Кинетик в каждую комнату по проводу и меш вифи от них на частоте в 5ггц
    На входе нужен роутер, а не свитч
    Ответ написан
    4 комментария
  • Поиск куда можно добраться по графу за время?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    Алгори́тм Де́йкстры (англ. Dijkstra’s algorithm) — алгоритм на графах, изобретённый нидерландским учёным Эдсгером Дейкстрой в 1959 году. Находит кратчайшие пути от одной из вершин графа до всех остальных.

    Здесь
    Ответ написан
    Комментировать
  • Как в столбце найти частичное совпадение фразы?

    phaggi
    @phaggi
    лужу, паяю, ЭВМы починяю
    Если вам надо решить чисто практическую задачу - скачайте и установите расширение PLEX с сайта планета эксель. Там есть в том числе библиотека формул и макросов, в которой есть в том числе нечеткое сравнение, и даже не одно. Но из практики оно работает так себе… но это хоть что-то.

    Если же вам надо теоретическое решение - ищите на Хабре статью «Как работает неточное сравнение строк».
    Ответ написан
    Комментировать
  • Почему при установлении явного разрешенного ip в postgresql.conf перестает работать подключение?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Плохо читали.
    Specifies the TCP/IP address(es) on which the server is to listen for connections from client applications.

    listen_addresses - это адрес сервера, на котором postrgesql слушает подключения от клиентов. К адресам клиентов не имеет никакого отношения.
    Ответ написан