Существуют ли стандартные функции SQL с побочными эффектами?

Определяют ли стандарты SQL функции с побочными эффектами?

Например, у них есть функции для записи в файлы * или для обновления значений в определенных столбцах таблицы, когда вы делаете что-то вроде

SELECT myfunction(params...);

Я видел это иногда, но мне просто интересно, соответствуют ли стандарты SQL.


* Это не вопрос о PostgreSQL. Я использую только примеры побочных эффектов, которые я вижу в PostgreSQL.

10 голосов | спросил tinlyx 20 FebruaryEurope/MoscowbMon, 20 Feb 2017 23:55:03 +0300000000pmMon, 20 Feb 2017 23:55:03 +030017 2017, 23:55:03

2 ответа


17

Здесь у вас есть несколько разных вопросов.

В: Каковы стандартные функции SQL ANSI?

Стандартными функциями ANSI являются такие вещи, как AVG, COUNT, MIN, MAX. Они описаны в стандарте ANSI 1992 года , но это чертовски сухое, скучное чтение.

Q: Стандартные функции SQL ANSI изменяют данные в базе данных?

Нет. Вы можете использовать их для изменения данных - например, я могу сказать:

INSERT INTO dbo.MyReport SELECT MAX(SalespersonRevenue) FROM dbo.Sales

Но сами по себе использование AVG, COUNT, MIN, MAX и т. д. не должно постоянно изменять данные в вашей базе данных.

В: Позволяет ли мне стандарт ANSI писать мои собственные функции?

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

  • При обсуждении предполагаемого поведения можно получить кросс-платформенный ответ.
  • При обсуждении побочных эффектов это не так.

В: Могу ли я создать свою собственную функцию для записи данных?

Почему, конечно, если вы креативны. Я парень Microsoft SQL Server, поэтому я собираюсь сосредоточиться на этой платформе. Страница функций электронной почты в Интернете говорит:

  

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

На что я говорю:

  

Ты не мой настоящий папа.

Итак, вот как я нарушу правила. Предупреждение: появляются плохие идеи.

  • В своей функции запросите новую таблицу, специально созданную для этой злой цели, а затем создайте что-то, что отслеживает таблицу для выбранных операторов, а затем запускает действие (расширенные события, аудит или трассировка Profiler). Вы можете скомбинировать метод Rubber Goldberg для выполнения работы на основе этих операторов select.
  • В функции вызовите CLR-код - черт, вы можете даже вызвать веб-службу . Эта веб-служба может очень хорошо переместить данные обратно в вашу собственную базу данных.
  • В функции вызовите xp_cmdshell и сделайте что-нибудь в командной строке. (HT @AaronBertrand в комментариях.)

Все эти примеры имеют огромные недостатки в виде производительности и последовательности транзакций. Вы просто спросили, можно ли это теоретически сделать, а ответ - да. Я бы никогда не использовал ни один из них в своем собственном коде - я бы сделал шаг назад и спросил: «Какую бизнес-цель я пытаюсь достичь здесь, и есть ли способ сделать это для достижения производительности и последовательности транзакций ?» Если вы хотите получить конкретный совет по этим вопросам, я задал бы отдельный вопрос со стеком со спецификой.

ответил Brent Ozar 25 FebruaryEurope/MoscowbSat, 25 Feb 2017 17:41:54 +0300000000pmSat, 25 Feb 2017 17:41:54 +030017 2017, 17:41:54
-3

Я могу говорить только окончательно относительно SQL Server, и кажется, что это не согласовано во всех реализациях базы данных. Но в SQL Server функции могут не вызывать побочных эффектов. Это жесткое правило, которое я пытался обойти несколько раз без успеха.

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

Существует высказывание «Умные решения не масштабируются», что особенно актуально для продуктов Microsoft. В ранних версиях SQL Server я обнаружил ряд умных обходных решений, которые устарели в более поздних версиях, потому что MS добавила их в качестве истинных функций.

Те, кто никогда не становился чертами, честно говоря, никогда не становились чертами, потому что они в корне нарушили некоторые аспекты развития T-SQL. Побочные эффекты в функциях - один из них.

ответил Matthew Sontum 21 FebruaryEurope/MoscowbTue, 21 Feb 2017 14:44:06 +0300000000pmTue, 21 Feb 2017 14:44:06 +030017 2017, 14:44:06

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132