powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / sp.Prepared or not sp.Prepared(7->2000)
5 сообщений из 5, страница 1 из 1
sp.Prepared or not sp.Prepared(7->2000)
    #32010308
Олег
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Приветствую тебя, All!
Может я чего не понимаю, но....
Ситуация:
На MS SQLе есть две процедуры A и В.
Процедура А вызывает процедуру B.
Есть DBUser, у которого есть права на EXEC для A, но нет для В.
Проверяем на MSSQL 7.0:
QueryAnalyzer:
Exec A => Ok
Delphi Application (variant 1):
sp := TADOStoredProcedure.Create(nil);
.........
sp.ProcedureName := 'A';
.......................
sp.Open
..............
=>Ok
Delphi Application (variant 2):
sp := TADOStoredProcedure.Create(nil);
.........
sp.ProcedureName := 'A';
sp.Prepared := True; //!!!!important
.......................
sp.Open
..............
=>Ok

Проверяем на MSSQL 2000:
QueryAnalyzer:
Exec A = > Ok
Delphi Application (variant 1):
sp := TADOStoredProcedure.Create(nil);
.........
sp.ProcedureName := 'A';
.......................
sp.Open
..............
=>Ok
Delphi Application variant 2:
sp := TADOStoredProcedure.Create(nil);
.........
sp.ProcedureName := 'A';
sp.Prepared := True; //!!!!important
.......................
sp.Open
..............
=>Error:
Error=EXECUTE permission denied on object 'B', database 'test22', owner 'dbo'

Вот такая петрушка понимаешь....
Вообще говоря, я не совсем понимаю назначение этого Prepared свойства в
данном контексте, судя по кешу на сервере ему(серверу) абсолютно пофиг.
Может кто обяснит что происходит и где я неправ? Ж-/
Использую Delphi 5, Ado->OleDB, MDAC ver 2.6.
...
Рейтинг: 0 / 0
sp.Prepared or not sp.Prepared(7->2000)
    #32010312
GreenSunrise
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот кусочек статьи из MSDN (topic "ADO Command Strategies")

The (so-called) Prepared property
In theory, the Prepared property was designed to reduce work on the server by pre-compiling ad hoc queries so subsequent executions would use a temporary stored procedure instead of repeating the compile phase each time the query is executed. However, this is not the case with ADO's implementation—keep reading.

Since ODBC was invented some years ago, SQL Server has gotten much smarter—it now knows how to leverage existing (in cache) compiled query plans. That is, once you execute a query from ADO (or by any means), SQL Server constructs a query plan, saves it in the procedure cache, and executes it. When the query is done, SQL Server marks the query plan as "discardable" but leaves it in memory as long as it can. When another identical (or close-enough) query comes in, which is very likely in systems running multiple clients, SQL Server simply re-uses the cached plan. This saves a significant amount of time and greatly improves scalability. It makes SQL Server actually run faster as more users are added, assuming they're doing about the same things with the same set of queries.

ADO and its ODBC and OLE DB data providers know about this strategy, and in most cases they execute sp_executesql to take advantage of this feature. However, this puts the Prepared property in a quandary. It insists on creating temporary stored procedures, but the data providers insist on using sp_executesql. The result? Chaos. I describe what happens a little later when executing Command objects is discussed.

My recommendation for the Prepared property: forget it—at least for SQL Server. For other providers, set up a trace that shows exactly what's going on—what the server is being asked to do.

---------------------------------------
Возникающей ошибки это, может быть, не объясняет, но, похоже, что использовать Prepared свойство для ADO не стоит.
...
Рейтинг: 0 / 0
sp.Prepared or not sp.Prepared(7->2000)
    #32010325
Олег
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Весьма признателен за наводку.
...
Рейтинг: 0 / 0
sp.Prepared or not sp.Prepared(7->2000)
    #32010358
Фотография Garya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Prepared устанавливается в True для запросов с параметрами. Этим достигается некоторое подобие параметризированных запросов благодаря тому, что SQL-сервер не выполняет повторный разбор и компиляцию запроса при выполнении этого же запроса с другими значениями параметров.
К примеру, для данной ситуации вполне подходит запрос "select * from TBL where SomeField=?". Вместо знака вопроса передается значение параметра. SQL-сервер строит план выполнения подобных запросов с учетом, что значение параметра может изменяться. И не выполняет повторную компиляцию запроса при получении такого же запроса с другим значением параметра (при условии, что последующий запрос был сделан без не слишком длинной паузы после предшествцующей отправки SQL-серверу этого же запроса с другим значением параметра, и план выполнения запроса еще остался в кэше).
...
Рейтинг: 0 / 0
sp.Prepared or not sp.Prepared(7->2000)
    #32010361
GreenSunrise
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это-то всем понятно. Для того и устанавливают Prepared. Вопрос был в том, что с ADO это свойство может некорректно работать.
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / sp.Prepared or not sp.Prepared(7->2000)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]