标签: sql

如何找到自动递增列的下一个生成值?

我在 IBM DB2 的自动增量列方面遇到了一些麻烦。起初,我的所有列都被定义为GENERATED ALWAYS,但是由于我在使用“db2 import ...”命令时遇到了这个问题,我将它们更改为GENERATED BY DEFAULT。这是必要的,因为我需要 ID 保持一致,因为其他表引用了它们。因此,不能使用“db2 import ... modified by identityignore ...”。

当我现在导入数据时,ID 被正确插入,但每次我这样做时,我必须记住通过获取最高的 Id+1 并像这样更改列来为自动增量列设置一个新的开始:

SELECT MAX(mycolumn)+ 1 FROM mytable;
ALTER TABLE mytable ALTER COLUMN mycolumn RESTART WITH <above_result>;
Run Code Online (Sandbox Code Playgroud)

如果我忘记了这一点,Insert-Statement 将因重复的 PK 错误而失败,因为自动增量列是主键。

所以我的问题是:有没有办法找到自动增量列的下一个值,所以我可以编写语句来检查,如果这个值小于 SELECT MAX 并且需要设置?

或者:这整个事情是不是像我觉得的那么复杂?我可以以某种方式导入数据,保留 ID 并使自动增量列仍按预期工作吗?

sql database db2

6
推荐指数
1
解决办法
3万
查看次数

如何判断 Oracle 数据库是否已挂载和激活?

IANADBA,但我正在编写一个脚本,只要尚未激活 oracle 备用数据库,该脚本就会采取行动。我正在寻找的是两个查询(或查询集,如有必要)。

1 - 数据库是否已挂载(例如,有人做过“更改数据库挂载备用数据库”)

2 - 如何判断数据库是否已激活(如“alter database activate standby database”)?

正如我所提到的,我正在寻找查询,但如果系统中有某种方法可以告诉我,我也愿意接受。谢谢!

更新

我接受了下面的建议(稍作修改,因为我正在处理 Oracle 8i,我得到了这个:

 SQL>  SELECT INSTANCE_NAME, DATABASE_STATUS, INSTANCE_ROLE from v$instance; 

 INSTANCE_NAME    DATABASE_STATUS   INSTANCE_ROLE
 ---------------- ----------------- ------------------
 RGR01            ACTIVE            PRIMARY_INSTANCE
Run Code Online (Sandbox Code Playgroud)

目前,此实例正在积极恢复存档日志,但不是“实时”的。我仍在寻找一种方法来判断它是否没有作为备用数据库安装。

oracle sql database

6
推荐指数
1
解决办法
9万
查看次数

仅当查询有要返回的行时才发送 sql server 作业警报

我有一个查询,用于检查我们是否已销售特定库存商品

select * from merchand_history where stock_code = 'zzz007' and create_timestamp >= getdate() order by create_timestamp desc
Run Code Online (Sandbox Code Playgroud)

我想要一个向用户发送电子邮件的 sql 作业(我猜是使用警报机制),但前提是该查询返回了行。

我想不出如何做到这一点并屈服于蜂巢思维。我真的需要一个只有 sql 的解决方案......

sql alerting sql-server-2005

6
推荐指数
1
解决办法
2万
查看次数

如何回滚已删除的表数据?

我不小心删除了一张表,我该如何回滚它。请建议。

sql sql-server

6
推荐指数
2
解决办法
3万
查看次数

调整列大小会锁定表吗?

如果我将一列从 nvarchar(2) 更改为 nvarchar(10) 或将一列从 char(2) 更改为 nvarchar(10),会发生什么情况。这是锁定、重组表还是在没有任何影响或停机的情况下工作?

我试图找出如果我改变一个列会发生什么,但我没有找到任何东西。它是一个大表,有一两列要更改。它是关于 MS SQL Server 2008 R2。

sql sql-server-2008

6
推荐指数
1
解决办法
1139
查看次数

当所有 php 脚本都有缺陷时,我应该如何设置数据库以防止 sql 注入?

我继承了一个非常不安全的 php web 应用程序,有 sql 注入的历史。我无法立即修复脚本,我宁愿需要它们运行才能使网站运行,并且有太多的 php 脚本需要首先从 php 端处理。但是,我确实可以完全控制服务器和服务器上的软件,包括完全控制 mysql 数据库及其用户。

让我们估计它总共有 300 个脚本、40 个半私有脚本和 20 个私有/安全脚本。

所以我的问题是如何最好地保护数据,隐含假设来自 php 端的 sql 注入(例如在 300 个脚本列表中的某个地方)是不可避免的?

我的初稿计划是在 mysql 数据库中创建多层不同权限的用户。这样我可以先保护最需要保护的数据和脚本(“私有/安全”类别),然后是第二层数据库表和脚本(“半私有”),最后处理整个 php 应用程序的其余部分(最终保护主要处理“公共”信息的数据库表的结果,例如,即使只是查看主页也需要的东西)。

因此,3 个数据库用户(公共、半私有和安全),三个不同的脚本组(安全脚本、半私有脚本和公共脚本)中的每一个都有不同的用户连接。通过这种方式,我可以阻止从“公共”或“半私有”访问“安全”,以及从“公共”访问“半私有”。我应该考虑其他替代方案吗?如果要采用分层访问系统,那么哪种方法最好?

mysql security php sql

6
推荐指数
1
解决办法
1250
查看次数

System Center Service Manager 2012 的 SQL Server 排序规则设置

围绕 SQL Server 所需的排序规则设置有很多相互矛盾或令人困惑的信息,因为它与托管 SCSM 2012 数据库和关联的数据仓库数据库有关。

在安装过程中,如果将排序规则保留为默认值,即 SQL_Latin1_CP1_CI_AS,则会出现此错误。

SCSM 错误

这篇 TechNet 文章说:

对于此版本,请确保在承载 Service Manager 数据库、数据仓库数据库、分析服务数据库和 Reporting Services 数据库的计算机上的 SQL Server 和 Analysis Services 中使用相同的排序规则。有关SQL Server 排序规则的详细信息,请参阅使用 SQL Server 排序规则

如果您的 SQL Server 安装使用默认排序规则 (SQL_Latin1_General_CP1_CI_AS),则会出现一条警告消息,指出该排序规则不是 Service Manager 支持的排序规则之一,并且不受支持的排序规则可能会导致多语言环境中出现不可预测的行为。

注意
当您使用默认排序规则 (SQL_Latin1_General_CP1_CI_AS) 时,Service Manager 中无法支持多种语言。如果以后您决定使用不同的排序规则支持多种语言,则必须重新安装 SQL Server。在 Service Manager 的纯英文安装中使用默认排序规则没有问题。有关语言支持的详细信息,请参阅System Center 2012 - Service Manager 的语言支持

按照该链接列出 SQL_Latin1_General_CP1_CI_AS 作为受支持的排序规则!这是我的大脑开始爆炸的地方。

还有许多参考资料指出分析服务、报告服务和 DBE 都需要相同的排序规则集,但是 SQL_Latin1_General_CP1_CI_AS 不是它们的一个选项。有可用的 Latin1、不区分大小写、区分重音的选项,但不是 SQL_Latin1_General_CP1_CI_AS。

在伤口上撒盐,服务经理文档说,为了将 SCOM 数据拉入 SCSM 数据仓库,排序规则非常匹配。但是,SCOM 2012 SP1 …

sql system-center sql-server sql-server-2012 scsm-2012

5
推荐指数
1
解决办法
6762
查看次数

如何获取mysql.sock文件,错误地从“/mysql/tmp/”中删除

我被 PDO 异常困住了

PDOException: SQLSTATE[HY000] [2002] Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2) in lock_may_be_available() (line 167 of home/../includes/lock.inc).
Run Code Online (Sandbox Code Playgroud)

为了解决这个问题,我尝试使用该命令重新创建符号链接。我在 Linux 服务器上工作。

 ln -s /home/../mysql/tmp/mysql.sock /tmp/mysql.sock
Run Code Online (Sandbox Code Playgroud)

执行上述sql语句时,PDO异常没有变化。后来,我错误地删除了mysql.sock文件"/home/../mysql/tmp/"(不在“/tmp”中)。

如何取回或重新创建mysql.sock文件。关于 PDO 异常以及如何解决它的任何想法。

mysql linux sql pdo

5
推荐指数
1
解决办法
8万
查看次数

从 SAN 启动 Windows

对存储不太熟悉。我有一些关于使用 SAN for Storage 运行物理机和虚拟机的问题。

是否可以从连接到物理服务器的 SAN 存储引导操作系统?如果是这样,它有什么缺点吗?假设有多个驱动器,一个用于操作系统,并且该服务器安装了 SQL Server,还有其他用于数据、日志和临时数据库的驱动器都来自 SAN。如果操作系统从本地硬盘驱动器启动,它的性能会比将它保存在带有 SQL 数据文件的 SAN 上吗?高IOPS?潜伏?

我正在尝试比较以下 3 项并进行量化。

物理机 - 从本地驱动器和其他 SAN 启动操作系统

物理机 - 从 SAN 引导操作系统和其他驱动器

虚拟机 - Hyper - V 主机本地驱动器上的虚拟磁盘,vSAN 上的 SQL 数据/日志/临时

虚拟机 - 虚拟磁盘、SQL 数据/日志/临时文件都在 vSAN 中

与其他人相比,最后一个表现不佳吗?

谢谢

sql storage-area-network hyper-v boot

5
推荐指数
2
解决办法
1270
查看次数

无法从 postgres 返回 root:强制输入发现无效的 postgres 密码

我已经在 Ubuntu 上安装了 postgres 并将我切换到 postgres 用户。我已经打开psql创建了一个数据库,然后决定切换回root。但是,它不允许我:

sudo su - 
Run Code Online (Sandbox Code Playgroud)

结果它问我

[sudo] password for postgres:
Run Code Online (Sandbox Code Playgroud)

我尝试输入只是为了得到

Sorry, try again
Run Code Online (Sandbox Code Playgroud)

然后我决定尝试使用以下答案更改 postgres 密码:

ALTER USER postgres WITH PASSWORD 'postgres';
Run Code Online (Sandbox Code Playgroud)

它看起来有效,但是在尝试再次切换到 root 后,它仍然不允许我。

postgresql ubuntu sql database

5
推荐指数
1
解决办法
4902
查看次数