изменить функцию, вызываемую с помощью ограничений проверки

#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 . Как уже упоминалось, единственный способ сделать то, что вы хотите, — это удалить все ограничения, использующие функцию, изменить указанную функцию, а затем воссоздать все ограничения. Не особенно простая задача и, вероятно, дорогостоящая, когда все ограничения должны быть перепроверены.