SQL服务器table值函数?语法 AUTONOMOUS_TRANSACTION
SQL Server table-valued function? PRAGMA AUTONOMOUS_TRANSACTION
我们有一些第三方软件可以使用 ODBC 从 Oracle 数据库中选择数据。
在 Oracle 中,我们将数据公开为管道函数(而不是 table 或视图),因为我们要审计 SELECT
。 Oracle 管道函数使用 PRAGMA AUTONOMOUS_TRANSACTION
开关,以便我们可以为我们通过管道返回 ODBC Select.
的每一行写入审计 table
这太棒了!但是我们现在需要从 SQL 服务器而不是 Oracle 做同样的事情。
我原以为我们可以使用 SQL 服务器 table 值函数来代替 Oracle 的流水线函数来做到这一点,但我们已经触及了 'thou shalt not execute DML in a function' 法则。
我们已经用程序试过了,但是第三方软件没有-我告诉它时它就崩溃了'EXEC'
SQL 服务器中是否有 PRAGMA AUTONOMOUS_TRANSACTION
等价物?或者我想做的事情还有其他选择吗?
通过在你的函数中调用 master..xp_cmdshell 有一个解决方案
the question on dba.stackexchange.com
CREATE FUNCTION loophole(@i int) RETURNS varchar(20) AS
BEGIN
DECLARE @sql varchar(MAX),
@cmd varchar(4000)
SELECT @sql = ' UPDATE rsci ' +
' SET b = CASE ' + ltrim(str(@i + 1)) +
' WHEN 1 THEN ''Ett'' WHEN 2 THEN ''Två''' +
' WHEN 3 THEN ''Tre'' WHEN 4 THEN ''Fyra''' +
' WHEN 5 THEN ''Fem'' WHEN 6 THEN ''Sex''' +
' WHEN 7 THEN ''Sju'' WHEN 8 THEN ''Åtta''' +
' WHEN 9 THEN ''Nio'' WHEN 10 THEN ''Tio'' END' +
' WHERE a = ' + ltrim(str(@i + 1))
SELECT @cmd = 'sqlcmd -S ' + @@servername + ' -d ' + db_name() +
' -Q "' + @sql + '"'
EXEC master..xp_cmdshell @cmd, 'no_output'
RETURN (SELECT b FROM rsci WHERE a = @i)
END
我们有一些第三方软件可以使用 ODBC 从 Oracle 数据库中选择数据。
在 Oracle 中,我们将数据公开为管道函数(而不是 table 或视图),因为我们要审计 SELECT
。 Oracle 管道函数使用 PRAGMA AUTONOMOUS_TRANSACTION
开关,以便我们可以为我们通过管道返回 ODBC Select.
这太棒了!但是我们现在需要从 SQL 服务器而不是 Oracle 做同样的事情。
我原以为我们可以使用 SQL 服务器 table 值函数来代替 Oracle 的流水线函数来做到这一点,但我们已经触及了 'thou shalt not execute DML in a function' 法则。
我们已经用程序试过了,但是第三方软件没有-我告诉它时它就崩溃了'EXEC'
SQL 服务器中是否有 PRAGMA AUTONOMOUS_TRANSACTION
等价物?或者我想做的事情还有其他选择吗?
通过在你的函数中调用 master..xp_cmdshell 有一个解决方案 the question on dba.stackexchange.com
CREATE FUNCTION loophole(@i int) RETURNS varchar(20) AS
BEGIN
DECLARE @sql varchar(MAX),
@cmd varchar(4000)
SELECT @sql = ' UPDATE rsci ' +
' SET b = CASE ' + ltrim(str(@i + 1)) +
' WHEN 1 THEN ''Ett'' WHEN 2 THEN ''Två''' +
' WHEN 3 THEN ''Tre'' WHEN 4 THEN ''Fyra''' +
' WHEN 5 THEN ''Fem'' WHEN 6 THEN ''Sex''' +
' WHEN 7 THEN ''Sju'' WHEN 8 THEN ''Åtta''' +
' WHEN 9 THEN ''Nio'' WHEN 10 THEN ''Tio'' END' +
' WHERE a = ' + ltrim(str(@i + 1))
SELECT @cmd = 'sqlcmd -S ' + @@servername + ' -d ' + db_name() +
' -Q "' + @sql + '"'
EXEC master..xp_cmdshell @cmd, 'no_output'
RETURN (SELECT b FROM rsci WHERE a = @i)
END