我的一位开发人员编写了一个类似于 VB.Net 函数 (LastIndexOf) 的 SQL 函数,并希望发布它。我的问题是将它放在中央数据库中而不是将它放在每个用户数据库中的原因是什么?
开发人员试图将它放在他的主数据库上的 sys 模式中,这样他就不必限定从用户数据库对它的调用......叹气
但我不确定将它(显然不是主数据库)与每个用户数据库集中起来的有效借口是什么?
为什么 Postgres 函数从值extract()返回?double precisiondate
我能想象的唯一原因是,有一些语言环境使用日历(那些不是公历并由 Postgres 支持),以不同的方式计算日期/时间并可能返回浮点数。
以前,我会将多个表合并为一个并返回结果,但在许多表中我有相同的列名。这就是为什么我决定用表名作为列名的前缀。但这打破了我必须自动更新我的updated_at专栏的触发器。
这是我的功能:
CREATE OR REPLACE FUNCTION update_updated_at()
RETURNS TRIGGER AS $$
BEGIN
NEW.updated_at = now();
RETURN NEW;
END;
$$ language 'plpgsql';
Run Code Online (Sandbox Code Playgroud)
我会添加一个触发器,如:
CREATE TRIGGER update_users_updated_at
BEFORE UPDATE ON users
FOR EACH ROW EXECUTE PROCEDURE update_updated_at();
Run Code Online (Sandbox Code Playgroud)
但是现在我的专栏被命名了users_updated_at,这不起作用。我的问题是有什么方法可以将列名传递给触发器并更新传递的列,还是有其他我不知道的方法?
我想生成给定日期的通用季度结束日期。
例如:如果我有2010-01-01,我想返回2010-03-31,等等。
我可以得到季度号和年份:
select to_char(date_trunc('quarter', current_date)::date, 'yyyy-q');
Run Code Online (Sandbox Code Playgroud)
2017-3从今天起返回的是2017-07-14
我如何很好地获得季度结束日期?
我可以得到答案,但它非常丑陋:
select to_char(date_trunc('year', date '2015-01-01'),'yyyy') || '-' ||case
when (select extract('quarter' from date_trunc('quarter', date '2015-01-01')::date )) = 1 then '03-31'
when (select extract('quarter' from date_trunc('quarter', date '2015-01-01')::date )) = 2 then '06-30'
when (select extract('quarter' from date_trunc('quarter', date '2015-01-01')::date )) = 3 then '09-30'
when (select extract('quarter' from date_trunc('quarter', date '2015-01-01')::date )) = 4 then '12-31'
else '?'
end
Run Code Online (Sandbox Code Playgroud)
返回2015-03-31因为我把2015-01-01。
有没有更好的办法?
我们有内联函数,可以将数据收集到 XML 中,将派生的 XML 传递给其他函数,然后将其切碎并将其重组为字符串。
(你的“你不应该在 T-SQL 中做那种事情”是另一天的讨论。)
多年来,这在 2005 和 2008 R2 中一直运行良好。我们现在正在升级到 2016 SP1。使用这些函数在我们的生产服务器上运行不到一秒的查询现在在 2016 SP1 中运行得更快。那太好了,但是在 2016 SP1 上编译需要一个小时。严重地:
生产环境:
(它们都来自 SQL Sentry Plan Explorer。)
我们已经在 2008 (100) 和 2016 (130) 兼容性级别尝试了数据库(但我们还没有使用“传统基数估计”和“查询优化器修复”设置,目前这两个设置都为“关闭”)。我们尝试过使用QUERYTRACEON 9481,似乎没有效果。
同样,这与最终的计划无关,因为它们都在很短的时间内运行。这是制定计划所需的时间。
我们已经设法用一组简化的代码在一定程度上重现了这个问题。调用以下示例中的顶级函数的语句在 SQL Server 2016 (SP1-CU5) 上编译需要 30-60 秒,但在 SQL Server 2008 R2 (SP3) 上编译和运行只需不到 1 秒。
/*
Create and populate table...
*/
CREATE TABLE TestXMLStuff (OrderID int, ProdLength int, ProdWidth int, ProdHeight int);
INSERT INTO TestXMLStuff (OrderID, ProdLength, ProdWidth, ProdHeight) …Run Code Online (Sandbox Code Playgroud) 我发现
但是没有答案并且与我的问题不完全相同(尽管非常相似)。
假设我执行以下操作:
myfunc()myfunc()myfunc()从事务 A调用第 6 步会发生什么? 我是否调用了步骤 1 中定义的原始函数?还是第 4 步中的修改形式(在第 5 步中提交)?
如果函数在第 4 步中被删除而不是被修改,那么第 6 步会失败还是成功?(这可能是同一个问题,但修改的工作方式可能不同。)
关于这个的文档在哪里?
在问题MS-SQL 上是否有任何(隐藏的)内置函数来取消引用对象名称?作者正在寻求有关是否存在“取消引用”引用字符串的内部函数的建议。作者McNets已经注意到,一些内部函数可以处理引用(例如[MyTable])和未引用(例如)MyTable传递的参数值(例如OBJECT_ID())。
在David Browne - Microsoft给出的答案 ( 1 ) 中,引述如下:
... QUOTENAME 的反面是 PARSENAME,它具有导航多部分名称的附加功能。
我不同意这部分答案的以下评论:
我不同意,你可以修改传递给一个参数
PARSENAME()来显示多部分的部分标识是它的SERVER,DATABASE,SCHEMA或OBJECT部分。但恕我直言,PARSENAME与此相反的说法QUOTENAME有点牵强。
我现在的问题是:
函数PARSENAME()是相反的QUOTENAME()吗?
我正在尝试构建一个触发器函数,以便在任何项目发生更改时自动更新父订单值。
这是我创建的:
CREATE OR REPLACE FUNCTION update_totals() RETURNS void AS $$
UPDATE orders SET
total_fees = (SELECT SUM(fees) FROM order_items WHERE order_id = OLD.order_id),
total_profit = (CASE WHEN total_cost IS NOT NULL THEN total - total_tax - total_cost - (SELECT SUM(fees) FROM order_items WHERE order_id = OLD.order_id) ELSE NULL END)
WHERE id = OLD.order_id;
$$
LANGUAGE SQL;
CREATE TRIGGER update_totals AFTER INSERT
OR UPDATE OF fees
ON order_items INITIALLY DEFERRED
FOR EACH ROW
WHEN ( OLD.* IS DISTINCT FROM NEW.* …Run Code Online (Sandbox Code Playgroud) 我正在尝试查找EXECUTE和ALL之间的区别的参考资料:
GRANT { EXECUTE | ALL [ PRIVILEGES ] } ON { FUNCTION | ALL FUNCTIONS IN SCHEMA }...
Run Code Online (Sandbox Code Playgroud)
但我能找到的只是文档所说的:
EXECUTE 允许使用指定的函数以及使用在该函数之上实现的任何运算符。这是唯一适用于函数的特权类型。(此语法也适用于聚合函数。)
例如,我知道对于模式ALL = CREATE + USAGE,但我想在函数引用中仔细检查:
这是唯一适用于函数的特权类型。
在上面的文档片段中暗示了对于函数ALL = EXECUTE并且:
GRANT ALL ON ALL FUNCTIONS...
Run Code Online (Sandbox Code Playgroud)
相当于:
GRANT EXECUTE ON ALL FUNCTIONS...
Run Code Online (Sandbox Code Playgroud) 我希望能够获得一个函数名称和函数所有者名称的表格。
目前,此查询返回给定模式的函数列表:
SELECT proname
FROM pg_catalog.pg_namespace n
JOIN pg_catalog.pg_proc p
ON pronamespace = n.oid
WHERE nspname = '<%= schema_name %>';
Run Code Online (Sandbox Code Playgroud)
我可以看到有一proowner列返回角色的 ID。
https://www.postgresql.org/docs/10/catalog-pg-proc.html
我想要的是返回所有者名称的东西,我只是不知道足够的 SQL 来弄清楚如何加入表等。
|function_name|function_owner|
______________________________
|func1 |func1_owner |
|func2 |func2_owner |
Run Code Online (Sandbox Code Playgroud)
如果有人可以解释如何做到这一点,我将不胜感激!
谢谢
functions ×10
postgresql ×7
sql-server ×3
date ×1
date-format ×1
ddl ×1
interval ×1
optimization ×1
performance ×1
permissions ×1
plpgsql ×1
role ×1
transaction ×1
trigger ×1
xml ×1