应用程序服务器上需要SET IDENTITY_INSERT ON/OFF,但ALTER权限似乎很危险.建议?

Hen*_*nry 8 sql-server database-design web-applications sql-server-2012

我们正在构建一个多用户的web应用程序,他们需要一个独特postIdpost,他们创造.每个post都有(userId, postId)复合主键.

现在,postId是一个标识值,但由于需要支持一些需要postId按原样插入的操作(没有重新编号),我们决定使用SET IDENTITY_INSERT ON/OFF.

但是,我们的DBA告诉我们,这样的操作并不意味着应用程序服务器使用,因为ALTER权限要求:

权限

用户必须拥有该表或对表具有ALTER权限.

https://msdn.microsoft.com/en-ca/library/ms188059.aspx

如果应用程序服务器被黑客攻击,使用ALTER权限似乎相当危险.我们的DBA建议我们根本不使用身份值,并在本地生成postId每个用户的唯一身份.

可以SET IDENTITY_INSERT ON留在全球吗?

如果它不能全局使用,那么避免身份价值并使用postId每个用户的本地生成(每个用户)是否max(postId)+1有意义?如果可能,我们更倾向于使用标识值,因为我们担心与自定义postId生成相关的可能死锁和性能问题.

Ed *_*bbs 5

从SQL Server 2012开始,您可以使用Oracle中的序列.你可能会更好.首先,创建序列:

CREATE SEQUENCE mySeq AS LONG START WITH 1 INCREMENT BY 1;
GO
Run Code Online (Sandbox Code Playgroud)

然后将表的主键默认为下一个序列值(而不是IDENTITY值):

CREATE TABLE myTable (
   myPK LONG PRIMARY KEY DEFAULT (NEXT VALUE FOR mySeq),
   myWhatever...
);
Run Code Online (Sandbox Code Playgroud)

如果您未指定PK值,INSERT您将获得唯一的生成序列值.它基本上和一个行为相同IDENTITY.但是,如果你想指定一个PK值就可以了,只要你不违反主键的唯一性-但是,这是相同的行为作为一个IDENTITYSET IDENTITY INSERT ON.