更改外键约束所需的最低权限是多少?
在MySQL 5.5.41修复此错误后,我的迁移脚本停止工作:
我收到此错误:
SQLSTATE[42000]:语法错误或访问冲突:1142 REFERENCES 命令拒绝用户 'foo'@'localhost' 用于表 'core.users'(SQL:alter table `user_baz` 添加约束 user_baz_user_id_foreign 外键(`user_id`)引用`core`.`users`(`id`)在更新级联上删除级联)
这意味着我需要修复权限。我需要的最低权限是多少?
我正在寻找一种方法来仅根据指定 CSV 的内容生成新的 MySQL 表。我将使用的 CSV 文件具有以下属性;
在 Excel 中,这一切都相当简单,但是在 MySQL 中似乎并非如此(Google 运气不佳)。关于我应该看什么的任何建议?
每次使用 pgAdmin III 恢复数据库时,我都会收到以下 pgAdmin III 错误:
错误:无法删除文件“”(错误 2:没有这样的文件或目录)
请参阅pgadmin 日志。
我的配置:
x86_64-unknown-linux-gnu 上的 PostgreSQL 9.4.4,由 gcc (Ubuntu 4.8.2-19ubuntu1) 4.8.2 编译,64 位
Linux 3.19.0-26-generic #28~14.04.1-Ubuntu SMP Wed Aug 12 14:09:17 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
我有一个这样的 XML 值:
<R>
<I>A</I>
<I>B</I>
<I>C</I>
...
</R>
Run Code Online (Sandbox Code Playgroud)
我想连接所有的I值并返回它们作为单个字符串:ABC...。
现在我知道我可以分解 XML,将结果聚合回无节点 XML,然后应用于.values('text()[1]', ...)结果:
SELECT
(
SELECT
n.n.value('text()[1]', 'varchar(50)') AS [text()]
FROM
@MyXml.nodes('/R/I') AS n (n)
FOR XML
PATH (''),
TYPE
).value('text()[1]', 'varchar(50)')
;
Run Code Online (Sandbox Code Playgroud)
但是,我想仅使用 XPath/XQuery 方法来完成所有这些工作,如下所示:
SELECT @MyXml. ? ( ? );
Run Code Online (Sandbox Code Playgroud)
有这样的方法吗?
我在这个方向寻找解决方案的原因是因为我的实际 XML 也包含其他元素,例如:
SELECT
(
SELECT
n.n.value('text()[1]', 'varchar(50)') AS [text()]
FROM
@MyXml.nodes('/R/I') AS n (n)
FOR XML
PATH (''),
TYPE
).value('text()[1]', 'varchar(50)')
;
Run Code Online (Sandbox Code Playgroud)
而且我希望能够将I值提取为单个字符串,并将J值提取为单个字符串,而不必为每个值使用笨拙的脚本。
例如,当我将 SQL Server 安装到驱动器的根目录时,D:\当我从第三方软件运行数据库部署程序时出现错误。
但是当我将我的 SQL Server 实例D:\SQL\移动到(将它移动到驱动器中的一个文件夹)时,安装就完美无缺了。
我的问题不是关于数据库部署者,而是更多关于 SQL 安装到驱动器根目录时出现问题的原因。这是不好的做法吗?为什么不应该将 SQL Server 安装到驱动器的根目录?
目前我正试图弄清楚 SQL Server 如何评估部分覆盖直方图步骤的范围谓词的基数。
在互联网上,在cardinality-estimation-for-and-for-intra-step-statistics-value我遇到了一个类似的问题,Paul White 给出了一个相当有趣的答案。
根据Paul的回答,谓词>=和>的基数估计公式(在这种情况下,我只对至少120的基数估计器模型感兴趣)如下:
对于 >:
Cardinality = EQ_ROWS + (AVG_RANGE_ROWS * (F * (DISTINCT_RANGE_ROWS - 1)))
Run Code Online (Sandbox Code Playgroud)
对于 >=:
Cardinality = EQ_ROWS + (AVG_RANGE_ROWS * ((F * (DISTINCT_RANGE_ROWS - 1)) + 1))
Run Code Online (Sandbox Code Playgroud)
我基于范围谓词使用TransactionDate列和“20140614”和“20140618”之间的日期时间范围测试了这些公式在AdventureWorks2014数据库的[Production].[TransactionHistory]表上的应用。
这个范围的直方图步骤的统计如下:
根据公式,我计算了以下查询的基数:
SELECT COUNT(1)
FROM [AdventureWorks2014].[Production].[TransactionHistory]
WHERE [TransactionDate] BETWEEN '20140615 00:00:00.000' AND '20140616 00:00:00.000'
Run Code Online (Sandbox Code Playgroud)
使用以下代码进行计算:
DECLARE @predStart DATETIME = '20140615 00:00:00.000'
DECLARE @predEnd DATETIME = '20140616 00:00:00.000'
DECLARE @stepStart DATETIME = '20140614 00:00:00.000'
DECLARE @stepEnd …Run Code Online (Sandbox Code Playgroud) sql-server query optimization sql-server-2014 cardinality-estimates
我目前正在使用更改数据捕获 (CDC)来跟踪数据更改,并且我希望跟踪提交进行更改的查询的客户端的主机名和 IP 地址。如果有 5 个不同的客户端通过相同的用户名登录,一个人面临着跟踪这 5 个中哪一个触发了查询的难题。我发现的其他似是而非的解决方案包括使用以下命令更改 CDC 表:
ALTER TABLE cdc.schema_table_CT
ADD HostName nvarchar(50) NULL DEFAULT(HOST_NAME())
Run Code Online (Sandbox Code Playgroud)
但是,这将返回触发查询的服务器的主机名,而不是触发查询的客户端的主机名。
有没有办法解决这个问题?有助于记录客户端的主机名或 IP 地址(或某种其他类型的唯一身份)的东西。我不想使用触发器,因为它会减慢系统速度,而且 CDC 还会生成系统表,因此显然不可能使用触发器。
我有一个序列,可以为系统中的对象生成跟踪编号。它已经运行良好有一段时间了。
上周我们注意到它开始重用值。
似乎发生的是,在晚上的不同时间点,它会回滚到前一天的值。然后它将继续从该点生成值。
所以例如我可以得到这样的东西:
10112
10113
10114
10115
10116
10117
10118
10113
10114
10115
10116
...
在它发生的时间、第一次使用和第二次使用之间的持续时间(少则 10 分钟或几个小时)或回滚的次数(少至 1 次,多至数百次)方面似乎没有任何模式。
我考虑过运行跟踪(并且仍然可能),但我认为序列对象没有被直接修改。我相信这是因为修改日期是几天前的,并且指向我们手动提高值以尝试消除重复项的时间。(从那以后这个问题已经发生了好几次。)
有没有人知道什么可能导致序列回滚和每晚重用值?
更新:回答评论中的几个问题:
@@Version:
Microsoft SQL Server 2012 (SP1) - 11.0.3000.0 (X64) 2012 年 10 月 19 日 13:38:57
创建脚本:
CREATE SEQUENCE [schemaName].[SequenceName]
AS [bigint]
START WITH 410014104
INCREMENT BY 1
MINVALUE 410000000
MAXVALUE 419999999
CYCLE
CACHE
GO
Run Code Online (Sandbox Code Playgroud)我没有唯一约束(但我打算放一个)。然而,这只会帮助我知道我何时重用了一个值。不是什么导致值重置。我做了一项工作,每 5 分钟就会获得一个新值,然后将其保存。时间和价值跳跃不遵循模式。
| payments | | transactions | | transaction_items |
|:--------------:| |:------------:| |:-----------------:|
| id | | id | | id |
| date | | number | | transaction_id |
| amount | | date | | description |
| transaction_id | | val | | price |
| discount |
| quantity |
Run Code Online (Sandbox Code Playgroud)
我正在尝试显示交易付款列表,并在每次付款后显示当前余额。以下是预期结果的示例
| number | DATE(p.date) | total | paid | balance |
| 1355 | 2016-10-31 | 899.00 | 450.00 | 449.00 |
| 1355 | …Run Code Online (Sandbox Code Playgroud) 我的问题是 SQL Server 如何处理需要将比可用空间更多的数据量拉入缓冲区缓存的查询?此查询将包含多个连接,因此磁盘上不存在此格式的结果集,它需要编译结果。但即使在编译之后,它仍然需要比缓冲区缓存中的可用空间更多的空间。
我举一个例子。假设您有一个 SQL Server 实例,它有 6GB 的可用缓冲区缓存空间。我运行具有多个连接的查询,读取 7GB 的数据,SQL Server 如何能够响应此请求?它是否将数据临时存储在 tempdb 中?它失败了吗?它是否只从磁盘读取数据并一次编译段?
此外,如果我尝试返回 7GB 的总数据会发生什么,这是否会改变 SQL Server 处理它的方式?
我已经知道有几种方法可以解决这个问题,我只是好奇 SQL Server 在按规定运行时如何在内部处理此请求。
此外,我确信该信息存在于某处,但我一直没有找到它。
sql-server memory database-internals sql-server-2012 buffer-pool
sql-server ×6
mysql ×3
audit ×1
buffer-pool ×1
bulk ×1
csv ×1
import ×1
installation ×1
memory ×1
mysql-5.5 ×1
optimization ×1
pgadmin-1.18 ×1
postgresql ×1
query ×1
sequence ×1
xml ×1
xquery ×1