В 2001 году я работал над продуктом, который должен был поддерживать Oracle 8, MS SQL Server 2000 и MS Jet 3.51 (например, Access97). Теоретически мы могли бы нанять специалистов для каждого из этих продуктов и провести процесс тестирования, обеспечивающий одинаковые результаты. На практике наблюдалась тенденция к наименьшему общему знаменателю.
Один из подходов заключался в создании связанных таблиц в Access / Jet для Oracle и SQL Server, а затем исключительно в написании Jet SQL. Проблема в том, что синтаксис Jet SQL очень ограничен.
Другой подход (обычно используемый даже в системах, в которых когда-либо использовался только один продукт СУБД!) - попытаться выполнить больше работы, которую действительно следует выполнять во внешнем интерфейсе, то есть вещи, которые должны входить в состав СУБД. Проблема здесь в том, что это часто приводит к катастрофическим последствиям в отношении целостности данных. Я уверен, что вы знаете ситуацию: приложение должно воздерживаться от записи недопустимых данных, но без ограничений в самой СУБД оно широко открыто для ошибок приложения. Кроме того, есть пользователь, который знает, как подключиться к данным через Excel, SQL Management Studio и т. Д. И, таким образом, полностью обойти приложение, которое должно обеспечивать целостность данных ...
Лично я обнаружил, что все больше и больше пишу код по скользящей шкале, и то, что я только позже обнаружил, называется «мобильностью». В идеале, во-первых, это «ванильный» код, понятный всем поддерживаемым нами СУБД, и при этом я обнаружил стандарты SQL-89 и SQL-92. Затем был SQL-код, который можно было легко перевести (возможно, с помощью кода) для каждой СУБД, например. Oracle использовал этот ужасный инфиксированный синтаксис внешнего соединения, но концепция внешнего объединения была там; Oracle и SQL Server использовали SUBSTRING, но Jet требовал, чтобы ключевое слово было MID $; и т. д. Наконец, есть вещи, которые просто должны зависеть от реализации, и, очевидно, их следует избегать, если это вообще возможно, при этом должным образом учитывая целостность данных, функциональность и производительность.
К счастью, за прошедшие годы продукты приближались к стандартам ANSI SQL (кроме Jet, который MS устарел, теперь он поддерживается только командой MS Access, по-видимому, сокращая основные функции, такие как безопасность и репликация). ). Поэтому я сохранил привычку писать стандартный SQL, где это возможно.