Форум: "Базы";
Текущий архив: 2002.05.09;
Скачать: [xml.tar.bz2];
ВнизДоступ к представлениям на MS SQL через ADO... Найти похожие ветки
← →
MaXie (2002-04-15 11:45) [0]Тривиальный вопрос:
Есть ли возможность в Delphi получить доступ к представлениям на MS SQL сервере через ADO интерфейс?
... или как до них "достучаться"?!
← →
Mike S (2002-04-15 11:47) [1]Так же как до таблиц.
← →
MaXie (2002-04-15 11:52) [2]Да, но элемент класса TADOtable в своем поле TableName отображает только таблицы, находящиеся на SQL сервере.
При помощи элемента какого класса можно "увидеть" представления, находящиеся на SQL сервере?
← →
Mike S (2002-04-15 11:57) [3]TADOQuery
← →
MaXie (2002-04-15 12:10) [4]Я конечно мало что понимаю в Delphi, но как с помощью элемента ADOQuery, получить доступ к представлениям на MS SQL?
Насколько мне известно, в ADOQuery самостоятельно пишется текст SQL-запроса.
Вопрос же заключается в том, как связать элемент с запросом (представлением), которое уже написано и находится на SQL сервере?
← →
wicked (2002-04-15 12:15) [5]2 MaXie ©
а чё, трудно написать select <поля> from <представление>?...
представление всё равно имеет вид таблицы и из него необходимо выбирать данные...
← →
MaXie (2002-04-15 12:23) [6]ВСЕ С НАПИСАНИЕМ ПОНЯТНО - вопросов ни каких не возникает!
Вопрос ставится иначе: "Как получить доступ к представлениям, расположенным на MS SQL сервере, через ADO интерфейс?"
Зачем писать то, что уже написано!
Зачем давать доступ к базовой таблице (даже на просмотр SELECT), если для этого предусмотрены представления, граммотно ограничивающие доступ пользователей к данным?
Так есть в Delphi возможность связать элемент с представлением на MS SQL Server или все-таки нет?
← →
wicked (2002-04-15 12:27) [7]2 MaXie ©
а что ты понимаешь под словом ADO-интерфейс?...
он весь и построен на sql-запросах... а ADOTable, кстати, не рекомендуется использовать, он оставлен для лёгкости перевода старых bde-шных приложений под ado... конечно, ado напрямую поддерживает вещи типа ADOTable, но и microsoft оставила его в сиротах...
видать не судьба... придётся тебе писать select"ы ручками... :)
← →
MaXie (2002-04-15 12:41) [8]2wicked
Понимаешь, wicked, проблема то заключается не в "ручках", а в ограничении доступа к данным, хранящимся на SQL сервере. Есть набор представлений, через которые осуществляется ограниченный доступ к системным и базовым таблицам Базы Данных. Как в этом случае с клиента получить доступ к информации? Писать запрос к представлению? Я понимаю, что представления, фактически, те же самые таблицы, но вот как и при помощи чего их "увидеть" при написании клиента?
P.S. Да, есть способ "достучаться" через ODBC к представлениям, но в этом случае на каждой клиентской машине необходимо предварительно его настроить (прописать учетную запись доступа к БД).
← →
Mike S (2002-04-15 12:58) [9]select *
from dbo.sysobjects o
where OBJECTPROPERTY(o.id, N"IsView") = 1
может это тебе поможет.
← →
Delirium (2002-04-15 13:01) [10]> MaXie © (15.04.02 11:52)
> Да, но элемент класса TADOtable в своем поле TableName отображает только таблицы, находящиеся на SQL сервере.
Это не правда - TADOTable, применительно к MSSQL, передоставляет полный список таблиц и представлений, разрешённых для использования конкретным логином. Если вы чего-то не находите проверьте права доступа.
← →
Mike S (2002-04-15 13:19) [11]Delirium © (15.04.02 13:01)
Это правда видно.
← →
Delirium (2002-04-15 13:33) [12]> 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-у необоснованы.
← →
MaXie (2002-04-15 14:21) [13]>Delirium ©
На мой логин указывается явный доступ к представлению с возможностью просмотра (SELECT) и добавления (INSERT) данных.
В модуль данных добавляется элемент класса TADOTable. В свойстве Connection указывается имя элемента класса TADOConnection, который обеспечивает соединение клиента с БД. Заходим в список доступных таблиц TableName - имени представления, к которому на мой логин явно указан доступ, нет!
Что я делаю не так, что не позволяет мне "увидеть" представление?
← →
Johnmen (2002-04-15 14:27) [14]И гранды на вью выданы, да ?
← →
S_S_S (2002-04-15 16:52) [15]2 Johnmen
>На мой логин указывается явный доступ к представлению с возможностью просмотра (SELECT) и добавления (INSERT) данных.
А это что тогда?
>MaXie
попробуйте через ЕМ просмотреть вашу вьюху
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2002.05.09;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.005 c