Недостатки "с привязкой к схеме" в SQL Server?


У меня есть база данных с сотнями неловко названных таблиц в ней (CG001T, GH066L и т. д.), и у меня есть представления на каждом из них с его "дружественным" именем (например, представление "клиенты" - это "SELECT * FROM GG120T"). Я хочу добавить "со SCHEMABINDING" к моим представлениям, чтобы я мог иметь некоторые преимущества, связанные с ним, например, возможность индексировать представление, поскольку несколько представлений имеют вычисляемые столбцы, которые дорого вычислять на лету.

есть ли минусы SCHEMABINDING эти взгляды? Я нашел некоторые статьи, которые туманно намекают на недостатки, но никогда не вдаваться в них подробно. Я знаю, что как только представление schemabound, вы не можете изменить ничего, что повлияло бы на представление (например, тип данных столбца или параметры сортировки), не отбросив сначала представление, так что это один, но помимо этого? Похоже, что возможность индексировать само представление будет намного перевешивать недостаток более тщательного планирования изменений схемы.

10 54

10 ответов:

вообще нет. Так безопаснее. мы используем его везде.

вы не сможете изменить/удалить таблицу, если вы первый брось взгляд.

Да, есть ОПРЕДЕЛЕННО МИНУСЫ к использованию SCHEMABINDING-они исходят из факта SCHEMABINDING, особенно в сочетании с вычисляемыми столбцами "БЛОКИРУЕТ" ОТНОШЕНИЯ и делает некоторые "тривиальные изменения" почти невозможными.

  1. создать таблицу.
  2. создать схему UDF.
  3. создайте вычисляемый сохраняемый столбец, который ссылается на UDF.
  4. добавить индекс на столбце.
  5. попробуйте обновление ОДС.

удачи с этим!

  1. ОДС не могут быть удалены или изменены, потому что она привязана к схеме.
  2. столбец не может быть удален, потому что он используется в индексе.
  3. столбец не может быть изменен, потому что он вычисляется.

Ну, фрак. Действительно..!?! Мой день просто превратился в питу. (Теперь такие инструменты, как ApexSQL Diff, могут справиться с этим при наличии измененной схемы, но проблема в том вот что я даже не могу изменить схему для начала!)

Я не против SCHEMABINDING, ум (и это необходимо для UDF в этом случае), но я против того, чтобы не было способа (который я могу найти) "временно отключить" SCHEMABINDING.

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

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

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

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

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

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

не удается привязать схему представление "вид", потому что имя "таблица" недопустимо привязка схемы. Имена должны быть в двухчастном формате, а объект не может ссылка сама по себе.

также для "выключения" schemabinding вы изменяете представление, которое требует, чтобы вы переопределили оператор select представления. Я думаю, что единственное, что вы не делаете придется переопределять - это какие-то гранты. Это сильно отталкивает меня, поскольку перезапись представления кажется по своей сути небезопасной операцией.

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

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

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

это кажется мне недостатком (#мои):

Cannot create index on view "###.dbo.###" because it uses a LEFT, RIGHT, or FULL OUTER join, and no OUTER joins are allowed in indexed views. Consider using an INNER join instead.

мне вроде как нужны мои левые соединения. это так вопрос актуальна.

при использовании Tsqlt Unit Test Framework вы столкнетесь с проблемами и будете нуждаться в обходных путях при использовании метода FakeTable, который не позволит вам подделать таблицу, связанную с представлением с привязкой schemabinding.

упомянутые негативы вряд ли перевешивают эту лучшую практику с SQL Svr 2005. Это позволяет избежать страшной таблицы наматывания. Основным недостатком для меня является то, что привязанные к схеме sprocs, funcs, views не могут включать "внешние" базы данных, такие как master db, поэтому вы можете выбросить все отличные системные материалы в реальном времени в корзину, если, например, ваша производственная база данных core не находится внутри master. Для меня, я не могу иметь дело с жизнью без sys вещи. Конечно, не вся обработка требует без катушки производительность и быстрые и медленные результаты могут быть объединены одновременно в более высоких слоях класса данных.

Если ваш инструмент (ssms и т. д.) не обрабатывает сбои изменения схемы на базовом объекте хорошо / элегантно, вы можете вызвать у себя настоящий хаос. Вот с чем я сейчас сижу, и я понимаю, что это крайний случай