通常,我想在我的一个用户上运行查询,我希望以1对1的关系存储与该用户相关联的行.所以,让我们说(这只是一个任意的例子),我有一个表跟踪用户的汽车,以及一些关于汽车的信息.每个用户可以拥有0或1辆汽车.如果用户没有汽车,则表中没有该用户的条目.
汽车表(再次,只是一个例子):id,user_id,car_make,car_model
所以,当我更新这个表时,我总是会做这样的事情(伪代码):
result = SELECT * FROM cars WHERE user_id=5
if (num_rows(result)>0){
UPDATE cars SET car_make='toyota', car_model='prius' WHERE user_id=5
}else{
INSERT INTO cars (user_id, car_make, car_model) VALUES (5, 'toyota', 'prius')
}
Run Code Online (Sandbox Code Playgroud)
我怎样才能把它变成一个"原子地"起作用的优雅陈述?如果在另一个进程中SELECT和UPDATE语句之间的行被删除,会发生什么?我的UPDATE语句将失败INSERT语句应该运行的地方.我觉得我需要做两个相似(但不同)的陈述来完成同样的事情!我需要的是一些声明,它将向我保证我想要的数据存在于表中,特别是当我只想要一行满足我的要求时.例如,它可能是这样的(当然这是完全构成的):
MAKE SURE A ROW IN cars WHERE user_id=5 IS SET WITH car_make='toyota', car_model='prius'
Run Code Online (Sandbox Code Playgroud)
这样,如果user_id已经存在,那么它将被更新,否则将被插入.此外,如果我更改了要求,例如说每个用户可以拥有给定car_make的零个或一个汽车,那么我可以进一步指定:
MAKE SURE A ROW IN cars WHERE user_id=5 AND car_make='toyota' IS SET WITH car_model='prius'
Run Code Online (Sandbox Code Playgroud)
我希望我的问题有道理!如何改进这种经常出现的基本insert-if-not-found或update-if-found操作?谢谢你的帮助!
我们有一个非常大的表(> 77M记录和增长)在SQL Server 2005 64位标准版上运行,我们看到一些性能问题.每天添加的记录多达十万条.
有谁知道SQL Server标准版可以处理的记录数量是否有限制?应该考虑转向企业版还是我们可以使用一些技巧?
附加信息:
有问题的表非常扁平(14列),有一个聚簇索引,有6个字段,另外两个索引在单个字段上.
我们使用3个字段添加了第四个索引,这些字段位于一个问题查询中的选择中,并且没有看到估计性能的任何差异(查询是必须在非工作时间运行的流程的一部分,因此我们没有指标然而).这些字段是聚集索引的一部分.
寻找解决方法:
Error: SQL71609: System-versioned current and history tables do not have matching schemes. Mismatched column: 'XXXX'.
Run Code Online (Sandbox Code Playgroud)
尝试在SSDT中为Visual Studio 2015使用SQL 2016系统版本(时间)表时.
我已经定义了一个基本表:
CREATE TABLE [dbo].[Example] (
[ExampleId] INT NOT NULL IDENTITY(1,1) PRIMARY KEY,
[ExampleColumn] VARCHAR(50) NOT NULL,
[SysStartTime] datetime2 GENERATED ALWAYS AS ROW START HIDDEN NOT NULL,
[SysEndTime] datetime2 GENERATED ALWAYS AS ROW END HIDDEN NOT NULL,
PERIOD FOR SYSTEM_TIME (SysStartTime,SysEndTime)
)
WITH (SYSTEM_VERSIONING=ON(HISTORY_TABLE=[history].[Example]))
GO
Run Code Online (Sandbox Code Playgroud)
(假设[history]在SSDT中正确创建了模式).这是第一次建立良好.
如果我以后做出改变:
CREATE TABLE [dbo].[Example] (
[ExampleId] INT NOT NULL IDENTITY(1,1) PRIMARY KEY,
[ExampleColumn] …Run Code Online (Sandbox Code Playgroud) sql-server temporal sql-server-data-tools visual-studio-2015 sql-server-2016
我有文件权限问题,我想解决,而不是诉诸于一切世界可写.
我正在将文件写入NetApp SAN.我正在写入的目录由devel用户拥有,并且具有一组devel具有组可写权限(0775)的目录.我写的用户名是在username和devel组中.
问题似乎是SAN只检查第一组,所以我得到了许可被拒绝.如果我使用newgrp或sg命令将我的组更改为devel,那么我可以写入目录.
尝试写入的脚本是用Perl编写的,但它是通过ssh和一些bash脚本从另一台机器远程启动的.
我无法将目标目录更改为username组,因为还有其他开发人员,他们在不同的组中(但我们都共享该devel组).
我无法使Perl脚本本身具有setgid,因为我们使用适当的组运行不同的环境(devel,test,qa,production等),我不想在该级别管理文件权限位.
我无法setgid在Perl脚本中使用POSIX 函数,因为它不是以root身份启动的(我无法获得root权限),因此我获得了权限被拒绝.分配给$)并$(给出相同的结果.
我不能使用newgrpbash中的命令,因为newgrp它不接受任何参数,它只是启动一个新的交互式shell(在新shell退出后执行以下任何命令).
我也无法使用newgrp启动新shell并从那里生成Perl脚本,因为Perl脚本是通过ssh连接在远程计算机上执行的.该脚本将在我的默认组下的远程计算机上获得"新鲜"shell,而不是newgrp在本地计算机上设置的组.
我无法使用该sg命令,因为它只需要一个参数.我引用完整的命令行,包括已知的参数.但是,我们通过ssh启动远程进程的方式包括在"$@"bash变量中传递本地参数.换句话说,我可以做一个process start或者process stop,process脚本处理ssh命令并传递我输入的任何本地参数"$@".我已经尝试过编写一个包装器,但发现我们使用了各种有趣的本地参数形式,并且犹豫是否要潜入必要的引用和逃避噩梦.
所以,我的问题是:是否有人知道从Perl或bash为正在运行的进程设置有效组ID的其他方法?是否存在多参数形式sg?