Подтвердить что ты не робот

Недостатки "С SCHEMABINDING" в SQL Server?

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

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

4b9b3361

Ответ 1

Ничего. Это безопаснее. мы используем его везде.

Ответ 2

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

Ответ 3

Ох, есть DEFINITELY DOWNSIDES для использования SCHEMABINDING - это происходит от факта SCHEMABINDING, особенно в сочетании с столбцами COMPUTED "ЗАМКИ" ОТНОШЕНИЙ и делает некоторые "тривиальные изменения" штопать почти невозможно.

  • Создайте таблицу.
  • Создайте SCHEMABOUND UDF.
  • Создайте столбец COMPUTED PERSISTED, который ссылается на UDF.
  • Добавьте INDEX над указанным столбцом.
  • Попробуйте обновить UDF.

Удачи вам в этом!

  • UDF нельзя отбрасывать или изменять, потому что это SCHEMABOUND.
  • COLUMN нельзя удалить, поскольку он используется в INDEX.
  • COLUMN не может быть изменен, так как он ВЫКЛЮЧЕН.

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

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

Ответ 4

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

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

Ответ 5

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

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

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

Ответ 6

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

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

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

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

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

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

Ответ 7

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

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.

Мне нужно, чтобы мои ЛЕВЫЕ соединения. Этот вопрос SO соответствует.

Ответ 8

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

Ответ 9

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

Ответ 10

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