标签: functions

为什么标量值函数需要执行权限而不是选择?

我想知道为什么对于标量值函数,我必须授予用户执行而不仅仅是选择?

同时,表值函数只需选择权限或db_datareader成员资格即可正常工作。

更清楚的是,这里是我的示例:我需要一个对数据库具有只读权限的用户。所以我创建了一个名为的用户testUser并授予它db_datareader成员资格。然后我创建了一个名为fn_InlineTable. 一切都很棒。testUser整天运行这个 SQL

select * from dbo.fn_InlineTable
Run Code Online (Sandbox Code Playgroud)

然后我需要一个标量函数,所以我创建了一个名为fn_ScalarTest. testUser无法运行此 SQL

Select dbo.fn_ScalarTest(1) 
Run Code Online (Sandbox Code Playgroud)

很好理解:这是因为我没有授予“testUser”权限来执行fn_ScalarTest.

我的问题是:基于此链接/sf/ask/430562191/,表示 aFUNCTION不能用于执行修改数据库状态的操作. 那么为什么不让标量函数使用相同的“SELECT”权限而不是执行权限?

我希望我的问题是有道理的。谢谢你。

sql-server permissions t-sql functions

18
推荐指数
2
解决办法
4万
查看次数

BEGIN ATOMIC 在 PostgreSQL SQL 函数/过程中意味着什么?

在 PG 14 的文档中,在 参考资料CREATE FUNCTION部分中,手册指出函数的主体LANGUAGE SQL可以是单个语句:

RETURN expression
Run Code Online (Sandbox Code Playgroud)

或一个块:

BEGIN ATOMIC
statement;
statement;
...
statement;
END
Run Code Online (Sandbox Code Playgroud)

没有对该块的语义给出任何解释。这看起来类似于BEGIN ... END;PL/pgSQL 中的块,但似乎有些不同。

在 内 或 外 写一组语句有什么区别BEGIN ATOMIC ... END?什么时候需要使用这样的块?关键字是ATOMIC强制的吗?

postgresql functions postgresql-14

18
推荐指数
1
解决办法
8366
查看次数

将数组或记录传递给 PostgreSQL 中的函数?

我有一项任务是将数组、记录以及在某些情况下的记录数组作为参数传递给 PostgreSQL 中的函数。

postgresql functions array postgresql-9.0 composite-types

17
推荐指数
1
解决办法
4万
查看次数

如果不存在,则通过代码创建新函数

我想在我的数据库中通过脚本创建新函数。脚本代码如下:

IF Exists(Select * From sys.sysobjects A Where A.name =N'fn_myfunc' and xtype=N'FN') return;

CREATE FUNCTION fn_myfunc ()
returns varchar(10)
AS Begin
...
End
Run Code Online (Sandbox Code Playgroud)

但是当我执行上面的脚本时,SQL Server 返回一个错误:

'CREATE FUNCTION' must be the first statement in a query batch.
Run Code Online (Sandbox Code Playgroud)

sql-server t-sql sql-server-2008-r2 functions

16
推荐指数
1
解决办法
4万
查看次数

如何在 PostgreSQL 中使用 aes-encryption?

我使用以下语句尝试了 aes-encryption:

SELECT encrypt('test', 'key', 'aes');
Run Code Online (Sandbox Code Playgroud)

这有效,但我无法解密该值。我将它插入到数据类型bytea的字段中,但我不确定这是否正确。

SELECT decrypt(pw, 'key', 'aes') FROM table WHERE ID = 1;
Run Code Online (Sandbox Code Playgroud)

给我错误

错误:函数解密(bytea,未知,未知)不存在第
1 行:选择解密(密码,'key','aes')FROM tabelle WHERE ID = 7; ^
提示:没有函数匹配给定的名称和参数类型。您可能需要添加显式类型转换。

这是否真的意味着 encrypt() 是一个现有的函数,但不是decrypt()?我还能如何检索 aes 加密的值?

postgresql encryption functions postgresql-9.1

16
推荐指数
1
解决办法
4万
查看次数

PostgreSQL 9.6 列删除和对带有 CTE 的 SQL 函数的副作用

如果我有一个包含 3 列的表格——比如 A、B 和 D——并且我不得不引入一个新的——比如 C 来替换 D 的当前位置。我将使用以下方法:

  1. 引入 2 个新列作为 C 和 D2。
  2. 将 D 的内容复制到 D2。
  3. 删除 D。
  4. 将 D2 重命名为 D。

新的顺序是 A、B、C 和 D。

我认为这是一种合法的做法,因为(到目前为止)它没有产生任何问题。

但是,今天我遇到了一个问题,当一个函数在同一张表上执行语句时返回以下错误:

table row type and query-specified row type do not match

以及以下细节:

Query provides a value for a dropped column at ordinal position 13

我尝试重新启动 PostgreSQL,VACUUM FULL按照此处此处的建议执行并最终删除并重新创建该函数,但这些解决方案不起作用(除了他们尝试解决系统表已被更改的情况之外)。

有幸使用一个非常小的数据库,我导出了它,删除了它,然后重新导入它并解决了我的功能问题


我意识到这样一个事实,即不应通过修改系统表(弄脏pg_attribute等)弄乱列的自然顺序,如下所示:

是否可以更改 Postgres 中列的自然顺序?

从我的函数抛出的错误来看,我现在意识到用我的方法改变列的顺序也是一个禁忌。任何人都可以说明为什么我所做的也是错误的? …

postgresql metadata database-internals functions postgresql-9.6

15
推荐指数
1
解决办法
1762
查看次数

返回 PostgreSQL 中存储过程的值

我在PostgreSQL 教程上读到了这篇文章:

如果您想从存储过程返回值,可以使用输出参数。输出参数的最终值将返回给调用者。

然后我发现DZone的函数和存储过程之间存在差异:

存储过程不返回值,但存储函数返回单个值

谁能帮我解决这个问题。

如果我们可以从存储过程中返回任何内容,也请让我知道如何从SELECT主体内的语句中执行此操作。

如果我有错的地方请告知。

postgresql stored-procedures functions

15
推荐指数
2
解决办法
7万
查看次数

有没有办法同时设置 PostgreSQL 数据库中所有对象的所有者?

Stack Overflow Q & A Modify OWNER on all table 同时在 PostgreSQL 中描述了一些漂亮的方法来将表和其他对象更改为特定用户,并且它工作得很好,但是所有的建议似乎都忽略了我创建的函数。

是否有一种相当简单的方法来重置数据库中所有对象的所有者,包括函数?手工操作是非常不可取的。

postgresql metadata ddl functions owner

14
推荐指数
2
解决办法
2万
查看次数

如何实现基于集合的算法/UDF

我有一个算法,我需要针对具有 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 是实现基于集合的函数的唯一方法吗?

sql-server ssis functions sql-server-2014

14
推荐指数
1
解决办法
521
查看次数

PostgreSQL 中的更新后和更新前有什么区别

PostgreSQL 中的更新后和更新前有什么区别?我无法理解 和 之间的区别after updatebefore update因为看起来该函数总是在更新之前执行。

所以我做了下面的例子:

我做了一个函数,当状态为typing但延迟 10 秒时更新表。

CREATE OR REPLACE FUNCTION fai_prueba()
  RETURNS trigger AS
$BODY$
begin
    if new.status = 'Typing' then
        update image set status = 'ToTyping', path = 'Real path' from pg_sleep(5) where id = old.id;
    end if;
    return null;
end;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION fai_prueba()
  OWNER TO postgres;
Run Code Online (Sandbox Code Playgroud)

然后我有以下触发器

create trigger tai 
after update on image 
for each row execute procedure fai_prueba();
Run Code Online (Sandbox Code Playgroud)

但是当我运行 UPDATE …

postgresql trigger functions

14
推荐指数
1
解决办法
8795
查看次数