【问题标题】:SQL Server table-valued function? PRAGMA AUTONOMOUS_TRANSACTIONSQL Server 表值函数? PRAGMA AUTONOMOUS_TRANSACTION
【发布时间】:2015-10-28 15:24:24
【问题描述】:

我们有一些第三方软件可以使用 ODBC 从 Oracle 数据库中选择数据。

在 Oracle 中,我们将数据公开为流水线函数(而不是表或视图),因为我们要审计 SELECT。 Oracle 流水线函数使用PRAGMA AUTONOMOUS_TRANSACTION 开关,以便我们可以为我们通过管道传回 ODBC Select 的每一行将一行写入审计表。

这很好用!但是我们现在需要从 SQL Server 而不是 Oracle 做同样的事情。

我原以为我们可以使用 SQL Server 表值函数代替 Oracle 的流水线函数来做到这一点,但我们已经达到了“你不得在函数中执行 DML”的规定。

我们已经尝试了一个程序,但第三方软件没有它 - 当我告诉它“执行”时它会掉下来

SQL Server 中是否有 PRAGMA AUTONOMOUS_TRANSACTION 等效项?或者我想做的还有其他选择吗?

【问题讨论】:

  • 您可以在您的问题中添加 MS SQL 服务器的版本吗?

标签: sql-server oracle transactions pragma


【解决方案1】:

通过在你的函数中调用 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-24
    相关资源
    最近更新 更多