当没有记录存在时DB2锁定

时间:2014-02-14 16:19:01

标签: sql db2

我有一张桌子,例如:

create table state {foo int not null, bar int not null, baz varchar(32)};
create unique index on state(foo,bar);

我想锁定此表中的唯一记录。但是,如果没有现有记录,我想阻止其他人插入记录,但不插入自己。

我使用"更新RS使用并保留独家锁定"但是,如果记录存在,那似乎只能起作用。

2 个答案:

答案 0 :(得分:0)

您可以仅向您授予选择权,但如果其他人拥有secadm或其他权限,则可以插入。

您可以使用触发器执行某些操作,例如检查当前会话,如果用户是您的用户,则会插入该行。

if (SESSION_USER <> 'Alex) then
  rollback -- or generate an exception
end if;

您似乎也希望只保留一行,然后,您也可以在触发器中控制它:

select count(0) into value from state
if (value > 1) then
  rollback -- or generate an exception
end if;

答案 1 :(得分:0)

A)您可以让DB2创建每个ID号。假设您已定义了Customer表

CREATE TABLE Customers
( CustomerID       Int          NOT NULL
                                GENERATED ALWAYS AS IDENTITY
                                PRIMARY KEY
, Name             Varchar(50)
, Billing_Type     Char(1) 
, Balance          Dec(9,2)     NOT NULL DEFAULT 
);

在不指定CustomerID的情况下插入行,因为DB2将始终为您生成值。

INSERT INTO Customers 
    (Name, Billing_Type)
  VALUES
    (:cname, :billtype);

如果您需要知道会话中分配的最后一个值是什么,则可以使用IDENTITY_VAL_LOCAL()函数。

B)在我的环境中,我通常会指定GENERATED BY DEFAULT。这部分是由于我们的主要编程语言ILE RPG-IV的性质,开发人员传统上允许编译器使用整个记录定义。这导致我可以告诉大家使用sequence为给定的表或一组表生成ID值。