Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Доступ к представлениям на 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]

Так же как до таблиц.


Наверх

Титульная страница Поиск, карта сайта Написать письмо