Как Вы сделали бы Временные Отношения Many-Many в SQL?

Проблема

Цитаты ("...") не оцениваются, когда вы делаете:

$($COMMAND)

То, что видит удаленный Bash, это два аргумента: "echo и 'hello'", не echo 'hello', как вы ожидаете.

Предлагаемое решение: массивы

В вашем случае я бы предложил использовать массив:

COMMAND=( ssh localhost "echo 'hello'" )
OUTPUT=$( "${COMMAND[@]}" )

Слова в (...) являются элементами массива. В этом случае echo 'hello' виден один элемент: кавычки оцениваются сразу при назначении. Затем, когда вы делаете "${COMMAND[@]}", каждый элемент будет передан в качестве нетронутого аргумента.

Есть также несколько других способов решения этой проблемы, например, использование eval для оценки кавычек, но по моему опыту использование массивов является самым безопасным и простым способом построения и выполнения команд. С помощью массивов легко предотвратить атаки с использованием оболочки, предотвратить нежелательное расширение, предотвратить разрыв слов при наличии пробела. Единственным недостатком является то, что массивы доступны не в каждой оболочке.

Объяснение проблемы

Причина в том, что расширение (т.е. $COMMAND) не оценивает кавычки.

Это демонстрируется этим простым примером, где мы печатаем каждый аргумент по одному на строку:

$ COMMAND="ssh localhost \"echo 'hello'\""
$ for x in $COMMAND; do echo "$x"; done
ssh
localhost
"echo
'hello'"

Используя вместо этого массив:

$ COMMAND=( ssh localhost "echo 'hello'" )
$ for x in "${COMMAND[@]}"; do echo "$x"; done
ssh
localhost
echo 'hello'

С массивом, [1113 ] в одной строке (т. е. это один аргумент), с простой строкой вместо "echo и 'hello'" разделяются.

6
задан Cade Roux 11 February 2009 в 14:29
поделиться

1 ответ

Я работаю над проектом (в течение нескольких лет теперь), который использует и временные данные и временные many-many отношения. Каждая таблица имеет столбцы ValidFrom и ValidUntil (хранящий только даты).

Сначала необходимо определить семантику Допустимого* столбцы, т.е. включен ли ValidUntil или исключен из диапазона законности. Также необходимо указать, допустимы ли ПУСТЫЕ даты и каково их значение.

Затем Вам нужны несколько функций, таких как dbo. Overlaps2 () и dbo. Overlaps3 (), которые получают 2 и 3 диапазона даты соответственно и возвращаются 1, если дата располагается перекрытие и 0 иначе.

Вдобавок ко всему, я определил представления для many-many отношений с dbo. Overlap3 (...) =1.

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

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

5
ответ дан 17 December 2019 в 04:53
поделиться
Другие вопросы по тегам:

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