Триггеры T-SQL, запускающие “Имя столбца или количество предоставленных значений, не соответствуют ошибке” определения таблицы

Ответ зависит от того, как вы обслуживаете это приложение.

Подмонтировано внутри другого контейнера WSGI

Предполагая, что вы собираетесь запускать это приложение внутри контейнера WSGI (mod_wsgi, uwsgi, gunicorn и т. д.); вам нужно на самом деле монтировать в этом префиксе приложение как часть этого контейнера WSGI (что-нибудь, что говорит WSGI) и установить настройку APPLICATION_ROOT значение для вашего префикса:

app.config["APPLICATION_ROOT"] = "/abc/123"

@app.route("/")
def index():
    return "The URL for this page is {}".format(url_for("index"))

# Will return "The URL for this page is /abc/123/"

Установка значения конфигурации APPLICATION_ROOT просто ограничивает файл cookie сеанса флешки этим префиксом URL.

Пример правильной установки вашего приложения

Если вы не знаете, что означает первый абзац, это означает, что все остальные будут автоматически обработаны для вас превосходными возможностями WSGI для Flask и Werkzeug. , посмотрите на это примерное приложение с Flask, смонтированным внутри него:

from flask import Flask, url_for
from werkzeug.serving import run_simple
from werkzeug.wsgi import DispatcherMiddleware

app = Flask(__name__)
app.config['APPLICATION_ROOT'] = '/abc/123'

@app.route('/')
def index():
    return 'The URL for this page is {}'.format(url_for('index'))

def simple(env, resp):
    resp(b'200 OK', [(b'Content-Type', b'text/plain')])
    return [b'Hello WSGI World']

app.wsgi_app = DispatcherMiddleware(simple, {'/abc/123': app.wsgi_app})

if __name__ == '__main__':
    app.run('localhost', 5000)

Проксирование запросов к приложению

Если, с другой стороны, вы будете запускать свою флягу приложение в корневом контейнере WSGI и запросы проксирования к нему (например, если это FastCGI'd, или если nginx является proxy_pass -потребителями запросов для вспомогательной точки к вашему автономному uwsgi / gevent, вы можете либо:

  • Использовать план, так как Мигель указывает в свой ответ .
  • или используйте DispatcherMiddleware из werkzeug (или PrefixMiddleware из ответа su27 ), чтобы подключить ваше приложение на автономном сервере WSGI, который вы используете. (См. Пример правильной подстройки вашего приложения выше для используемого кода.)

5
задан Ilya Luzyanin 17 November 2017 в 07:24
поделиться

4 ответа

Я думаю, что David и объединенный Cervo совершили нападки на проблеме здесь.

Я - вполне уверенная часть того, что происходило, был то, что мы использовали #newMatches в нескольких триггерах. То, когда один триггер изменил некоторые строки, он запустит другой триггер, который попытался бы использовать соединение, определило объем #newMatches.

В результате это попыталось бы, найти, что таблица уже существовала с другой схемой, умрите и создайте сообщение выше. Одна улика, которая выступила бы "за": вставленное использование объем стиля стека (вложенные триггеры имеют свой собственный inserteds?)

Все еще размышляя, хотя - по крайней мере, вещи, кажется, работают теперь!

2
ответ дан 15 December 2019 в 01:16
поделиться

Я не вижу очевидной проблемы в коде.

"ВЫБЕРИТЕ.. В" Слабый кун-фу. Попытка, явно создающая временное определение таблицы:

CREATE TABLE #newMatches
(
  CompanyID int PRIMARY KEY,
  DunsID int
)

Когда Вы сделаны с #newMatches, необходимо избавиться от него так, можно создать его снова позже (временные таблицы являются ограниченным по объему соединением!!)

DROP TABLE #newMatches
1
ответ дан 15 December 2019 в 01:16
поделиться

Триггерный код (потому что это должно выполнить каждый раз данные, обновляется) должен быть эффективным и должен составлять несколько, запись вставляет. Вы успешно выполнились во втором, но не первом. Вы сделали это чрезмерно сложным и использовали вещи такой в качестве Не в операторах, которые обычно менее эффективны, чем использование левого соединения. Временные таблицы являются ненужными здесь (я никогда не рассматривал бы использование один в триггере), как они добавляют к неэффективности триггера. Нет причины не записать Из вставленного меня вместо ОТ (выберите dunsId, имя от #magic), я

Первое, вероятно, будет быстрее и более просто считать и поддержать.

Здесь: СОЕДИНЕНИЕ (еще выбирают случай когда charindex (' / ', URL) <> 0 затем оставленный (URL, charindex (' / ', URL)-1) конец URL urlMatch, * от компаний), c НА dandb.url = c.urlMatch

Вы выбираете все поля в таблице даже при том, что Вы только, кажется, используете тот. Почему? Вы также выполняете тот случай stament на всех записях в компании даже при том, что после присоединения, Вам, возможно, не понадобятся все они.

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

Вы также использовали функцию в триггере. Это могло быть крайне медленно если Вы havea большая вставка. Я предлагаю, чтобы Вы протестировали это путем обновления большой группы записей и видели то, что происходит. Всех изменений данных не происходит только от пользовательского интерфейса, одна запись за один раз. Будут времена, когда одно поле будет обновлено из специального запроса в студии управления (когда все цены должны быть скорректированы на 10% как самый простой пример, который приходит на ум.) Ваш триггер должен смочь обработать те типы, если обновления, а также те Вы ожидаете. Я выполнил бы тестовый сценарий, обновляющий 100 000 строк, и видел бы, насколько этот триггер замедляет вещи.

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

0
ответ дан 15 December 2019 в 01:16
поделиться

Что такое companies_contactInfo_updateTerritories? Фактическая ссылка упоминает процедуру "companies_contactInfo_updateTerritories", но я не вижу его в данном коде. Также я не вижу, где это называют. Если это не из Вашего приложения, которое называет SQL и следовательно не важным....

Если бы Вы протестировали все, и это работало, но теперь это не работает, то что-то должно отличаться. Одной вещью рассмотреть является безопасность. Я заметил, что Вы просто называете таблицу [dandb_raw] и не [dbo]. [dandb_raw]. Таким образом, если у пользователя была таблица того же имени [пользователь]. [dandb_raw], та таблица использовалась бы для проверки определений вместо таблицы. Кроме того, триггер составляет временные таблицы. Но если некоторые временные таблицы уже существовали по любой причине, но с различными определениями, это может также быть проблемой.

1
ответ дан 15 December 2019 в 01:16
поделиться
Другие вопросы по тегам:

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