我有一张桌子,例如:
create table state {foo int not null, bar int not null, baz varchar(32)};
create unique index on state(foo,bar);
我想锁定此表中的唯一记录。但是,如果没有现有记录,我想阻止其他人插入记录,但不插入自己。
我使用"更新RS使用并保留独家锁定"但是,如果记录存在,那似乎只能起作用。
答案 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值。