#sql #sql-server #check-constraints #referential-integrity
Вопрос:
У меня есть некоторые ограничения ПРОВЕРКИ, которые все зависят от уникальной пользовательской функции. Они все выглядят так:
ALTER TABLE t_adresse ADD CONSTRAINT chkAdresse_PaysCode CHECK(LibelleCodeMatch('PAYS', PaysCode)=1);
Мне нужно обновить LibelleCodeMatch().
Поэтому я отключил все КОНТРОЛЬНЫЕ ограничения:
EXEC sp_msforeachtable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL'
Я могу запросить системное представление sys.check_constraints, чтобы убедиться, что ограничения действительно отключены:
SELECT
name,
is_disabled,
is_not_trusted,
FROM sys.check_constraints;
Но затем, когда я попытаюсь ОТБРОСИТЬ и заново создать функцию:
DROP FUNCTION IF EXISTS LibelleCodeMatch;
Я получаю Сообщение об Ошибке 3729, Уровень 16. Невозможно УДАЛИТЬ ФУНКЦИЮ LibelleCodeMatch, потому что на нее ссылается объект chkRaisonSociale_FormeJuridiqueCode.
Есть ли способ избежать отбрасывания и повторного создания всех ограничений ?
Комментарии:
1. Я не могу придумать обходного пути, чтобы избежать удаления/воссоздания ограничений, поскольку это сложная зависимость.
2. какую версию SQL Server вы используете ??
3. Вы пробовали использовать
CREATE OR ALTER FUNCTION
вместоDROP FUNCTION IF EXISTS
того, чтобы следоватьCREATE FUNCTION
?4.
ALTER FUNCTION
не будет работать, если зависимые объекты являются ограничениями. Это работает, если зависимостью являются триггеры, процедуры хранения или другие функции. docs.microsoft.com/en-us/sql/t-sql/statements/…5. Честно говоря, я чувствую, что это просто еще одна причина, по которой не стоит использовать пользовательские скалярные функции в качестве
CONSTRAINT
. Как уже упоминалось, единственный способ сделать то, что вы хотите, — это удалить все ограничения, использующие функцию, изменить указанную функцию, а затем воссоздать все ограничения. Не особенно простая задача и, вероятно, дорогостоящая, когда все ограничения должны быть перепроверены.