Sql 没有记录时的DB2锁定

Sql 没有记录时的DB2锁定,sql,db2,Sql,Db2,我有一张桌子,大概是: create table state {foo int not null, bar int not null, baz varchar(32)}; create unique index on state(foo,bar); 我想锁定此表中的唯一记录。但是,如果没有现有记录,我希望阻止其他人插入记录,但不插入我自己 我会使用“FOR UPDATE WITH RS use AND KEEP EXCLUSIVE LOCKS”,但这似乎只有在记录存在的情况下才起作用 您可以仅

我有一张桌子,大概是:

create table state {foo int not null, bar int not null, baz varchar(32)};
create unique index on state(foo,bar);
我想锁定此表中的唯一记录。但是,如果没有现有记录,我希望阻止其他人插入记录,但不插入我自己


我会使用“FOR UPDATE WITH RS use AND KEEP EXCLUSIVE LOCKS”,但这似乎只有在记录存在的情况下才起作用

您可以仅向您授予select,但如果有其他人具有secadm或其他权限,他们可以插入

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

if (SESSION_USER <> 'Alex) then
  rollback -- or generate an exception
end if;
A) 您可以让DB2创建每个ID号。假设您已经定义了客户表

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\u VAL\u LOCAL()
函数


B) 在我的环境中,我通常指定默认生成的
。这部分是由于我们的主要编程语言ILE RPG-IV的性质,在这种语言中,开发人员传统上允许编译器使用整个记录定义。这让我想到,我可以告诉每个人使用一个函数为给定的表或表集生成ID值

您是在谈论DB2安全性吗?你说的是并发吗?你是说你想分配一个其他人不能使用的主键值吗?@AngocA-concurrency@WarrenT-correct,我想在处理我要插入的数据时阻止其他人插入表中。你使用的是什么版本的DB2,在什么平台上?
INSERT INTO Customers 
    (Name, Billing_Type)
  VALUES
    (:cname, :billtype);