Создать таблицу - динамическое имя таблицы - PullRequest
0 голосов
/ 22 августа 2011

У меня возникла проблема с созданием запроса в Access.Я хотел бы получить запрос, который после запуска запросит имя и фамилию новой записи в таблице Buyers, а затем создаст новую таблицу для этого покупателя (например, для Джона Смита - называемого SmiJoh - 3 буквы от фамилии и 3 от имени).

Есть идеи, как это сделать без VBA, используя только SQL?

PS.Если нет возможности сделать все это с помощью SQL, есть ли возможность сделать только запрос, создав таблицу с этим именем?

Ответы [ 2 ]

1 голос
/ 23 августа 2011

Вы спросили, можете ли вы сделать что-то подобное с SQL в Access, где имя_таблицы - это значение, которое вы указываете при выполнении оператора.

CREATE TABLE [table_name](
    id COUNTER CONSTRAINT pkey PRIMARY KEY,
    date_field DATETIME);

Нет, ядро ​​базы данных Access не позволит вам использоватьпараметр для имени таблицы.

Но, как и комментарии, которые вы получили, я призываю вас пересмотреть свой план по созданию отдельной таблицы для каждого покупателя.Это будет сложный беспорядок для создания и обслуживания.

Используйте одну таблицу для хранения данных всех покупателей.Включите поле для идентификации покупателя.Затем используйте запрос, который извлекает только те строки, где поле customer_id соответствует текущему идентификатору покупателя пользователя.Создайте форму с этим запросом в качестве источника записи.Вот пример таблицы, где поле uname содержит имя учетной записи Windows.

id   uname time_only
5018  fred 7:00:00 AM
5063  hans 2:00:00 AM
5072  hans 3:00:00 AM

С помощью функции fOSUserName () Дева Ашиша ( Получить имя для входа ) этот запрос возвращает только те строки, гдеuname совпадает с моим именем пользователя Windows (hans).

SELECT d.id, d.uname, d.time_only
FROM discardme AS d
WHERE d.uname = fOSUserName();

Я создал форму на основе этого запроса, которая содержит текстовое поле, связанное с uname, с этими свойствами на вкладке «Данные» его страницы свойств: Значение по умолчанию = fOSUserName () Включено Нет .Если вы не хотите, чтобы пользователь даже видел значение uname, установите Visible No на вкладке Формат.

Вам все равно нужно заблокировать приложение, чтобы пользователи не открывалистол напрямую.Но это также потребовалось бы для вашей первоначальной схемы для создания отдельной таблицы для каждого покупателя.

Подобный подход мог бы работать, если вы настроили ULS (безопасность на уровне пользователя), для которой требуется формат MDB db;он не поддерживается в более новом формате ACCDB db.В этом случае функция VBA CurrentUser () вернет имя имени пользователя безопасности доступа.Измените запрос соответствующим образом:

SELECT d.id, d.uname, d.time_only
FROM discardme AS d
WHERE d.uname = CurrentUser();

Обратите внимание, что без ULS CurrentUser () даст вам имя учетной записи пользователя по умолчанию, Admin.

Наконец, рассмотрите ваши требования безопасности.Выполнение этого с Access 'Jet / ACE для хранения данных будет равносильно предоставлению рекомендаций для совместных пользователей.Однако, независимо от того, принимаете ли вы ULS или нет, вы не можете абсолютно запретить пользователю просматривать какие-либо данные.Если ваши требования безопасности более строгие, перенесите хранилище данных в базу данных клиент-сервер (например, SQL Server).Вы по-прежнему можете использовать приложение Access в качестве внешнего интерфейса, заменив ODBC-ссылки на серверные таблицы на существующие собственные таблицы Jet / ACE.

0 голосов
/ 22 августа 2011

Вы пробовали использовать EXEC

DECLARE @Name VARCHAR(6)
SET @Name = 'SMIJOH' --Query your table name
EXEC ('CREATE TABLE ' + @Name + ' (ID INT IDENTITY(1,1), etc....)')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...