Можно ли добавить проверочное ограничение, которое вызывает пользовательскую функцию в другой базе данных? - PullRequest
1 голос
/ 02 января 2012

Я пытаюсь добавить пользовательскую функцию, которая фактически вызывает функцию SQL # CLR RegEx_IsMatch в столбце, но я получаю эту ошибку:

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

Но если функция находится в другом БД, я не уверен, как это сделать.

Ответы [ 2 ]

1 голос
/ 15 августа 2015

Вам не нужно делать это в CHECK CONSTRAINT. Триггер AFTER INSERT, UPDATE должен обеспечивать такую ​​же функциональность, что и CHECK CONSTRAINT. Вам просто нужно отменить операцию INSERT или UPDATE, если требуемое условие выполнено (или не выполнено). И это легко сделать, просто введя ROLLBACK, который работает благодаря триггерам, существующим в транзакции, которая является самой инструкцией DML. Следовательно, просто сделайте что-то вроде:

CREATE TRIGGER dbo.trCheckSomeField
ON dbo.SomeTable
AFTER INSERT, UPDATE
AS
SET NOCOUNT ON;

IF (EXISTS(
        SELECT *
        FROM   Inserted ins
        WHERE  Utility.SQL#.RegEx_IsMatch(ins.SomeField, ...) = 0
          )
    )
BEGIN;
  ROLLBACK TRAN;
  RAISERROR('Your data suck!', 16, 1);
  RETURN;
END;
0 голосов
/ 02 января 2012

Никогда не пробовал, но, возможно, вы можете создать вспомогательную функцию в той же БД, которая, в свою очередь, вызывает другую БД?

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

...