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

Откуда: Саратов
Сообщений: 484
Microsoft SQL Server 2008 R2 (SP1) - 10.50.2500.0 (X64)

Создаю индексированное представление объединения 2 таблиц из разных схем:
create view MySchema.vMine
with schemabinding 
AS
(SELECT ...
        FROM dbo.tb1
		inner join MySchema.tb2 on ...


Представление создается, но при попытке построить кластеризованный индекс

CREATE UNIQUE CLUSTERED INDEX PK_vMine ON MySchema.vMine
(
	id asc,
        ...
)

Сервер выдает сообщение об ошибке:
Msg 1938, Level 16, State 1, Line 1
Невозможно создать индекс для представления "vMine", так как у базового объекта "tb1" другой владелец.

Как дать схеме MySchema права на объект dbo.tb1, или как по-другому решить проблему?
25 июл 12, 16:35    [12915015]     Ответить | Цитировать Сообщить модератору
 Re: Индексированное представление таблиц разных схем  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74928
Тут дело не в правах:

A view must meet the following requirements before you can create a clustered index on it:
...
  • All base tables referenced by the view must be in the same database as the view and have the same owner as the view.
    ...
  • 25 июл 12, 16:48    [12915119]     Ответить | Цитировать Сообщить модератору
     Re: Индексированное представление таблиц разных схем  [new]
    Шамиль Фаридович
    Member

    Откуда: Саратов
    Сообщений: 484
    То есть мне нужно изменить владельца схемы MySchema?
    ALTER AUTHORIZATION ON SCHEMA::[ MySchema] TO [dbo]
    

    А можно изменить владельца таблицы dbo.tb1,
    1)не перенося ее в схему MySchema и
    2)не меняя владельца схемы dbo на владельца схемы MySchema?
    25 июл 12, 17:10    [12915283]     Ответить | Цитировать Сообщить модератору
     Re: Индексированное представление таблиц разных схем  [new]
    pkarklin
    Member

    Откуда: Москва (Муром)
    Сообщений: 74928
    Вам нужны, чтоб И базовые таблицы И представление были в одной схеме.
    25 июл 12, 17:15    [12915314]     Ответить | Цитировать Сообщить модератору
     Re: Индексированное представление таблиц разных схем  [new]
    Шамиль Фаридович
    Member

    Откуда: Саратов
    Сообщений: 484
    Нет, мне нужно оставить схемы как есть.
    Они в нашей БД служат не для разграничения прав доступа, а как пространства имен.
    Сменой владельца схемы MySchema мне удалось решить задачу.
    Есть ли более простой способ и менее глобальный способ?
    25 июл 12, 17:18    [12915336]     Ответить | Цитировать Сообщить модератору
     Re: Индексированное представление таблиц разных схем  [new]
    invm
    Member

    Откуда: Москва
    Сообщений: 9724
    pkarklin
    Вам нужны, чтоб И базовые таблицы И представление были в одной схеме.
    Необязательно. Достаточно, чтобы владелец совпадал.
    use tempdb;
    go
    create schema s1 authorization dbo;
    go
    create schema s2 authorization dbo;
    go
    
    create table s1.TestTable (i int not null primary key, v1 int);
    create table s2.TestTable (i int not null primary key, v2 int);
    go
    
    create view dbo.vTest
    with schemabinding
    as
    select
     t1.i, t1.v1, t2.v2
    from
     s1.TestTable t1 join
     s2.TestTable t2 on t2.i = t1.i;
    go
    create unique clustered index IX_vTest__i on dbo.vTest (i);
    go
    
    insert into s1.TestTable values (1, 1);
    insert into s2.TestTable values (1, 2);
    
    select * from dbo.vTest;
    go
    
    drop view dbo.vTest;
    drop table s1.TestTable;
    drop table s2.TestTable;
    drop schema s1;
    drop schema s2;
    go
    
    25 июл 12, 17:23    [12915371]     Ответить | Цитировать Сообщить модератору
     Re: Индексированное представление таблиц разных схем  [new]
    Шамиль Фаридович
    Member

    Откуда: Саратов
    Сообщений: 484
    Есть еще 1 способ - изменить владельца таблицы dbo.tb1 на MySchemaUser - владельца схемы MySchema:
    ALTER AUTHORIZATION ON dbo.tb1 TO MySchemaUser
    

    Но для решения моей задачи больше подходит изменение владельца схемы MySchema на dbo
    ALTER AUTHORIZATION ON SCHEMA::[ MySchema] TO [dbo]
    
    26 июл 12, 10:26    [12917972]     Ответить | Цитировать Сообщить модератору
    Все форумы / Microsoft SQL Server Ответить