Можете ли вы иметь отношения к системным таблицам / представлениям?

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

Итак, используя классический пример, если бы у меня была таблица Customers (FirstName LastName), я бы хотел создать другую таблицу со столбцом customerAttribute, который может быть только "FirstName" или "LastName". Чтобы сохранить эту динамику, было бы неплохо, если бы столбец customerAttribute был фактически внешним ключом из системного представления, в котором хранятся имена столбцов в таблице Customer; Таким образом, мне не нужно беспокоиться о проблемах целостности данных, поскольку столбцы добавляются, удаляются и переименовываются в фактической таблице "Клиенты".

Я не видел простого способа создания этих отношений в SQL Server, поэтому мне интересно, не мешает ли создавать / создавать отношения с системными таблицами и / или представлениями.

Спасибо!

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

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

3 ответа

Решение

Очевидно, ничто не мешает вам создать столбец пользовательской таблицы, который ссылается на столбец системной таблицы. Таким образом, очевидный ответ - да. Чтобы ответить на ваш реальный вопрос, необходимо задать другой вопрос, а именно: стоит ли хранить метаданные в пользовательских таблицах?

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

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

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

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

Другие вопросы по тегам