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

Откуда:
Сообщений: 81
Я ему:
create table tmp1 (ID1 INT, VAL1 VARCHAR(36))
create table tmp2 (ID2 INT, VAL2 VARCHAR(36))

CREATE VIEW tmpv
WITH VIEW_METADATA as
select ID1,VAL1,VAL2
from tmp1 INNER JOIN tmp2 on id1=id2

INSERT INTO tmpv(ID1,VAL1,VAL2) VALUES (1,'1','1')

DROP VIEW tmpv
DROP TABLE tmp1
DROP TABLE tmp2

SELECT * FROM tmp1

а он:
View or function 'tmpv' is not updatable because the modification affects multiple base tables.

Как определяются base tables?
FK?
29 окт 03, 15:36    [398227]     Ответить | Цитировать Сообщить модератору
 Re: Insert Into View  [new]
Makar4ik
Member

Откуда: Когда-то были Лужки, а теперь Бордюр-Сити.
Сообщений: 2676
base tables - это все те таблицы, по которым ты пишешь вьюху.
Если вьюха более, чем по одной таблице, то она - 'is not updatable'.
Т.е. "неживая".
Чтобы что-то в нее вставить надо писать для нее триггер INSTEAD OF INSERT
29 окт 03, 15:42    [398237]     Ответить | Цитировать Сообщить модератору
 Re: Insert Into View  [new]
segun
Member

Откуда: Москва
Сообщений: 504
CREATE VIEW tmpv
WITH VIEW_METADATA as
select ID1,VAL1,VAL2
from tmp1 INNER JOIN tmp2 on id1=id2

base tables: tmp1, tmp2

Вам поможет триггер на view - instead of insert
29 окт 03, 15:44    [398241]     Ответить | Цитировать Сообщить модератору
 Re: Insert Into View  [new]
Glory
Member

Откуда:
Сообщений: 104760
Улавливаете разниу ?
create table tmp1 (ID1 INT, VAL1 VARCHAR(36)) 

go
create table tmp2 (ID2 INT, VAL2 VARCHAR(36))
go

CREATE VIEW tmpv
WITH VIEW_METADATA as
select ID1,VAL1,VAL2
from tmp1 INNER JOIN tmp2 on id1=id2
go
INSERT INTO tmpv(ID1,VAL1) VALUES (1,'1')
INSERT INTO tmpv(VAL2) VALUES ('1')

select * from tmp1
select * from tmp2
go
DROP VIEW tmpv
DROP TABLE tmp1
DROP TABLE tmp2
29 окт 03, 15:50    [398262]     Ответить | Цитировать Сообщить модератору
 Re: Insert Into View  [new]
BVASmash
Member

Откуда:
Сообщений: 81
Понятно.
Тока это ни чем не отличается от
INSERT INTO tmp1(ID1,VAL1) VALUES (1,'1')
INSERT INTO tmp2(VAL2) VALUES ('1')

Просто думал что сам поймет что если иннер джойн то по одной записи в таблицу и ID2 тоже поймет какой нада.

Всем Спасибо!
29 окт 03, 16:10    [398314]     Ответить | Цитировать Сообщить модератору
 Re: Insert Into View  [new]
Glory
Member

Откуда:
Сообщений: 104760
Понятно.
Тока это ни чем не отличается от

Как сказать, как сказать

Просто думал что сам поймет что если иннер джойн то по одной записи в таблицу и ID2 тоже поймет какой нада.
Ну ладно еще количество записей как-то можно логически "вычислить" из типа соединения. И то не факт
Но откуда должно быть известно что id1 в одной таблице это тоже самое что id2 в другой таблице ???
29 окт 03, 16:15    [398334]     Ответить | Цитировать Сообщить модератору
 Re: Insert Into View  [new]
BVASmash
Member

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

CREATE VIEW tmpv
WITH VIEW_METADATA as
select ID1,VAL1,VAL2
from tmp1 INNER JOIN tmp2 on id1=id2

Может отсюда.
29 окт 03, 16:20    [398354]     Ответить | Цитировать Сообщить модератору
 Re: Insert Into View  [new]
Glory
Member

Откуда:
Сообщений: 104760
И что отсюда можно достоверно получить ?
Что в таблице2 НЕ содержатся id которые отсутсвуют в таблице1 ?
Или что в таблице2 содержится только одна запись для каждой записи из таблицы1 ?
29 окт 03, 16:24    [398371]     Ответить | Цитировать Сообщить модератору
 Re: Insert Into View  [new]
Makar4ik
Member

Откуда: Когда-то были Лужки, а теперь Бордюр-Сити.
Сообщений: 2676
Ниоткуда он не поймет!

он же не обязан преобразовывать запрос

INSERT INTO tmpv(ID1,VAL1,VAL2) VALUES (1,'1','1')
в
INSERT INTO tmp1(ID1,VAL1) VALUES (1,'1')
INSERT INTO tmp2(ID2,VAL1) VALUES (1,'1')

только на основании того, что тут такая связка!

Это надо прописать в:

CREATE TRIGGER xi_tmpv ON tmpv
INSTEAD OF INSERT
AS begin
INSERT INTO tmp1(ID1,VAL1) select(ID1,VAL1) from inserted
INSERT INTO tmp2(ID2,VAL2) select(ID1,VAL2) from inserted
end
29 окт 03, 16:27    [398378]     Ответить | Цитировать Сообщить модератору
 Re: Insert Into View  [new]
BVASmash
Member

Откуда:
Сообщений: 81
2Glory
автор писал:
что в таблице2 содержится только одна запись для каждой записи из таблицы1

что соответственно говорит о том что на каждую запись в tmp1 вставлять запись в tmp2 с tmp2.id2=tmp1.id1
2ALL
Господа, спасибо что объяснили.
29 окт 03, 17:50    [398622]     Ответить | Цитировать Сообщить модератору
 Re: Insert Into View  [new]
Glory
Member

Откуда:
Сообщений: 104760
Объясню попроще
create table tmp1 (ID1 INT, VAL1 VARCHAR(36)) 

go
create table tmp2 (ID2 INT, VAL2 VARCHAR(36))
go

INSERT INTO tmp1(ID1,VAL1) VALUES (1,'1')
INSERT INTO tmp2(ID2,VAL2) VALUES (2,'2')
select ID1,VAL1,VAL2
from tmp1 INNER JOIN tmp2 on id1=id2

go
DROP TABLE tmp1
DROP TABLE tmp2

Какой логикой на ваш взгляд мог бы руководствоваться сервер для показанных выше данных при добалвении в представлении записи
INSERT INTO tmpv(ID1,VAL1,VAL2) VALUES (1,'1','1') ?
А при INSERT INTO tmpv(ID1,VAL1,VAL2) VALUES (2,'2','2') ?
29 окт 03, 17:58    [398650]     Ответить | Цитировать Сообщить модератору
 Re: Insert Into View  [new]
BVASmash
Member

Откуда:
Сообщений: 81
После
INSERT INTO tmpv(ID1,VAL1,VAL2) VALUES (1,'1','1') ? 

INSERT INTO tmpv(ID1,VAL1,VAL2) VALUES (2,'2','2') ?


SELECT * FROM tmp1

ID1 VAL1
1 1
1 1
2 2

Почему бы и нет.
29 окт 03, 18:08    [398668]     Ответить | Цитировать Сообщить модератору
 Re: Insert Into View  [new]
Glory
Member

Откуда:
Сообщений: 104760
Если я например в отличии от вас не хочу, чтобы у меня в таблицах добавлялись записи если они там фактически есть ?
Тогда нужны разные виды представлений - типа

CREATE VIEW tmpv
WITH VIEW_METADATA, LEFT_UPDATABLE, CHECK_CONSTARINTS, IGNORE_DUBLICATES as ????
29 окт 03, 18:15    [398683]     Ответить | Цитировать Сообщить модератору
 Re: Insert Into View  [new]
BVASmash
Member

Откуда:
Сообщений: 81
автор писал:
Если я например в отличии от вас не хочу, чтобы у меня в таблицах добавлялись записи если они там фактически есть ?

в самих таблицах Unique keys наставить

Считаю спор бессмысленным.
Буду юзать что есть.
Glory, еще раз спасибо.
29 окт 03, 18:29    [398716]     Ответить | Цитировать Сообщить модератору
 Re: Insert Into View  [new]
x
Guest
Затоптали человека. А ведь он прав

Вон Access без проблем работает с такими вьюхами -
и вставляет, и изменяет, и удаляет.
А у MSSQL ума не хватает.

Хорошо хоть каскадные изменения\удаления появились,
но и здесь Access круче - у него не возникает проблем при двух ссылках на одну таблицу.
29 окт 03, 18:38    [398735]     Ответить | Цитировать Сообщить модератору
 Re: Insert Into View  [new]
Glory
Member

Откуда:
Сообщений: 104760
Да не спорю и не на спасибо напрашиваюсь.
Мне просто интересно как себе люди представляют тот или иной процесс, который именуют "сервер мог бы и сам догадаться".
29 окт 03, 18:39    [398738]     Ответить | Цитировать Сообщить модератору
 Re: Insert Into View  [new]
BVASmash
Member

Откуда:
Сообщений: 81
Я просто думал что напрягаю своими вопросами.
А по-поводу Access не знал.
Тем более почему такого НЕТ в MSSQL?
29 окт 03, 18:57    [398767]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить