文档没有启发性:
我问的原因是用户对为什么他们可以在一个表中看到某些表而在另一个表中看不到感到困惑。它与权限有关,但不清楚具体如何。
例如,一个用户告诉我他们有权查询一个表。但是,该表未显示在 中TABLES
,其列也未显示在 中COLUMNS
,但该表确实显示在 中ALL_TABLES
。
因此,这导致了以下问题:
ALL_TABLES
和 和有什么不一样TABLES
?- 用户如何查看他们有权查询的所有表(和列!)的列表?
我正在将一些数据加载到这样的表中:
COPY table1 (
col1,
col2,
file_name AS CURRENT_LOAD_SOURCE()
)
FROM LOCAL :src_file
REJECTED DATA :rejected_file
EXCEPTIONS :exceptions_file
SKIP 1;
它有效,除了用字符串而不是实际的基本名称file_name
填充。Batch No. 1
:src_file
的文档CURRENT_LOAD_SOURCE()
没有解释为什么会这样。
这是一个错误吗?如何获取源文件的实际名称?
超级 n00b 问题,我知道,但我似乎无法在任何容易找到的地方找到它,所以在这里记录一下会很好。
假设我以特定用户的身份连接到 Teradata 系统NICK
,但我需要访问其他用户拥有的表BOB
。
而不是必须限定每个表名,BOB.
我只想设置我的默认数据库用于连接BOB
,然后使用它们的非限定名称查询表。
换句话说,而不是这样:
-- Cartesian Join of Doom (CJD™)
SELECT COUNT(*)
FROM BOB.TABLE1, BOB.TABLE2, BOB.TABLE3;
我希望能够做到这一点:
-- CJD™ for the lazy
SELECT COUNT(*)
FROM TABLE1, TABLE2, TABLE3;
有没有办法在连接的生命周期内做到这一点?
我对 Vertica 数据库运行以下语句,一次一个:
BEGIN TRANSACTION;
UPDATE table
SET col1 = 'something'
WHERE col2 = 'something else';
SELECT COUNT(*)
FROM table
WHERE col1 = 'something';
ROLLBACK TRANSACTION;
我运行第一行很好......好吧,现在我正在进行交易。
我运行我的更新......好吧,这工作。
我运行SELECT
测试以确保事情按预期工作......哦,等等,看起来我错过了语句WHERE
子句中的一个条件UPDATE
。
不用担心!这就是我在交易中这样做的原因。
让我们回滚:
=> ROLLBACK TRANSACTION;
[Vertica][JDBC](10040) Cannot use commit while Connection is in auto-commit mode.
琼斯,把你桌上的那卷卫生纸交出来。
所以 Vertica 很高兴地接受了我的BEGIN TRANSACTION
,因为我非常清楚,在那之后我会尝试运行 aROLLBACK
或COMMIT
.
然而,我做不到!我的连接处于自动提交模式,因此ROLLBACK
毫无COMMIT
意义。我UPDATE
的承诺在它完成的那一刻。
我错过了什么,还是我认为这只是 Vertica 的一个非常糟糕的实现?
如果逻辑结果 (或) 是非法的,为什么 Vertica 会BEGIN TRANSACTION
在自动提交模式下接受连接?ROLLBACK
COMMIT
我有一个 Vertica 数据库。我怎么知道数据库有多大?
为了向高层管理人员报告有关我们环境的基本统计数据,我需要一个粗略的答案。
我正计划将这个古老但至关重要的 Oracle 数据库从一个 Windows Server 2003 集群迁移到另一个集群。
数据库有许多数据文件,它们都在目标集群上获取新路径。唯一保持不变的路径是备份文件。
我的迁移计划如下:
使用我们的夜间 RMAN 备份脚本备份源集群上的数据库:
run {
allocate channel Channel1 type disk format 'F:\backup\folder\%d_%T_%s_%U.bak';
allocate channel Channel2 ...
backup check logical ( database );
backup check logical ( archivelog all not backed up 2 times );
backup check logical ( current controlfile );
}
allocate channel for maintenance device type disk;
delete archivelog until time 'sysdate - 2' backed up 2 times to disk;
delete obsolete device type disk;
我们在两个集群上的 RMAN 保留策略都设置为redundancy 2
,并且控制文件被用作恢复目录。
将备份文件复制到F:\backup\folder
目标集群上。
使用此 RMAN 脚本恢复目标集群上的数据库:
run {
allocate channel Channel1 type disk;
allocate channel Channel2 ...
set until sequence <sequence number> thread 1;
SET NEWNAME FOR DATAFILE 'Old\Path\FILE01.DBF' TO 'New\Path\FILE01.DBF';
SET NEWNAME FOR DATAFILE ...
restore database;
}
更新控制文件中的数据文件路径,将数据库恢复到合适的顺序,用resetlogs
.
这很好用,但有以下例外:
当我要求 RMAN 删除目标集群上的过时文件时,它会将所有刚刚恢复的数据文件命名为过时的!
RMAN> delete obsolete device type disk;
...
Deleting the following obsolete backups and copies:
Type Key Completion Time Filename/Handle
-------------------- ------ ------------------ --------------------
Datafile Copy 1 02-JUL-12 New\Path\FILE01.DBF
...
好吧,RMAN 将这些数据文件识别为副本是正确的。
但是,由于这是数据库迁移,这些副本旨在成为新的原件,所以我当然不希望 RMAN 在维护过程中删除它们!
是否可以调整此迁移过程,以便 RMAN 将恢复的数据库视为新的原始数据库?
Microsoft 已知某些防病毒软件的实现会导致SQL Server 出现各种问题,并且 Microsoft 有一篇支持文章专门用于为您的 SQL Server 主机选择正确的防病毒软件。
根据您的经验,在您的数据库服务器上运行防病毒软件是否安全?
考虑到所有必需的防病毒排除和注意事项,它是否实用?
继续我最近玩大数字的趋势,我最近将我遇到的一个错误归结为以下代码:
DECLARE @big_number DECIMAL(38,0) = '1' + REPLICATE(0, 37);
PRINT @big_number + 1;
PRINT @big_number - 1;
PRINT @big_number * 1;
PRINT @big_number / 1;
我得到的这段代码的输出是:
10000000000000000000000000000000000001
9999999999999999999999999999999999999
10000000000000000000000000000000000000
Msg 8115, Level 16, State 2, Line 6
Arithmetic overflow error converting expression to data type numeric.
什么?
为什么前 3 个操作有效但最后一个无效?如果@big_number
明明可以存储 的输出,怎么会出现算术溢出错误@big_number / 1
呢?
这段代码中的三个SELECT
语句
USE [tempdb];
GO
SET NOCOUNT ON;
CREATE TABLE dbo.persist_test (
id INT NOT NULL
, id5 AS (id * 5)
, id5p AS (id * 5) PERSISTED
);
INSERT INTO dbo.persist_test (id)
VALUES (1), (2), (3);
SELECT id
FROM dbo.persist_test;
SELECT id5
FROM dbo.persist_test;
SELECT id5p
FROM dbo.persist_test;
DROP TABLE dbo.persist_test;
生成这个计划:
为什么SELECT
选择持久值的 final 会生成计算标量运算符?
我在 Windows 2003 32 位集群上构建了一个新的 Oracle 9iR2 实例。当然,由于我无法控制的原因,它是 9i 版本。多个应用程序服务器连接到此实例,每个服务器都打开几个DEDICATED
连接,它们为工作保持打开状态。
此实例处于锁定环境中,因此我的网络人员希望尽可能多地封锁端口。为此,我需要准确地告诉他们实例需要打开哪些端口或端口范围。
我浏览了Listener 文档,可以看到我可以更改默认的 Listener 端口 1521。但是,这些应用程序服务器针对数据库打开的每个连接似乎都获得了自己的 TCP 端口。
有没有办法限制这些服务器用于连接数据库的端口范围?
给定任何版本的 Oracle:
我正在更新我的IDENTITY
溢出检查脚本以说明DECIMAL
和NUMERIC
IDENTITY
列。
作为检查的一部分,我计算每一IDENTITY
列的数据类型范围的大小;我用它来计算该范围的百分比已用尽。对于该范围的大小,DECIMAL
精度在哪里。NUMERIC
2 * 10^p - 2
p
我创建了一堆带有DECIMAL
和NUMERIC
IDENTITY
列的测试表,并尝试按如下方式计算它们的范围:
SELECT POWER(10.0, precision)
FROM sys.columns
WHERE
is_identity = 1
AND type_is_decimal_or_numeric
;
这引发了以下错误:
Msg 8115, Level 16, State 6, Line 1
Arithmetic overflow error converting float to data type numeric.
我将它缩小到IDENTITY
类型的列DECIMAL(38, 0)
(即具有最大精度),所以我然后POWER()
直接尝试对该值进行计算。
以下所有查询
SELECT POWER(10.0, 38.0);
SELECT CONVERT(FLOAT, (POWER(10.0, 38.0)));
SELECT CAST(POWER(10.0, 38.0) AS FLOAT);
也导致了同样的错误。
POWER()
类型为 的输出转换FLOAT
为NUMERIC
(尤其是在FLOAT
具有更高优先级时)?DECIMAL
或列的范围?NUMERIC
p = 38
我有一个托管在 SQL Azure 实例上的 OLTP 数据库。我想从云中提取数据库的副本,这样我就可以对其运行一些繁重的提取和 OLAP 样式的查询,而不会影响源数据库。
如何将数据库的副本下拉到本地 SQL Server 实例?
我在 SQL Server 2008 中定义了以下索引视图(您可以从 gist下载工作模式以进行测试):
CREATE VIEW dbo.balances
WITH SCHEMABINDING
AS
SELECT
user_id
, currency_id
, SUM(transaction_amount) AS balance_amount
, COUNT_BIG(*) AS transaction_count
FROM dbo.transactions
GROUP BY
user_id
, currency_id
;
GO
CREATE UNIQUE CLUSTERED INDEX UQ_balances_user_id_currency_id
ON dbo.balances (
user_id
, currency_id
);
GO
user_id
、currency_id
和transaction_amount
都定义为 中的NOT NULL
列dbo.transactions
。但是,当我在 Management Studio 的对象资源管理器中查看视图定义时,它会将视图中的两个balance_amount
和标记transaction_count
为NULL
-able 列。
我看过几个讨论,这个是其中最相关的,这表明一些函数的改组可能有助于 SQL Server 识别视图列始终是NOT NULL
. 但是,在我的情况下,不可能进行这样的改组,因为在索引视图中不允许ISNULL()
聚合函数上的表达式(例如over the SUM()
) 。
有什么方法可以帮助 SQL Server 认识到这一点balance_amount
并且transaction_count
可以NOT NULL
吗?
如果不是,我是否应该担心这些列被错误地标识为NULL
-able?
我能想到的两个问题是:
NOT NULL
.这些担忧中的任何一个都很重要吗?我还有其他需要注意的问题吗?
SQL Server 允许您将作业配置为在失败时发送电子邮件警报。这是监控您的工作的一种简单而有效的方法。但是,这些警报不包括任何细节——只是成功或失败通知。
如果作业失败,典型的警报电子邮件将如下所示:
JOB RUN: 'DBA - Consistency Check Databases' was run on 8/14/2011 at 12:00:04 AM
DURATION: 0 hours, 0 minutes, 0 seconds
STATUS: Failed
MESSAGES: The job failed. The Job was invoked by Schedule 2 (Nightly Before
Backup 12AM). The last step to run was step 1 (Check Databases).
要确定失败的原因,您必须导航到 SQL Server Management Studio 中的实例,找到作业并查看其执行历史记录。在大型环境中,必须不断地执行此操作可能会很痛苦。
理想的警报电子邮件会预先包含故障原因,让您直接着手解决问题。
我熟悉这个问题的解决方案。有没有人有这方面的经验?它的缺点是:
spDBA_job_notification
有没有人提出更好的解决方案?
我应该何时重建关系数据库 (SQL Server) 中的索引?
是否有定期重建索引的情况?