Обновление триггера старых значений естественным ключом - PullRequest
0 голосов
/ 05 июня 2011

У меня есть таблица учетных записей с владельцем учетной записи в качестве первичного ключа. В триггере обновления я хочу обновить некоторые учетные записи для новых владельцев. Поскольку эта таблица не имеет поля id, как я могу использовать вставленные / обновленные таблицы в триггере? БД - это sql server 2008.

CREATE TRIGGER accounts_change_owner on accounts AFTER INSERT
AS BEGIN
   MERGE INTO accounts t
   USING 
   (
       SELECT *
       FROM inserted e
           INNER JOIN deleted f ON 
              e.account_owner = f.account_owner ---this won't work since the new account owner value is diff
   ) d
   ON (t.account_owner = d.account_owner)
   WHEN MATCHED THEN
        UPDATE SET t.account_owner = d.account_owner
END

Ответы [ 2 ]

0 голосов
/ 05 июня 2011

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

  1. Не нулевой
  2. Уникальный
  3. Неизменный

(Если первичный ключ состоит из нескольких столбцов, все столбцы должны соответствовать приведенным выше правилам).Большинство баз данных используют # 1 и # 2, но применение # 3 обычно оставлено на усмотрение разработчиков.

Изменение значения первичного ключа - это классическая плохая идея в реляционной базе данных.Вы, вероятно, можете придумать способ сделать это;это не меняет того факта, что это плохая идея.Лучший выбор - добавить искусственный первичный ключ к вашей таблице, наложить в поле ACCOUNT_OWNER ограничения NOT NULL и UNIQUE (при условии, что это так) и изменить любые таблицы ссылок на использование искусственного ключа.

Следующий вопрос: «Что такого плохого в изменении значения первичного ключа?».Изменение значения первичного ключа изменяет уникальный идентификатор для этих конкретных данных;если что-то еще рассчитывает на то, что исходное значение указывает обратно на конкретную строку, например, отношение внешнего ключа, после такого изменения исходное значение больше не будет указывать на то место, на которое оно должно указывать.

Удачи.

0 голосов
/ 05 июня 2011

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

Если вам не нужен триггер, вы можете использовать on update cascade внешний ключ.

Как это:

create table AccountOwner
(
    Name varchar(100) not null 
        constraint PK_AccountOwner primary key
)

create table Account
(
    AccountName varchar(100) not null,
    AccountOwnerName varchar(100) not null 
        constraint FK_Account_AccountOwnerName references AccountOwner(Name) on update cascade
)

insert AccountOwner values('Owner1')

insert Account values('Account1', 'Owner1')

Теперь, если я обновлю таблицу AccountOwner вот так

update AccountOwner
set Name = 'Owner2'
where Name = 'Owner1'

автоматически обновит таблицу «Аккаунт»

select *
from Account

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