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

Откуда:
Сообщений: 127
Есть вьюха, которая собирается процедурой в динамике. На выходе получаем что-то типа:
create view t as select id, a, b, c, d=cast(null as numeric) from t1

или
create view t as select id, a, b, c, d from t1

Когда поле d не константа во вьюхе его нужно апдейтать:
update t set a=0, d=1

В противном случае:
update t set a=0

На практике вьюшки собираются из нескольких таблиц.
Как это можно реализовать?
8 янв 13, 19:38    [13737377]     Ответить | Цитировать Сообщить модератору
 Re: update view  [new]
_djХомяГ
Guest
1 нифига не понятно зачем view процедура и тд и тп
2 апдейтить поле "а" соотв таблицы (которой оно принадлежит)
8 янв 13, 19:56    [13737460]     Ответить | Цитировать Сообщить модератору
 Re: update view  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31442
pio777
Как это можно реализовать?
Вам нужно из метаданных получить информацию, обновляемое поле d или нет?
8 янв 13, 20:31    [13737604]     Ответить | Цитировать Сообщить модератору
 Re: update view  [new]
pio777
Member

Откуда:
Сообщений: 127
alexeyvg
pio777
Как это можно реализовать?
Вам нужно из метаданных получить информацию, обновляемое поле d или нет?

Да.
8 янв 13, 21:42    [13737963]     Ответить | Цитировать Сообщить модератору
 Re: update view  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31442
pio777
alexeyvg
пропущено...
Вам нужно из метаданных получить информацию, обновляемое поле d или нет?

Да.
Можно посмотреть в
select * from INFORMATION_SCHEMA.VIEW_COLUMN_USAGE
Обновляются те поля, которые есть в этом представлении.

Хотя не во всех случаях это поможет, допустим, если нет прав на апдэйт колонки...
8 янв 13, 22:11    [13738062]     Ответить | Цитировать Сообщить модератору
 Re: update view  [new]
pio777
Member

Откуда:
Сообщений: 127
alexeyvg,
Права все есть. Только вьюха ссылается на таблицы из других баз. А колонки из других баз не отображаются в INFORMATION_SCHEMA.VIEW_COLUMN_USAGE.
8 янв 13, 22:28    [13738143]     Ответить | Цитировать Сообщить модератору
 Re: update view  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31442
pio777
Только вьюха ссылается на таблицы из других баз. А колонки из других баз не отображаются в INFORMATION_SCHEMA.VIEW_COLUMN_USAGE.
Тогда не знаю :-(
Только самим хранить эту информацию.
8 янв 13, 23:04    [13738271]     Ответить | Цитировать Сообщить модератору
 Re: update view  [new]
invm
Member

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

select
 isnull(referenced_database_name, db_name()), referenced_entity_name, referenced_minor_name
from
 sys.dm_sql_referenced_entities('SchemaName.ViewName', 'object')
where
 referenced_minor_id > 0;
8 янв 13, 23:13    [13738309]     Ответить | Цитировать Сообщить модератору
 Re: update view  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31442
invm,

Спасибо, не знал про такую функцию! Наплодили представлений :-)
9 янв 13, 00:26    [13738586]     Ответить | Цитировать Сообщить модератору
 Re: update view  [new]
pio777
Member

Откуда:
Сообщений: 127
invm,

Спасибо большое, но вариант тоже не очень подходит.
Пример:
use tempdb
create table t1 (id int identity primary key, a char(1), b char(1))
create table t2 (id int identity primary key, a char(1))

insert into t1 (a,b) values ('a', 'b'), ('c', 'd')
insert into t2 (a) values ('a'), ('b')
go
create view tt1 as select t1.a, t1.b from t1 join t2 on t1.id=t2.id where t1.b is not null
go
create view tt2 as select t2.a, b=null from t1 join t2 on t1.id=t2.id  where t1.b is not null
go
select
 isnull(referenced_database_name, db_name()) db, referenced_entity_name, referenced_minor_name
from
 sys.dm_sql_referenced_entities('dbo.tt2', 'object')
where
 referenced_minor_id > 0
 
select
 isnull(referenced_database_name, db_name()) db, referenced_entity_name, referenced_minor_name
from
 sys.dm_sql_referenced_entities('dbo.tt1', 'object')
where
 referenced_minor_id > 0
go
drop table t1, t2
drop view tt1, tt2


db referenced_entity_name referenced_minor_name
tempdb t1 id
tempdb t1 b
tempdb t2 id
tempdb t2 a


db referenced_entity_name referenced_minor_name
tempdb t1 id
tempdb t1 a
tempdb t1 b
tempdb t2 id


Из последних запросов выявить нужную мне информацию не получается.
9 янв 13, 11:21    [13739935]     Ответить | Цитировать Сообщить модератору
 Re: update view  [new]
invm
Member

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

Пускай ваша процедура, наряду с view, генерит и триггер instead of update для этого view, учитывающий специфику обновлений базовых таблиц. Тогда инструкция обновления представления будет всегда одинаковой. Например:
use tempdb;
go

create table dbo.TestTable (i int not null primary key, v int);
go

create view dbo.vTest
as
select
 i,
 v,
 cast(null as int) as d
from
 dbo.TestTable;
go

create trigger trvTest_update
on dbo.vTest
instead of update
as
begin
 set nocount on;
 
 update t
  set
   v = i.v
 from
  inserted i join
  dbo.TestTable t on t.i = i.i;
end;
go

insert into dbo.TestTable
values
 (1, 1);
 
select * from dbo.vTest;

update dbo.vTest
 set
  v = 2,
  d = 2
where
 i = 1;
 
select * from dbo.vTest;
go

drop view dbo.vTest;
drop table dbo.TestTable;
go
9 янв 13, 17:02    [13742804]     Ответить | Цитировать Сообщить модератору
 Re: update view  [new]
pio777
Member

Откуда:
Сообщений: 127
Спасибо всем за помощь. Решили добавить это поле во все фактейблы, чтоб в корне исключить эту проблему.
9 янв 13, 17:37    [13743045]     Ответить | Цитировать Сообщить модератору
 Re: update view  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31442
pio777
Спасибо всем за помощь. Решили добавить это поле во все фактейблы, чтоб в корне исключить эту проблему.
Да, получается или так, или сохранять эту информацию самому...

Не получилось найти такую метаинформацию :-(
9 янв 13, 17:47    [13743107]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить