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

Откуда:
Сообщений: 92
Имел место топик:
https://www.sql.ru/forum/actualthread.aspx?tid=699664

Суть. Я защищаю таблицу, т.е., ограничиваю доступ и видимость к некоторым ее колонкам. И в тексте view пишу:

select '***' as [sp1533]

Но такое view не updatable.
Тогда, я навешиваю на неё триггер INSTEAD OF UPDATE где обновляю все колонки, кроме скрываемых. Супер.

Затык происходит при вставке. Триггер INSTEAD OF INSERT на view я повесить не могу, поскольку возникает проблема из приведенной выше ссылки, а код клиентского приложения я изменить не могу(чтобы указывать колонку с identity).

Вопрос: можно ли извернуться так, чтобы константное выражение:
 '***' as [sp1533]
воспринималось как переменная и стал возможен insert/update?
2 окт 09, 12:16    [7734055]     Ответить | Цитировать Сообщить модератору
 Re: И cнова view c триггерами INSTEAD OF  [new]
DeColo®es
Member

Откуда: Москва
Сообщений: 5499
Блог
И в чем проблема?
2 окт 09, 12:17    [7734069]     Ответить | Цитировать Сообщить модератору
 Re: И cнова view c триггерами INSTEAD OF  [new]
Glory
Member

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

воспринималось как переменная и стал возможен insert/update?

Ну так пусть ваше приложение и формирует правильный insert/update
2 окт 09, 12:18    [7734075]     Ответить | Цитировать Сообщить модератору
 Re: И cнова view c триггерами INSTEAD OF  [new]
Georgie
Member

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

воспринималось как переменная и стал возможен insert/update?

Ну так пусть ваше приложение и формирует правильный insert/update

Я не против. Но мое приложение - 1С. И текст ЭТОГО запроса я изменить не могу.
2 окт 09, 12:19    [7734086]     Ответить | Цитировать Сообщить модератору
 Re: И cнова view c триггерами INSTEAD OF  [new]
Georgie
Member

Откуда:
Сообщений: 92
DeColo®es
И в чем проблема?

Проблема в том, что при попытке вставить новую запись через view этого нельзя сделать, поскольку view содержит только константное выражение. Триггер на вью вместо вставки требует указания всех! колонок, в т.ч.. и айдентити. Почему не могу изменить код клиента? Смотрите пост ответа Glory
2 окт 09, 12:21    [7734102]     Ответить | Цитировать Сообщить модератору
 Re: И cнова view c триггерами INSTEAD OF  [new]
Glory
Member

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

воспринималось как переменная и стал возможен insert/update?

Ну так пусть ваше приложение и формирует правильный insert/update

Я не против. Но мое приложение - 1С. И текст ЭТОГО запроса я изменить не могу.

Какого "этого" ? Нужно менять текст insert/update
2 окт 09, 12:25    [7734136]     Ответить | Цитировать Сообщить модератору
 Re: И cнова view c триггерами INSTEAD OF  [new]
Georgie
Member

Откуда:
Сообщений: 92
Я понимаю, что, в общем-то, проблему приложения пытаюсь решить за счет СУБД... Может есть какое-то лекарство
2 окт 09, 12:25    [7734137]     Ответить | Цитировать Сообщить модератору
 Re: И cнова view c триггерами INSTEAD OF  [new]
Серый мембер
Guest
Сделайте вместо вьюхи таблицу, и с помощью AFTER триггеров реализуйте синхронизацию этой
таблицы и той, в которой лежат реальные данные. Триггеры придется повесить на обе таблицы.

Изврат конечно...
2 окт 09, 14:08    [7735187]     Ответить | Цитировать Сообщить модератору
 Re: И cнова view c триггерами INSTEAD OF  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Georgie,

1. В теме по ссылке, которую Вы тут привели, утверждается, что у Вас SQL 2005
2. Вы ссылаетесь на цитату Glory, как будто это слово божье. Разве трудно всё самому проверить?
А между тем, Glory неправ (см. пример ниже). Очень хочу сходить по ссылке (если он её даст), где имеется приведённый им текст.
Подозреваю, что он касается SQL 2000. К сожалению, проверить не могу - у нас везде SQL 2008
3. У Вас работает вот этот тестовый пример?
USE tempdb;
SET NOCOUNT ON;
IF OBJECT_ID(N'T',N'U') IS NOT NULL DROP TABLE T;
CREATE TABLE T(ID INT NOT NULL IDENTITY, X INT NOT NULL, Y INT NULL);
GO
IF OBJECT_ID(N'V',N'V') IS NOT NULL DROP VIEW V;
GO
CREATE VIEW V WITH VIEW_METADATA AS SELECT '***'[sp1533],* FROM T;
GO
CREATE TRIGGER tiV ON V INSTEAD OF INSERT AS INSERT T(X,Y) SELECT ISNULL(X,0),Y FROM inserted;
GO

INSERT V(Y) VALUES(0);
INSERT V(ID,Y) VALUES(-PI(),-11);

SELECT * FROM V;
GO
IF OBJECT_ID(N'V',N'V') IS NOT NULL DROP VIEW V;
IF OBJECT_ID(N'T',N'U') IS NOT NULL DROP TABLE T;
GO
В выделенных строках в поле VIEW, якобы IDENTITY, "вставляется" чёрт знает что, а поле X NOT NULL вообще не упоминается!
В чём у Вас проблемы, никак не пойму?
Триггер INSTEAD OF INSERT вызывается в первую очередь. Главное, чтобы внутри этого триггера всё было в порядке!

P.S. А может, я просто тупой, и неправильно понимаю, о чём Вы спрашиваете в многочисленных темах?...
2 окт 09, 21:36    [7737265]     Ответить | Цитировать Сообщить модератору
 Re: И cнова view c триггерами INSTEAD OF  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
iap, про ключевое стоп слово WITH VIEW_METADATA вы первые кто упомянул. :)
Но достали ли вы скользкий огурец из банки, если бы Glory его не "замучил". :)
P.S. Если я тоже правильно понял.
2 окт 09, 23:36    [7737493]     Ответить | Цитировать Сообщить модератору
 Re: И cнова view c триггерами INSTEAD OF  [new]
aleks2
Guest
iap
Georgie,

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


Главная проблема - ADO (кое использует 1C) имеет свое мнение относительно обновляемости рекордсета...

1. Нахрен INSTEAD OF триггера? Из пушки по насекомым палим?
2. Делаем View1 with view metadata, куды выбираем PK+все поля, шо мы хотим показать и дать редактировать.
3. Делаем View2 БЕЗ with view metadata, куды выбираем * из View1 + ляпаем скока угодно вычисляемых полей а-ля '***' as [sp1533].
4. Это будет обновляемый рекордсет для ADO.
3 окт 09, 16:45    [7738117]     Ответить | Цитировать Сообщить модератору
 Re: И cнова view c триггерами INSTEAD OF  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Mnior
iap, про ключевое стоп слово WITH VIEW_METADATA вы первые кто упомянул. :)
Кстати говоря, меня этому aleks2 когда-то научил
3 окт 09, 19:12    [7738346]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить