Stack Overflow Q & A Modify OWNER on all table 同时在 PostgreSQL 中描述了一些漂亮的方法来将表和其他对象更改为特定用户,并且它工作得很好,但是所有的建议似乎都忽略了我创建的函数。
是否有一种相当简单的方法来重置数据库中所有对象的所有者,包括函数?手工操作是非常不可取的。
我想制作一个触发器来记录任何更新的时间:
CREATE TRIGGER col_update
AFTER UPDATE ON col
FOR EACH ROW BEGIN
UPDATE col SET updated=NOW() WHERE id=NEW.id; // or OLD.id
END
Run Code Online (Sandbox Code Playgroud)
问题是当这个触发器尝试更新updated列时,它也是另一个更新事件,它运行触发器。这将创建一个无限循环,这是行不通的。
如何将更新时间存储在相应的列中?
我希望使用触发器,因为表中有很多列。如果我尝试手动设置更新时间,则需要修改许多查询。
在 SQL Server 2008 或更高版本中,是UPDATE STATISTICS WITH FULLSCAN单线程操作还是可以使用并行性?如何使用默认采样更新统计信息 - 它可以使用并行性吗?我没有看到指定MAXDOP更新统计信息的选项。
当您将 Columns 文件夹拖到编辑器窗口时,将添加不带括号的完整列列表。如果您单独拖动列,则它们具有括号。
有没有办法把它关掉?我在选项中找不到任何东西,而且它们真的很让人分心。
我正在使用 PostgreSQL,但我认为大多数高端数据库必须具有一些类似的功能,而且,它们的解决方案可能会启发我的解决方案,所以不要考虑这个特定于 PostgreSQL 的解决方案。
我知道我不是第一个尝试解决这个问题的人,所以我认为这里值得一问,但我正在尝试评估建模会计数据的成本,以便从根本上平衡每笔交易。会计数据是仅附加的。此处的总体约束(以伪代码编写)可能大致如下:
CREATE TABLE journal_entry (
id bigserial not null unique, --artificial candidate key
journal_type_id int references journal_type(id),
reference text, -- source document identifier, unique per journal
date_posted date not null,
PRIMARY KEY (journal_type_id, reference)
);
CREATE TABLE journal_line (
entry_id bigint references journal_entry(id),
account_id int not null references account(id),
amount numeric not null,
line_id bigserial not null unique,
CHECK ((sum(amount) over (partition by entry_id) = 0) -- this won't work
);
Run Code Online (Sandbox Code Playgroud)
显然,这样的检查约束永远不会起作用。它按行操作,可能会检查整个数据库。所以它总是会失败并且做起来很慢。
所以我的问题是对这种约束进行建模的最佳方法是什么?到目前为止,我基本上已经研究了两个想法。想知道这些是否是唯一的,或者是否有人有更好的方法(除了将其留给应用程序级别或存储过程)。
在 SQL Server 2005 中,有没有办法找到在服务器级别不存在的用户(在服务器级别删除但在删除之前未与数据库解除关联的帐户)或未链接的帐户(帐户可能已在服务器级别而不是数据库级别被删除,然后重新读取但数据库级别从未被清理过)。
我有一个非常凌乱的服务器,如果可以运行查询来找到这些,那就太棒了。
我正在测试和填充利用该SEQUENCE对象的特定表。在这个过程中,我正在测试用数以万计的插入行填充表(因为我不熟悉如何编程)。我在这个特定表格中看到的问题是,当我开始另一个人口测试时,SEQUENCE它不会重置回我想要的第一个数字(即 1)。
当我想重新运行一个新的测试时,我删除了有问题的表,然后运行以下命令:
DROP SEQUENCE foo.fee;
GO
DROP SCHEMA foo;
GO
Run Code Online (Sandbox Code Playgroud)
当我想重新运行测试时,我运行以下SCHEMA&SEQUENCE命令,这些命令按以下顺序触发:
CREATE SCHEMA foo;
GO
CREATE SEQUENCE foo.fee
START WITH 1
INCREMENT BY 1
NO CYCLE
NO CACHE;
GO
Run Code Online (Sandbox Code Playgroud)
然后我创建表:
CREATE TABLE foo.sample_table_with_data
(order_number bigint PRIMARY KEY NOT NULL,
sample_column_one nvarchar(max) NULL,
sample_column_two nvarchar(max) NULL,
sample_column_three nvarchar(max) NULL)
GO
Run Code Online (Sandbox Code Playgroud)
完成后,我运行以下插入命令 50,000 次:
INSERT INTO [foo].[sample_table_with_data]
(
[order_number],
[sample_column_one],
[sample_column_two],
[sample_column_three]
)
VALUES
(
NEXT VALUE FOR foo.fee,
'Blah',
'Blah Blah',
'Blah …Run Code Online (Sandbox Code Playgroud) 我正在尝试servername\instancename使用以下调用在 SQL Server 2014 实例上创建链接服务器:
EXEC master.dbo.sp_addlinkedserver
@server = N'servername\instancename',
@srvproduct=N'SQL Server'
Run Code Online (Sandbox Code Playgroud)
我收到错误:
Msg 15028, Level 16, State 1, Procedure sp_addlinkedserver, Line 82
The server 'servername\instancename' already exists.
Run Code Online (Sandbox Code Playgroud)
这在 SQL Server 2005 中运行良好,并且根据MSDN,
链接服务器不必是 SQL Server 的另一个实例,
所以我不确定最近版本中不允许这样做的更改。使用 UI 会生成类似的消息:
不能将本地 SQL Server 创建为链接服务器。
我知道请求是一件奇怪的事情,但它是为了支持一些在 2005 年工作的遗留代码(并且曾经在不同的实例上)。文档指出它应该可以工作,但事实并非如此。有没有办法让它在 2014 年工作,或者我将不得不修改底层代码?
我有一个算法,我需要针对具有 800K 行和 38 列的表中的每一行运行该算法。该算法在 VBA 中实现,并使用来自某些列的值来处理其他列进行大量数学运算。
我目前正在使用 Excel (ADO) 来查询 SQL 并使用带有客户端游标的 VBA 通过循环遍历每一行来应用算法。它可以工作,但需要 7 个小时才能运行。
VBA 代码非常复杂,将其重新编码为 T-SQL 需要做很多工作。
我已经阅读了 CLR 集成和 UDF 作为可能的路由。我还考虑将 VBA 代码放在 SSIS 脚本任务中以更接近数据库,但我确信存在解决此类性能问题的专家方法。
理想情况下,我能够以基于并行集的方式对尽可能多的行(全部?)运行算法。
任何帮助都很大程度上取决于如何在此类问题上获得最佳性能。
- 编辑
感谢您的评论,我使用的是 MS SQL 2014 Enterprise,这里有更多详细信息:
该算法在时间序列数据中找到特征模式。算法中的函数执行多项式平滑、窗口化,并根据输入标准找到感兴趣的区域,返回十几个值和一些布尔结果。
我的问题更多是关于方法论而不是实际算法:如果我想一次在多行上实现并行计算,我的选择是什么。
我看到建议重新编码到 T-SQL 中,这是很多工作但可能的,但是算法开发人员在 VBA 中工作并且经常更改,因此我需要与 T-SQL 版本保持同步并重新验证每个改变。
T-SQL 是实现基于集合的函数的唯一方法吗?
我的部分工作量使用了一个CLR 函数,该函数实现了诡异的哈希算法来比较行以查看是否有任何列值发生了变化。CLR 函数将二进制字符串作为输入,因此我需要一种快速的方法将行转换为二进制字符串。我希望在整个工作负载期间散列大约 100 亿行,所以我希望这段代码尽可能快。
我有大约 300 个不同架构的表。出于这个问题的目的,请假设一个简单的表结构,包含 32 个可空INT列。我在这个问题的底部提供了示例数据以及一种对结果进行基准测试的方法。
如果所有列值都相同,则行必须转换为相同的二进制字符串。如果任何列值不同,则必须将行转换为不同的二进制字符串。例如,像下面这样简单的代码将不起作用:
CAST(COL1 AS BINARY(4)) + CAST(COL2 AS BINARY(4)) + ..
Run Code Online (Sandbox Code Playgroud)
它不能正确处理 NULL。如果COL1第 1 行为COL2NULL,第 2 行为 NULL,则两行都将转换为 NULL 字符串。我相信正确处理 NULL 是正确转换整行的最难部分。INT 列的所有允许值都是可能的。
先抢答一些问题:
将 32 个可INT为空的列转换为 aBINARY(X)或VARBINARY(X)string的最快方法是什么?
承诺的示例数据和代码:
-- create sample data
DROP TABLE IF EXISTS dbo.TABLE_OF_32_INTS;
CREATE TABLE dbo.TABLE_OF_32_INTS (
COL1 INT NULL,
COL2 INT NULL, …Run Code Online (Sandbox Code Playgroud) sql-server ×7
functions ×2
postgresql ×2
ddl ×1
metadata ×1
mysql ×1
owner ×1
parallelism ×1
sequence ×1
ssis ×1
ssms ×1
statistics ×1
t-sql ×1
trigger ×1
update ×1
users ×1