Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.06.2017, 17:16   #11
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,194
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
[B]
личная ремарка.

имхо, зря Вы это. универсального ничего не бывает, да и платить за эту гибкость придётся...
Чем платить?
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 13.06.2017, 17:28   #12
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Цитата:
Сообщение от artemavd Посмотреть сообщение
Чем платить?
сложностью разработки (вместо того, чтобы написать select id, name from MyTable будете мутить процедуры с параметрами, разбором полей и т.д. и т.п.), убогим (читай = "универсальным") интерфейсом, потерей производительности и т.д. и т.п.
А самое обидное, что в процессе эксплуатации (ВДРУГ ) выяснится, например, что в процедуру надо передавать не только имя таблицы, но и , например, набор полей, которые нужны.
А потом (опять ВДРУГ ) выяснится, что часть полей нужно получать из другой таблицы и её нужно связывать с исходной и т.д. и т.п.
Жизнь очень гибкая штука и её крайне трудно засунуть в рамки (не упрощая и ничего не ломая при подгонке).

А статью то прочитали про exec и его особенности?
Serge_Bliznykov вне форума Ответить с цитированием
Старый 13.06.2017, 17:43   #13
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,194
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
сложностью разработки (вместо того, чтобы написать select id, name from MyTable будете мутить процедуры с параметрами, разбором полей и т.д. и т.п.), убогим (читай = "универсальным") интерфейсом, потерей производительности и т.д. и т.п.
А самое обидное, что в процессе эксплуатации (ВДРУГ ) выяснится, например, что в процедуру надо передавать не только имя таблицы, но и , например, набор полей, которые нужны.
А потом (опять ВДРУГ ) выяснится, что часть полей нужно получать из другой таблицы и её нужно связывать с исходной и т.д. и т.п.
Жизнь очень гибкая штука и её крайне трудно засунуть в рамки (не упрощая и ничего не ломая при подгонке).

А статью то прочитали про exec и его особенности?
Статью почитал, Сергей
Так видишь, я могу сделать запрос, в него подставлять какие поля нужны.
Мне нужно что: мне нужно, передав имя таблицы получить из нее данные, чтобы их можно было редактировать потом. Заранее имя таблицы неизвестно. Предполагал, что поля таблицы будут передаваться в том же запросе в ХП, т.е., например (словесно) так:
Код:
select 'тут перечень полей' from 'тут переданное имя таблицы'
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 13.06.2017, 17:58   #14
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Цитата:
Сообщение от artemavd Посмотреть сообщение
Так видишь, я могу сделать запрос, в него подставлять какие поля нужны.
да, Вы можете так сделать.
я не возражаю!

Цитата:
Сообщение от artemavd Посмотреть сообщение
чтобы их можно было редактировать потом.
вот, я про это и говорил, обычно редакторы, где все поля редактируются без относительно их назначения (универсально) и выглядят убого (одинаково).
я не однократно сталкивался с подобными системами.
Впрочем, это же моё личное мнение.
И дьявол, как всегда, в деталях.
В каком-то случае подобная универсальность вполне допустима и оправдана, в каком-то, наоборот, не оправдана.
Вам там на месте виднее, как лучше.
Да и жизнь/практика обычно всё расставляет по своим местам.

В любом случае, желаю успехов в проектировании и разработке!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 13.06.2017, 18:04   #15
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Согласен с Сергеем, подобная универсальность при развитии системы к добру не приведет. Да и дбнавигатор слишком как-то по школьному ))
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 13.06.2017, 18:09   #16
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,194
По умолчанию

Ну хорошо.
Может быть я и откажусь от этой идеи потом.
Но:
как можно тогда управлять какие поля будут выбираться и доступны пользователю, а какие нет?
можно ли на уровне сервера управлять доступом к конкретным ХП пользователям?
Чтобы я мог указывать какие таблицы могут быть доступны пользователю, с каким и полями.
Или делать все это через Select в ХП, перечисляя, и, потом просто администрируя, меняя этот перечень в уже ХП на сервере? Я думал так сделать изначально кстати.
В качестве админки у меня MS SQL Managment Studio.
Иными словами, можно ли делать такое:
Код:
CREATE PROCEDURE [dbo].[Get1] 
	-- Add the parameters for the stored procedure here
	@ListFields varchar(255)
AS
BEGIN
	-- SET NOCOUNT ON added to prevent extra result sets from
	-- interfering with SELECT statements.
	SET NOCOUNT ON;

    -- Insert statements for procedure here
	SELECT @ListFields FROM dbo.Tab
END
GO
А в @ListFields просто передавать список полей как строковую переменную и все?
Если "да", то меня это устроит!
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.

Последний раз редактировалось artemavd; 13.06.2017 в 18:31.
artemavd вне форума Ответить с цитированием
Старый 13.06.2017, 20:45   #17
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Цитата:
Сообщение от artemavd Посмотреть сообщение
можно ли на уровне сервера управлять доступом к конкретным ХП пользователям?
Да

Цитата:
Сообщение от artemavd Посмотреть сообщение
мне нужно, передав имя таблицы получить из нее данные, чтобы их можно было редактировать потом. Заранее имя таблицы неизвестно.
Последний раз я видел реализацию чего-то подобного относительно недавно. Сделано было так:

1. 5 ХП для 5 разных таблиц, возвращающие данные (с джойнами ещё на 3 таблицы каждая, кстати);
2. 1 ХП, в которую в качестве параметра передавался @Mode (Режим), который и определял, какую из ХП запускать.
3. ХП возвращала полный набор полей, а доступ к ним из программы рулился в коде.

Не самая изящная реализация, да и в сопровождении сложная: добавилось в одну таблицу поле - 6 хранимок упало на тестах (в лучшем случае - на тестах, в худшем - на продуктиве). Просто потому что забыли это поле в них описать.

Цитата:
Сообщение от artemavd Посмотреть сообщение
Код:
SELECT @ListFields FROM dbo.Tab
По моему, чтобы получить описание структуры БД или части БД (в том числе список полей конкретной таблицы), нужно обращаться к dbo.sysobjects?

Как-то так:

Код:
SELECT  
      c.name AS ColName,
      c.colid AS ColID,
      c.length AS ColLength,
      c.IsNullable AS ColNullable,
      t.name AS ColTypeName
FROM    
      syscolumns c
   INNER JOIN 
      systypes t 
   ON 
      c.xtype = t.xtype AND 
      c.usertype = t.usertype
WHERE   
      c.id = OBJECT_ID('table_name')
ORDER BY 
      c.colid
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...

Последний раз редактировалось artemavd; 14.06.2017 в 04:09.
Sciv вне форума Ответить с цитированием
Старый 14.06.2017, 04:15   #18
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,194
По умолчанию

Цитата:
Сообщение от Sciv Посмотреть сообщение
Да



Последний раз я видел реализацию чего-то подобного относительно недавно. Сделано было так:

1. 5 ХП для 5 разных таблиц, возвращающие данные (с джойнами ещё на 3 таблицы каждая, кстати);
2. 1 ХП, в которую в качестве параметра передавался @Mode (Режим), который и определял, какую из ХП запускать.
3. ХП возвращала полный набор полей, а доступ к ним из программы рулился в коде.

Не самая изящная реализация, да и в сопровождении сложная: добавилось в одну таблицу поле - 6 хранимок упало на тестах (в лучшем случае - на тестах, в худшем - на продуктиве). Просто потому что забыли это поле в них описать.



По моему, чтобы получить описание структуры БД или части БД (в том числе список полей конкретной таблицы), нужно обращаться к dbo.sysobjects?

Как-то так:

Код:
SELECT  
      c.name AS ColName,
      c.colid AS ColID,
      c.length AS ColLength,
      c.IsNullable AS ColNullable,
      t.name AS ColTypeName
FROM    
      syscolumns c
   INNER JOIN 
      systypes t 
   ON 
      c.xtype = t.xtype AND 
      c.usertype = t.usertype
WHERE   
      c.id = OBJECT_ID('table_name')
ORDER BY 
      c.colid
Да дело в том, что я бы не хотел нагружать конечного пользователя с администрированием доступа к полям и таблицам. Я это делать сам хотел.
То есть я создаю таблицу. Субадмин (с гораздо менее доступными правами) через свою программу, без доступа в панель управления сервером, просто перечисляет поля созданной мной таблицы. То, что он перечислил - должно грузиться в клиентское приложение другого пользователя. На самом деле реализация проста, просто затык возник в том, как передать в SELECT в хранимой процедуре как параметр список разрешенных субадмином полей. Конечно, чтобы потом другой конечный пользователь, загрузив эти поля, мог работать как с обычным датасетом через DBNavigator, например. Не спрашивайте зачем такая реализация, просто надо так

Sciv, я так понимаю, что твой код это пример из проекта?
А зачем там INNER используется?
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 14.06.2017, 07:04   #19
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Цитата:
Сообщение от artemavd Посмотреть сообщение
Sciv, я так понимаю, что твой код это пример из проекта?
А зачем там INNER используется?
Нет, это пример из интернета. А иннером джойнится таблица типов полей.
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...
Sciv вне форума Ответить с цитированием
Старый 14.06.2017, 07:17   #20
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,194
По умолчанию

Цитата:
Сообщение от Sciv Посмотреть сообщение
Нет, это пример из интернета. А иннером джойнится таблица типов полей.
А что это значит тогда?
Код:
c.xtype = t.xtype AND 
      c.usertype = t.usertype
Так можно или нет все таки писать в селекте в ХП:
Код:
CREATE PROCEDURE [dbo].[Get1] 
	-- Add the parameters for the stored procedure here
	@ListFields varchar(255)
AS
BEGIN
	-- SET NOCOUNT ON added to prevent extra result sets from
	-- interfering with SELECT statements.
	SET NOCOUNT ON;

    -- Insert statements for procedure here
	SELECT @ListFields FROM dbo.Tab
END
GO
О чем я говорил в посте №16. Правильно ли я предполагаю?
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Передача параметров в хранимой процедуре Maxjuvefan БД в Delphi 7 17.09.2015 14:09
Как зделать запрос в хранимой процедуре xatabich БД в Delphi 8 08.12.2014 08:08
Имена переменных в хранимой процедуре Muramidaza БД в Delphi 0 17.03.2014 22:44
Insert or Update в хранимой процедуре Dozent SQL, базы данных 4 15.10.2013 03:17
как отключить соединения с БД в хранимой процедуре Neymexa SQL, базы данных 0 06.04.2010 11:44