Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Представления и метаданные  [new]
Tosh
Member

Откуда: Vladivostok
Сообщений: 2956
Доброго времени суток.
Столкнулся с очень бестолковой ситуацией:
  • есть представление вида
    select <fields> FROM <table>
  • на это представление повешан INSTEAD OF триггер, который обрабатывает изменение/добавление/удаление данных в представление.
  • смотрю свойства представления и вижу, что поля унаследовали свои описания из таблицы (больше всего меня беспокоит NOT NULL) - это не дает нормально редактировать данные из программы (например, IDENTITY поле требует быть заполненным хоть каким мусором при добавлении, что очень огорчает)

    Имеется вопрос - можно ли каким-то образом заставить сервер забыть про эти метаданные для указанных представлений? - все проверки и обработки висят в триггере, а переписывать кучу кода в клиентском софте очень не хочется.

    Вижу несколько вариантов:
  • обернуть все поля в представлении в CAST/CONVERT к тому же типу данных
    SELECT
      CONVERT(int, tbl.[id]),
      CONVERT(varchar(50), tbl.[name]),
      CONVERT(int, tbl.[num]),
      CONVERT(uniqueidentifier, tbl.[field1]),
      CONVERT(int, tbl.[field2]),
      CONVERT(datetime, tbl.[field3]),
      CONVERT(varchar(100), tbl.[field4])
    FROM
      [dbo].[TestTable] AS tbl
    
    это даст нужный эффект, но планы запросов мне совсем не нравятся
  • в представлении сделать UNION, в котором указать NULL для всех полей таблицы и получить запрос вида
    SELECT
      tbl.[id] AS [id],
      tbl.[name] AS [name],
      tbl.[num] AS [num],
      tbl.[field1] AS [field1],
      tbl.[field2] AS [field2],
      tbl.[field3] AS [field3],
      tbl.[field4] AS [field4]
    FROM
      [dbo].[TestTable] AS tbl
    UNION ALL
    SELECT
      NULL AS [id],
      NULL AS [name],
      NULL AS [num],
      NULL AS [field1],
      NULL AS [field2],
      NULL AS [field3],
      NULL AS [field4]
    WHERE
      1 = 2
    
    этот вариант дает более приемлемый (более короткий) план запроса, но тоже добавляет дополнительные действия (в частности 1 большой Compute Scalar с перечислением всех полей), что меня немного смущает

    В общем - есть ли у кого какие идеи по этому поводу или стоит просто забить на этот вопрос и не смущаться?
    ______________________________
    Чем чаще программист жалуется на чужой soft, тем хуже он делает свой.
  • 28 сен 09, 09:21    [7713752]     Ответить | Цитировать Сообщить модератору
     Re: Представления и метаданные  [new]
    iap
    Member

    Откуда: Москва
    Сообщений: 46975
    Видать, сервер-то 2000-й...

    Если F INT NOT NULL, то во VIEW обычно помогало
    SELECT NULLIF(F, NULL) AS F, ... FROM ...
    28 сен 09, 09:50    [7713879]     Ответить | Цитировать Сообщить модератору
     Re: Представления и метаданные  [new]
    Tosh
    Member

    Откуда: Vladivostok
    Сообщений: 2956
    А - ну да ... забыл - сервер 200-й ... возможно будет 2005-й - там разве есть другой вариант? а то мне сейчас проверить не на чем
    ______________________________
    Чем чаще программист жалуется на чужой soft, тем хуже он делает свой.
    28 сен 09, 09:58    [7713911]     Ответить | Цитировать Сообщить модератору
     Re: Представления и метаданные  [new]
    Tosh
    Member

    Откуда: Vladivostok
    Сообщений: 2956
    iap
    Видать, сервер-то 2000-й...

    Если F INT NOT NULL, то во VIEW обычно помогало
    SELECT NULLIF(F, NULL) AS F, ... FROM ...

    Этот вариант выходит более сложным вычислением, чем тот, что я предлагал вторым
    28 сен 09, 10:01    [7713918]     Ответить | Цитировать Сообщить модератору
     Re: Представления и метаданные  [new]
    iap
    Member

    Откуда: Москва
    Сообщений: 46975
    Tosh
    возможно будет 2005-й - там разве есть другой вариант?
    Зачем же 2005-й??
    Сразу 2008-й!

    Там вариант очень простой - об этой проблеме просто забываете, - и всё!
    В первую очередь вызывается триггер INSTEAD OF INSERT,
    в котором в таблицу вставляем не NULL, а реальное значение.
    28 сен 09, 11:11    [7714323]     Ответить | Цитировать Сообщить модератору
     Re: Представления и метаданные  [new]
    Tosh
    Member

    Откуда: Vladivostok
    Сообщений: 2956
    iap
    Tosh
    возможно будет 2005-й - там разве есть другой вариант?
    Зачем же 2005-й??
    Сразу 2008-й!

    Там вариант очень простой - об этой проблеме просто забываете, - и всё!
    В первую очередь вызывается триггер INSTEAD OF INSERT,
    в котором в таблицу вставляем не NULL, а реальное значение.

    ну на счет версии сервера - решаю не я и даже не мое ближайшее руководство ...

    А вот на счет того, что вызывается первым - поподробнее можно? В 2000-м сначала проходит проверка значения на соответствие метаданным (в данном случае - не заполнено поле, которое считается NOT NULL), а уже потом только идет вызов INSTEAD OF триггера - таким образом мы сначала получаем ошибку и обламываемся ...

    Собственно, из-за этого вся проблема-то и появилась
    28 сен 09, 13:37    [7715155]     Ответить | Цитировать Сообщить модератору
     Re: Представления и метаданные  [new]
    Glory
    Member

    Откуда:
    Сообщений: 104760
    Tosh

  • смотрю свойства представления и вижу, что поля унаследовали свои описания из таблицы (больше всего меня беспокоит NOT NULL) - это не дает нормально редактировать данные из программы (например, IDENTITY поле требует быть заполненным хоть каким мусором при добавлении, что очень огорчает)

  • Сервер к редактированию не имеет никакого отношения. Отношение имеет ваш драйвер и какой-нибудь грид. Никто не мешает вам отделить манипуляции клиента со значениями экранной формы от формирования команд, которые будут отсылаться серверу
    Правда при наличии INSTEAD OF триггера, значение для поля IDENTITY придется указывать при INSERT
    28 сен 09, 13:45    [7715232]     Ответить | Цитировать Сообщить модератору
     Re: Представления и метаданные  [new]
    Tosh
    Member

    Откуда: Vladivostok
    Сообщений: 2956
    Glory

    Сервер к редактированию не имеет никакого отношения. Отношение имеет ваш драйвер и какой-нибудь грид. Никто не мешает вам отделить манипуляции клиента со значениями экранной формы от формирования команд, которые будут отсылаться серверу
    Правда при наличии INSTEAD OF триггера, значение для поля IDENTITY придется указывать при INSERT

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

    Я сейчас пытаюсь ввести некоторую часть логики, отвечающей за безопасность и разграничения доступа, на стороне сервера - потому и появилась необходимость в представлениях так, чтобы клиенты об этом "не догадались"
    28 сен 09, 14:11    [7715401]     Ответить | Цитировать Сообщить модератору
     Re: Представления и метаданные  [new]
    iap
    Member

    Откуда: Москва
    Сообщений: 46975
    Tosh
    В 2000-м сначала проходит проверка значения на соответствие метаданным (в данном случае - не заполнено поле, которое считается NOT NULL), а уже потом только идет вызов INSTEAD OF триггера - таким образом мы сначала получаем ошибку и обламываемся ...

    Собственно, из-за этого вся проблема-то и появилась
    Это не совсем так.
    В 2000-м сначала проверяется соответствие свойству поля NOT NULL (а не всех метаданных), а потом вызывается триггер INSTEAD OF INSERT.
    В 2005-м это исправлено - у программиста появился шанс после команды INSERT, но до вставки данных в таблицу предоставить
    корректные данные в триггере INSTEAD OF INSERT.
    Как сказать об этом ещё подробнее, я не знаю...
    28 сен 09, 14:31    [7715525]     Ответить | Цитировать Сообщить модератору
     Re: Представления и метаданные  [new]
    Tosh
    Member

    Откуда: Vladivostok
    Сообщений: 2956
    iap, ага - понял ... просто я подумал, что речь шла о 2000-м - потому и удивился

    Жаль, но для этого решение задачи прийдется отложить до принятия решения о закупке, а решать надо сейчас
    Неужели никто с подобным вопросом не сталкивался?
    28 сен 09, 15:14    [7715873]     Ответить | Цитировать Сообщить модератору
     Re: Представления и метаданные  [new]
    Tosh
    Member

    Откуда: Vladivostok
    Сообщений: 2956
    Попробую поднять топик - вдруг мысли у кого свежие набежали ... просто некрасивые такие представления получаются
    ______________________________
    Чем чаще программист жалуется на чужой soft, тем хуже он делает свой.
    29 сен 09, 16:28    [7721166]     Ответить | Цитировать Сообщить модератору
    Все форумы / Microsoft SQL Server Ответить