我有一個對幾乎所有表都使用插入、更新和洗掉觸發器的資料庫。它們將執行操作的主機和程式記錄在單獨的審計表中。觸發器都包含這個 select 陳述句來設定插入到審計表中的變數:
select @HostName = HostName, @ProgramName = Program_Name
from master..sysprocesses where SPID = @@SPID
我們現在正在尋求遷移到不支持master..sysprocesses語法的Azure SQL 資料庫。似乎該表也已棄用:https : //docs.microsoft.com/en-us/sql/relational-databases/system-compatibility-views/sys-sysprocesses-transact-sql?view=sql-server- ver15
我們需要做的是更新觸發器以使用它:
select @HostName = [host_name], @ProgramName = [program_name]
from sys.dm_exec_sessions where session_id = @@SPID
但是,資料庫有數百個表,每個表都有三個需要更新的觸發器。每個觸發器的文本替換是相同的。是否有一種可行的方法可以撰寫一些腳本來對資料庫中的所有觸發器執行此更新?
uj5u.com熱心網友回復:
好的,我只是通過在幾個觸發器中干擾你的字串(當然作為評論)然后運行它來測驗這個。我不提倡這是正確的方法,因為此鏈接將幫助您以正確的方式執行動態 sql https://dba.stackexchange.com/questions/165149/exec-vs-sp-executesql-performance
但是,這確實有效,并將幫助您了解如何將這些東西拼湊在一起以達到這一點。
請注意,觸發器之間的任何格式差異都可能導致此錯誤丟失一些,因此您需要自己驗證 0。
DECLARE @string VARCHAR(8000)='select @HostName = HostName, @ProgramName = Program_Name
from master..sysprocesses where SPID = @@SPID'
, @counter INT=1
, @Max INT
, @Sql VARCHAR(mAX)
;
IF OBJECT_ID('TempDB..#TrigUpdate') IS NOT NULL DROP TABLE #TrigUpdate;
CREATE TABLE #TrigUpdate
(
SqlVar VARCHAR(MAX)
, RowID INT
)
;
INSERT INTO #TrigUpdate
SELECT REPLACE(REPLACE(t.definition, @string, ''), 'CREATE TRIGGER', 'ALTER TRIGGER')
, Row_Number() OVER (ORDER BY t.Definition ASC) AS RowID
FROM sys.objects o
INNER JOIN sys.sql_modules t on o.object_id =t.object_id
WHERE o.type_desc='SQL_TRIGGER'
AND CHARINDEX(@string, t.definition,1)>0
;
SET @Max = (SELECT COUNT(*) FROM #TrigUpdate);
WHILE @Counter<=@Max
BEGIN
SET @sql = (SELECT SqlVar FROM #TrigUpdate WHERE RowID=@counter);
EXEC(@Sql);
SET @Counter=@Counter 1;
END
uj5u.com熱心網友回復:
它可以通過 Object_Definition 和 Replace 來完成。
Create Table #Triggers_new (TriggerName sysname, QueryText VarChar(max))
Declare @string_pattern VarChar(max), @string_replacement VarChar(max)
Select @string_pattern = '<string_pattern>'
Select @string_replacement = '<string_replacement>'
Insert Into #Triggers_new (TriggerName, QueryText)
Select [name], Replace(Object_Definition(object_id), @string_pattern, @string_replacement)
From sys.objects
Where [type] = 'TR'
Order by [name]
-- Update #Triggers_new Set QueryText = Replace(QueryText, 'Create Trigger ', 'Alter Trigger ')
uj5u.com熱心網友回復:
為什么你在系統表/視圖上使用如此繁重的查詢,未經你的同意就可以更改?
你不能通過使用元資料函式來簡化你,比如:
SELECT HOST_NAME(), PROGRAM_NAME()...
那將給出請求的資訊值?
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/313296.html
標籤:sql-server 查询语句 azure-sql-数据库
上一篇:如何從sql列的值中找到總和
