![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Доступ к представлениям на MS SQL через ADO... [D5, MSSQL]
MaXie © (2002-04-15 11:45:00)Тривиальный вопрос:
Есть ли возможность в Delphi получить доступ к представлениям на MS SQL сервере через ADO интерфейс?
... или как до них "достучаться"?!
S_S_S (2002-04-15 16:52:00) [1]2 Johnmen
>На мой логин указывается явный доступ к представлению с возможностью просмотра (SELECT) и добавления (INSERT) данных.
А это что тогда?
>MaXie
попробуйте через ЕМ просмотреть вашу вьюху
Johnmen (2002-04-15 14:27:00) [2]И гранды на вью выданы, да ?
MaXie (2002-04-15 14:21:00) [3]>Delirium ©
На мой логин указывается явный доступ к представлению с возможностью просмотра (SELECT) и добавления (INSERT) данных.
В модуль данных добавляется элемент класса TADOTable. В свойстве Connection указывается имя элемента класса TADOConnection, который обеспечивает соединение клиента с БД. Заходим в список доступных таблиц TableName - имени представления, к которому на мой логин явно указан доступ, нет!
Что я делаю не так, что не позволяет мне "увидеть" представление?
Delirium (2002-04-15 13:33:00) [4]> Mike S ©
Не будем спорить на словах - обратимся к исходникам, вот кусочек из ADODB.pas
procedure TADOConnection.GetTableNames(List: TStrings;
SystemTables: Boolean);
var
TypeField,
NameField: TField;
TableType: string;
DataSet: TADODataSet;
begin
CheckActive;
DataSet := TADODataSet.Create(nil);
try
OpenSchema(siTables, EmptyParam, EmptyParam, DataSet);
TypeField := DataSet.FieldByName("TABLE_TYPE"); { do not localize }
NameField := DataSet.FieldByName("TABLE_NAME"); { do not localize }
List.BeginUpdate;
try
List.Clear;
while not DataSet.EOF do
begin
TableType := TypeField.AsString; // Как видно ниже выбираются и таблицы и представления
if (TableType = "TABLE") or (TableType = "VIEW") or
(SystemTables and (TableType = "SYSTEM TABLE")) then
List.Add(NameField.AsString);
DataSet.Next;
end;
finally
List.EndUpdate;
end;
finally
DataSet.Free;
end;
end;
А что касается MSSQL, то он корректно возвращает тип объекта (table, view или system table) так что претензии MaXie к Borland-у необоснованы.
Mike S (2002-04-15 13:19:00) [5]Delirium © (15.04.02 13:01)
Это правда видно.
Delirium (2002-04-15 13:01:00) [6]> MaXie © (15.04.02 11:52)
> Да, но элемент класса TADOtable в своем поле TableName отображает только таблицы, находящиеся на SQL сервере.
Это не правда - TADOTable, применительно к MSSQL, передоставляет полный список таблиц и представлений, разрешённых для использования конкретным логином. Если вы чего-то не находите проверьте права доступа.
Mike S (2002-04-15 12:58:00) [7]select *
from dbo.sysobjects o
where OBJECTPROPERTY(o.id, N"IsView") = 1
может это тебе поможет.
MaXie (2002-04-15 12:41:00) [8]2wicked
Понимаешь, wicked, проблема то заключается не в "ручках", а в ограничении доступа к данным, хранящимся на SQL сервере. Есть набор представлений, через которые осуществляется ограниченный доступ к системным и базовым таблицам Базы Данных. Как в этом случае с клиента получить доступ к информации? Писать запрос к представлению? Я понимаю, что представления, фактически, те же самые таблицы, но вот как и при помощи чего их "увидеть" при написании клиента?
P.S. Да, есть способ "достучаться" через ODBC к представлениям, но в этом случае на каждой клиентской машине необходимо предварительно его настроить (прописать учетную запись доступа к БД).
wicked (2002-04-15 12:27:00) [9]2 MaXie ©
а что ты понимаешь под словом ADO-интерфейс?...
он весь и построен на sql-запросах... а ADOTable, кстати, не рекомендуется использовать, он оставлен для лёгкости перевода старых bde-шных приложений под ado... конечно, ado напрямую поддерживает вещи типа ADOTable, но и microsoft оставила его в сиротах...
видать не судьба... придётся тебе писать select"ы ручками... :)
MaXie (2002-04-15 12:23:00) [10]ВСЕ С НАПИСАНИЕМ ПОНЯТНО- вопросов ни каких не возникает!
Вопрос ставится иначе: "Как получить доступ к представлениям, расположенным на MS SQL сервере, через ADO интерфейс?"
Зачем писать то, что уже написано!
Зачем давать доступ к базовой таблице (даже на просмотр SELECT), если для этого предусмотрены представления, граммотно ограничивающие доступ пользователей к данным?
Так есть в Delphi возможность связать элемент с представлением на MS SQL Server или все-таки нет?
wicked (2002-04-15 12:15:00) [11]2 MaXie ©
а чё, трудно написать select <поля> from <представление>?...
представление всё равно имеет вид таблицы и из него необходимовыбирать данные...
MaXie (2002-04-15 12:10:00) [12]Я конечно мало что понимаю в Delphi, но как с помощью элемента ADOQuery, получить доступ к представлениям на MS SQL?
Насколько мне известно, в ADOQuery самостоятельно пишется текст SQL-запроса.
Вопрос же заключается в том, как связать элемент с запросом (представлением), которое уже написано и находится на SQL сервере?
Mike S (2002-04-15 11:57:00) [13]TADOQuery
MaXie (2002-04-15 11:52:00) [14]Да, но элемент класса TADOtable в своем поле TableName отображает только таблицы, находящиеся на SQL сервере.
При помощи элемента какого класса можно "увидеть" представления, находящиеся на SQL сервере?
Mike S (2002-04-15 11:47:00) [15]Так же как до таблиц.