Вопрос триггера SQL сервера - PullRequest
4 голосов
/ 02 ноября 2010

Я ни в коем случае не программист sql, и я пытаюсь достичь чего-то, что, я уверен, было сделано миллион раз раньше.

Я пытаюсь автоматически генерировать номер клиента в sql каждый раз, когда вставляется новый клиент, но триггер (или sp?) Будет работать только в том случае, если введено хотя бы имя, фамилия и другое значение, называемое номером дела. , Если какое-либо из этих полей отсутствует, система генерирует ошибку. Если критерии выполнены, система генерирует и присваивает уникальный идентификатор этому клиенту, который начинается с букв GL-, а затем использует 5-значное число, чтобы клиент John Doe был GL-00001, а Jane Doe - GL-00002.

Прошу прощения, если я спрашиваю слишком много, но я, по сути, являюсь избранным специалистом по обновлению вставок и ничего более, поэтому заранее спасибо за любую помощь.

Ответы [ 4 ]

3 голосов
/ 02 ноября 2010

Если бы я был в такой ситуации, я бы:

- Измените таблицу (таблицы) так, чтобы имя, фамилия и номер дела были обязательными (NOT NULL) столбцами. Перед отправкой записи в базу данных обработайте свои проверки для обязательных полей на стороне приложения.

- Если он еще не существует, добавьте столбец идентификации в таблицу клиентов.

- добавить в таблицу клиентов постоянный вычисляемый столбец, который отформатирует столбец идентификаторов в желаемый формат GL-00000.

/* Demo computed column for customer number */
create table #test (
    id int identity,
    customer_number as 'GL-' + left('00000', 5-len(cast(id as varchar(5)))) + cast(id as varchar(5)) persisted,
    name char(20)
)

insert into #test (name) values ('Joe')
insert into #test (name) values ('BobbyS')

select * from #test

drop table #test

Это должно удовлетворить ваши требования без необходимости вводить издержки триггера.

0 голосов
/ 02 ноября 2010

Возможно, для таблицы установлено уникальное ограничение и / или ограничение NOT NULL.

Удалите / отключите их (например, с помощью консоли управления SQL-Server в режиме разработки), а затем повторите попытку вставки данных. Имейте в виду, что вы, вероятно, не сможете включить ограничения после вставки, поскольку вы нарушаете условия после вставки. Отключайте или отменяйте ограничения только в том случае, если вы абсолютно уверены, что они не нужны.

Вот пример синтаксиса (вам нужно знать имена ограничений):

--disable
ALTER TABLE customer NOCHECK CONSTRAINT your_constraint_name

--enable
ALTER TABLE customer CHECK CONSTRAINT your_constraint_name

Внимание: на вашем месте я бы скорее попытался вставить фиктивные значения для ненулевых столбцов, например:

insert into customers select afield , 1 as dummyvalue, 2 as dummyvalue from your datasource
0 голосов
/ 02 ноября 2010

Очень простой способ сделать это - создать таблицу с такой структурой:

CustomerID типа in, являющегося первичным ключом, и установить его как идентификатор CustomerIDPrfix типа varchar (3), которыйхранит GL- в качестве значения по умолчанию.Затем добавьте остальные поля и установите для них значение NOT NULL.

Если этот способ неприемлем, и вам нужно написать триггер, проверьте эти две статьи: http://msdn.microsoft.com/en-us/library/aa258254(SQL.80).aspx

http://www.kodyaz.com/articles/sql-trigger-example-in-sql-server-2008.aspx

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

0 голосов
/ 02 ноября 2010

Так что вы хотите сделать? создать номер клиента, даже если эти поля не заполнены?

Вы смотрели на SQL для триггера? Вы можете сделать это в SSMS (SQL Server Managment Studio), перейдя к рассматриваемой таблице в обозревателе объектов, развернув таблицу, а затем развернув триггеры.

Если вы откроете триггер, вы увидите, что он делает для генерации номера клиента. Если вы не знаете, как работает этот код, отправьте код для триггера вверх.

Если вы вносите изменения в существующую систему, я бы посоветовал вам выяснить все возможные последствия изменения способа ввода данных.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...