我想知道为什么对于标量值函数,我必须授予用户执行而不仅仅是选择?
同时,表值函数只需选择权限或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”权限而不是执行权限?
我希望我的问题是有道理的。谢谢你。
在 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 中的函数。
我想在我的数据库中通过脚本创建新函数。脚本代码如下:
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) 我使用以下语句尝试了 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 加密的值?
如果我有一个包含 3 列的表格——比如 A、B 和 D——并且我不得不引入一个新的——比如 C 来替换 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等)来弄乱列的自然顺序,如下所示:
从我的函数抛出的错误来看,我现在意识到用我的方法改变列的顺序也是一个禁忌。任何人都可以说明为什么我所做的也是错误的? …
postgresql metadata database-internals functions postgresql-9.6
我在PostgreSQL 教程上读到了这篇文章:
如果您想从存储过程返回值,可以使用输出参数。输出参数的最终值将返回给调用者。
然后我发现DZone的函数和存储过程之间存在差异:
存储过程不返回值,但存储函数返回单个值
谁能帮我解决这个问题。
如果我们可以从存储过程中返回任何内容,也请让我知道如何从SELECT主体内的语句中执行此操作。
如果我有错的地方请告知。
Stack Overflow Q & A Modify OWNER on all table 同时在 PostgreSQL 中描述了一些漂亮的方法来将表和其他对象更改为特定用户,并且它工作得很好,但是所有的建议似乎都忽略了我创建的函数。
是否有一种相当简单的方法来重置数据库中所有对象的所有者,包括函数?手工操作是非常不可取的。
我有一个算法,我需要针对具有 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 是实现基于集合的函数的唯一方法吗?
PostgreSQL 中的更新后和更新前有什么区别?我无法理解 和 之间的区别after update,before 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 …
functions ×10
postgresql ×7
sql-server ×3
metadata ×2
t-sql ×2
array ×1
ddl ×1
encryption ×1
owner ×1
permissions ×1
ssis ×1
trigger ×1