Hen*_*nry 8 sql-server database-design web-applications sql-server-2012
我们正在构建一个多用户的web应用程序,他们需要一个独特postId的post,他们创造.每个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生成相关的可能死锁和性能问题.
从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值就可以了,只要你不违反主键的唯一性-但是,这是相同的行为作为一个IDENTITY有SET IDENTITY INSERT ON.