鉴于此表:
CREATE TABLE test (
id INT NOT NULL,
description NVARCHAR(100) COLLATE Modern_Spanish_CI_AS NOT NULL
);
INSERT INTO test (id, description) VALUES (1, 'CO2');
Run Code Online (Sandbox Code Playgroud)
我意识到我无法解决排版问题:
SELECT * FROM test WHERE id = 1;
UPDATE test SET description = 'CO?' WHERE id = 1;
SELECT * FROM test WHERE id = 1;
Run Code Online (Sandbox Code Playgroud)
因为更新匹配但没有效果:
id description
----------- -----------
1 CO2
(1 affected rows)
(1 affected rows)
id description
----------- -----------
1 CO2
(1 affected rows)
Run Code Online (Sandbox Code Playgroud)
就好像 SQL Server 确定了这一点,因为? 显然只是一个很小的2 …
在使用生产数据的副本测试一些迁移脚本(脚本与开发数据一起运行良好)时,我发现了一个奇怪的情况。CONSTRAINT 已更改,因此我发出 DROP + ADD 命令:
ALTER TABLE A_DUP_CALLE
DROP CONSTRAINT A_DUP_CALLE_UK1;
ALTER TABLE A_DUP_CALLE
ADD CONSTRAINT A_DUP_CALLE_UK1 UNIQUE (
CONTROL_ID,
CALLE_AYTO_DUPL
)
ENABLE;
Run Code Online (Sandbox Code Playgroud)
DROP 命令运行良好,但 ADD 命令失败。现在,我陷入了一个恶性循环。我无法删除约束,因为它不存在(初始删除按预期工作):
ORA-02443: 无法删除约束 - 不存在的约束
我无法创建它,因为名称已经存在:
ORA-00955: 名称已被现有对象使用
我A_DUP_CALLE_UK1
在 SQL Developer 的搜索框中输入内容,然后……就在那里!所有者、表名、表景观……一切都匹配:它不是同名的不同对象,它是我的原始约束。该表出现在约束详细信息中,但该约束未出现在表的详细信息中。
我的问题:
(服务器是 10g XE,我没有足够的声望来创建标签。)
我已经在客户端的 9i 服务器(Oracle9i Release 9.2.0.1.0 - 64bit Production)中安装了一个 PHP 驱动的应用程序。某些查询的性能很差(它可以使用 15 分钟到几个小时来计算执行计划!)我已经将问题跟踪到参数的非默认值OPTIMIZER_FEATURES_ENABLE
:9i 的默认值是9.2.0
但客户将其更改为8.1.7
. 当我在我的开发箱中进行相同的更改时,我遇到了相同的性能问题。
如果他们运行的是 Oracle 10 或更高版本,我可以自己为自己的会话更改它,但在 9i 中,它是一个需要为整个实例设置的静态参数。更改是在一段时间前进行的,目的是支持一个非常重要的遗留程序。客户目前正在等待第三方供应商的答复,但我觉得改变的可能性很小。
那么,如果参数需要保持不变,我有哪些选择?它的效果可以用其他可变设置来模拟吗?还有其他想法吗?
我有一个表,我错误地在列中允许 NULL 值:
CREATE TABLE EXAMPLE (
EXAMPLE_ID INT IDENTITY(1, 1) NOT NULL,
FOO_ID INT,
CREATED_ON DATETIME DEFAULT CURRENT_TIMESTAMP, -- Oops!
CODE VARCHAR(50),
QUOTE DECIMAL(18,2),
BAR_ID TINYINT NOT NULL DEFAULT 1,
CONSTRAINT EXAMPLE_PK PRIMARY KEY (EXAMPLE_ID),
CONSTRAINT EXAMPLE_FK1 FOREIGN KEY (FOO_ID)
REFERENCES FOO (FOO_ID)
ON DELETE CASCADE,
CONSTRAINT EXAMPLE_FK2 FOREIGN KEY (BAR_ID)
REFERENCES BAR (BAR_ID)
);
CREATE INDEX EXAMPLE_IDX1 ON EXAMPLE (FOO_ID);
CREATE INDEX EXAMPLE_IDX2 ON EXAMPLE (BAR_ID);
Run Code Online (Sandbox Code Playgroud)
这是一个相当不重要的列(没有索引,没有外键,没有在触发器中使用......),这是我通常修复它的方式:
ALTER TABLE EXAMPLE
ALTER COLUMN CREATED_ON DATETIME NOT NULL;
-- Runs …
Run Code Online (Sandbox Code Playgroud) 我使用维护计划向导创建了一个计划。当我执行计划时,“维护清理任务”失败并显示以下错误消息:
执行查询“EXECUTE master.dbo.xp_delete_file 0,N'',N'',N'2016...”失败并出现以下错误:“执行扩展存储过程时出错:参数无效”。可能的失败原因:查询有问题,“ResultSet”属性设置不正确,参数设置不正确,或者连接建立不正确。
生成的 T-SQL 是这样的(根据日志文件查看器):
EXECUTE master.dbo.xp_delete_file 0,N'''',N'''',N''2016-01-25T13:50:30''
GO
Run Code Online (Sandbox Code Playgroud)
请注意,所有单引号都加倍。
日志查看器或向导中是否存在错误实际上生成了无效的 T-SQL 代码?
刚刚意识到如果我删除重复引号并手动运行查询,我会收到“执行扩展存储过程时出错:无效参数”:
EXECUTE master.dbo.xp_delete_file 0,N'',N'',N'2016-01-25T13:50:30'
GO
Run Code Online (Sandbox Code Playgroud) 我有一大组带有 SQL 命令的文件,我使用使用该@@
运算符的 SQL*Plus 脚本运行这些文件。我在第三方计算机上运行该脚本(甚至通过电子邮件发送),因此我想使其尽可能独立。
文件编码为 Win-1252。目前,我需要NLS_LANG
在运行脚本之前设置环境变量:
C:\> SET NLS_LANG=SPANISH_SPAIN.WE8MSWIN1252
C:\> echo exit | sqlplus foo/bar@//example.com/xe @install.sql
Run Code Online (Sandbox Code Playgroud)
这有效,但我想知道是否可以使用 SQL 或 SQL*Plus 命令更改客户端编码。(或者至少读取值并在不匹配时中止执行。)
一周前我制定了一个维护计划,并且每晚都执行得很好。现在数据库收缩任务已停止工作并抛出此错误:
属性大小不可用于数据库“[foo]”。此对象可能不存在此属性,或者可能由于访问权限不足而无法检索。
昨天我安装了几个由 Windows 更新提供的 SQL Server 修补程序(4411 和 4457,如果有的话)。这是我可能做出的唯一改变。
我的任务是这样的:
我的一些发现:
问题是什么?
sql-server ×4
oracle ×3
ssms ×3
oracle-xe ×2
t-sql ×2
collation ×1
oracle-10g ×1
oracle-9i ×1
sqlplus ×1
unicode ×1