Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Пользовательские таблицы в хранимых процедурах  [new]
Yuri2003
Guest
Такая проблема. Пользователь user1 создает таблицу user1.table1(field1 int) и такая же таблица есть как dbo.table1.
Есть хранимая процедура dbo.proc1, в которой идет запрос к этой таблице без явного указания owner.
Как сделать, чтобы когда user1 запускает процедуру proc1, внутри ее обращение шло к таблице user1.table1 (явно указать овнера нельзя)?
24 янв 03, 11:44    [114088]     Ответить | Цитировать Сообщить модератору
 Re: Пользовательские таблицы в хранимых процедурах  [new]
Shura_M
Member

Откуда: Москва
Сообщений: 392
скопировать dbo.proc1 в user1.proc1
24 янв 03, 11:50    [114097]     Ответить | Цитировать Сообщить модератору
 Re: Пользовательские таблицы в хранимых процедурах  [new]
Белов Владимир
Member

Откуда: Москва
Сообщений: 1716
Интересная система.
А в чем такая необходимость, чтобы пользователи создавали свои постоянные таблицы ?
24 янв 03, 11:52    [114103]     Ответить | Цитировать Сообщить модератору
 Re: Пользовательские таблицы в хранимых процедурах  [new]
tygra
Member

Откуда: Тверь (Иркутск, Край)
Сообщений: 9997
А если отказаться от Пользователь user1 создает таблицу user1.table1(field1 int)
24 янв 03, 11:52    [114105]     Ответить | Цитировать Сообщить модератору
 Re: Пользовательские таблицы в хранимых процедурах  [new]
Glory
Member

Откуда:
Сообщений: 104760
CREATE PROCEDURE dbo.proc1
AS
...
exec('select * from table1')


Только вот действительно - зачем это нужно
24 янв 03, 11:54    [114108]     Ответить | Цитировать Сообщить модератору
 Re: Пользовательские таблицы в хранимых процедурах  [new]
Yuri2003
Guest
Вариант копирования процедур не рассматривается: их в системе примерно 500, да зарегестрированных пользователей порядка 100. А эта схема рассматривалась на предмет предоставления каждому пользователю своей оперативной таблицы без переделки принципов работы с базой.
24 янв 03, 11:59    [114114]     Ответить | Цитировать Сообщить модератору
 Re: Пользовательские таблицы в хранимых процедурах  [new]
Shura_M
Member

Откуда: Москва
Сообщений: 392
2 Glory. А вообще я вот думаю - почему оно так как есть не заработает?
Ведь какая разница и процедуры обращатся к объекту или просто.
Сначала SQL сервер смотрит есть ли таблица текущего пользователя, а потом dbo.


2 Yuri2003. По-моему, ничего делать не надо - все будет работать и так.
24 янв 03, 12:11    [114134]     Ответить | Цитировать Сообщить модератору
 Re: Пользовательские таблицы в хранимых процедурах  [new]
Glory
Member

Откуда:
Сообщений: 104760
А вообще я вот думаю - почему оно так как есть не заработает?
Ведь какая разница и процедуры обращатся к объекту или просто.
Сначала SQL сервер смотрит есть ли таблица текущего пользователя, а потом dbo.


Процедура выполняется в контекст владельца процедуры, а не запустившего ее пользователя.
24 янв 03, 12:13    [114138]     Ответить | Цитировать Сообщить модератору
 Re: Пользовательские таблицы в хранимых процедурах  [new]
Dmitri
Member

Откуда: Москва
Сообщений: 42
сделай одну оперативную таблицу и добавь туда идентификатор пользователя
24 янв 03, 12:16    [114142]     Ответить | Цитировать Сообщить модератору
 Re: Пользовательские таблицы в хранимых процедурах  [new]
Shura_M
Member

Откуда: Москва
Сообщений: 392
Процедура выполняется в контекст владельца процедуры, а не запустившего ее пользователя.

А есть ссылка на БОЛ? Мне кажется что это не так.
24 янв 03, 12:22    [114145]     Ответить | Цитировать Сообщить модератору
 Re: Пользовательские таблицы в хранимых процедурах  [new]
Yuri2003
Guest
Glory пишет верно: запрос выполняется в контексте владельца процедуры (т.е. сначала dbo), а в BOLе описан случай для создания либо изменения таблицы в процедуре.
24 янв 03, 13:06    [114213]     Ответить | Цитировать Сообщить модератору
 Re: Пользовательские таблицы в хранимых процедурах  [new]
Shura_M
Member

Откуда: Москва
Сообщений: 392
Does anybody know?

-пользователь user1 выполняет процедуру dbo.proc1.
-dbo.proc1 обращается к table1 без указателя владельца таблицы.
-в базе есть user1.table1 и dbo.table.

К какой из таблиц произойдет обращение?
24 янв 03, 13:08    [114216]     Ответить | Цитировать Сообщить модератору
 Re: Пользовательские таблицы в хранимых процедурах  [new]
Glory
Member

Откуда:
Сообщений: 104760
2Shura_M
А есть ссылка на БОЛ? Мне кажется что это не так.

mk:@MSITStore:D:\Program%20Files\Microsoft%20SQL%20Server\80\Tools\Books\architec.chm::/8_ar_da_2s4z.htm

"If the owner of a base table wants to prevent users from accessing the table directly, they can grant permissions on views or stored procedures referencing the table, but not grant any permissions on the table itself. This is the foundation of the SQL Server mechanisms to ensure that users do not see data they are not authorized to access."

Кроме того здесь
mk:@MSITStore:D:\Program%20Files\Microsoft%20SQL%20Server\80\Tools\Books\adminsql.chm::/ad_security_4iyb.htm
почитайте про Ownership Chains

К какой из таблиц произойдет обращение?

К dbo.table1
24 янв 03, 13:33    [114254]     Ответить | Цитировать Сообщить модератору
 Re: Пользовательские таблицы в хранимых процедурах  [new]
VVG_
Member

Откуда: Санкт-Петербург
Сообщений: 1203
Если прямое обращение - то к dbo.table1, если через динамический запрос типа exec или sp_executesql, то к user1.table1.

P.S. Слушайся Glory, он ошибается всего пару раз в год.
24 янв 03, 13:35    [114257]     Ответить | Цитировать Сообщить модератору
 Re: Пользовательские таблицы в хранимых процедурах  [new]
VAT
Member

Откуда: Нижний Новгород
Сообщений: 295
Если в процедуре select * from t то это dbo.t,
а если exec('select * from t') то user.t
24 янв 03, 13:35    [114259]     Ответить | Цитировать Сообщить модератору
 Re: Пользовательские таблицы в хранимых процедурах  [new]
Hibernate
Member

Откуда: Киев
Сообщений: 1670
к стати, что-то помнится еще было по поводу случая, если у процедуры имя начинается на sp_ ....
24 янв 03, 13:59    [114308]     Ответить | Цитировать Сообщить модератору
 Re: Пользовательские таблицы в хранимых процедурах  [new]
Dmitri
Member

Откуда: Москва
Сообщений: 42
>имя начинается на sp_ ....
ищет с начала в master потом среди процедур пользователей, и только потом среди процедур dbo
24 янв 03, 14:07    [114320]     Ответить | Цитировать Сообщить модератору
 Re: Пользовательские таблицы в хранимых процедурах  [new]
Shura_M
Member

Откуда: Москва
Сообщений: 392
Насчет того, почему dbo.proc1 обращается к dbo.table1. На это я нашел прямую ссылку в БОЛ :

Qualifying Names Inside Stored Procedures
Inside a stored procedure, object names used with statements (for example, SELECT or INSERT) that are not user-qualified default to the owner of the stored procedure.


А насчет того что:
Процедура выполняется в контекст владельца процедуры, а не запустившего ее пользователя
- все таки это не совсем корректная фраза. Скажем если у dbo есть права на select из таблицы user1.table1, то это не значит что процедура dbo.proc1 будет извлекать данные из user1.table1 запущенная пользователем не имеющим доступа к user1
24 янв 03, 14:35    [114365]     Ответить | Цитировать Сообщить модератору
 Re: Пользовательские таблицы в хранимых процедурах  [new]
Glory
Member

Откуда:
Сообщений: 104760
Мне кажется что определение имени объекта(name resolving) и определение возможности доступа к объекту (permissions resolving) это две разные вещи.
Нельзя начинать второе если не закончено первое.
Но в любом случае первое делается в зависимости от владельца процедуры.
И второе тоже (пока не произойдет ownership chain break или динамический запрос)

А что вас конкретно смущает во фразе "Процедура выполняется в контекст владельца процедуры, а не запустившего ее пользователя " ?
24 янв 03, 14:52    [114393]     Ответить | Цитировать Сообщить модератору
 Re: Пользовательские таблицы в хранимых процедурах  [new]
Shura_M
Member

Откуда: Москва
Сообщений: 392
А что вас конкретно смущает во фразе "Процедура выполняется в контекст владельца процедуры, а не запустившего ее пользователя " ?

Фраза запутывает, ИМХО. Я бы сказал "Процедура выполняется в контексте запустившего ее пользователя. В случае наличия ownership chains права на соотв объект не проверяются".
24 янв 03, 15:01    [114421]     Ответить | Цитировать Сообщить модератору
 Re: Пользовательские таблицы в хранимых процедурах  [new]
tygra
Member

Откуда: Тверь (Иркутск, Край)
Сообщений: 9997
Процедура выполняется в контексте запустившего ее пользователя. В случае наличия ownership chains права на соотв объект не проверяются".

Это как так? Т.е. совсем наоборот получается? Странное понимание....
24 янв 03, 15:03    [114424]     Ответить | Цитировать Сообщить модератору
 Re: Пользовательские таблицы в хранимых процедурах  [new]
Shura_M
Member

Откуда: Москва
Сообщений: 392
Это как так? Т.е. совсем наоборот получается?

посмотрим на permissions resolving

с одной стороны мы имеем :
процедура исполняется в контексте создателя за исключением:
-ownership chain break
-динамический запрос
-создание/удаление/изменение объектов
-вызов системных процедур
- и тд и тп

с другой стороны мы имеем:
процедура исполняется в контексте исполнителя за исключением:
-ownership chain

и что же по вашему исключение?
24 янв 03, 15:36    [114470]     Ответить | Цитировать Сообщить модератору
 Re: Пользовательские таблицы в хранимых процедурах  [new]
Shura_M
Member

Откуда: Москва
Сообщений: 392
так чего человеку посоветуем? Yuri2003, ты еще здесь?
переименовать dbo.table1 в dbo.table1all. добавить в table1all столбец UserName и сделать view
CREATE VIEW dbo.table1

AS
SELECT * FROM dbo.table1all
WHERE (field1 = SYSTEM_USER)
WITH CHECK OPTION


(идея Dmitri)
24 янв 03, 17:16    [114612]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить