0

smoおよびpowershellスクリプトを使用して、テーブルにアタッチされているトリガーを出力したいと思います。

トリガーを使用してテーブルをスクリプト化する方法を見つけましたが、これはそうではありません。また、トリガーが接続されているテーブルの名前を常に知っているとは限りません。トリガー名を知っているだけです。

スクリプトにトリガーの名前を付けて、スクリプトを作成させたいと思います。

私はこれを行う方法を探していましたが、運がありませんでした。

いつものようにあなたの助けをありがとう。

4

2 に答える 2

0

このスクリプトは、SQLServer2008R2で正常に機能するようです。DBを指定していませんが、PowershellとSMOはMS製品のちょっとしたお話です。

SELECT
Tables.Name as 'TableName',
Triggers.name as 'TriggerName',
Comments.Text as 'TriggerText'
FROM  sysobjects Triggers
      Inner Join sysobjects Tables On Triggers.parent_obj = Tables.id
      Inner Join syscomments Comments On Triggers.id = Comments.id
WHERE 
      Tables.name = '<table-name>'
ORDER BY Tables.Name, Triggers.name
于 2012-10-26T12:49:58.187 に答える
0

sqlpsを使用した例を次に示します。

SQLSERVER:\SQL\Z001\SQL1\Databases\pubs>$db = get-item .
SQLSERVER:\SQL\Z001\SQL1\Databases\pubs>$db.Tables | foreach {$_.Triggers} | where {$_.name -like"employee*"} | foreach {$_.Script()}

SET ANSI_NULLS ON
SET QUOTED_IDENTIFIER ON

CREATE TRIGGER employee_insupd
ON employee
FOR insert, UPDATE
AS
--Get the range of level for this job type from the jobs table.
declare @min_lvl tinyint,
   @max_lvl tinyint,
   @emp_lvl tinyint,
   @job_id smallint
select @min_lvl = min_lvl,
   @max_lvl = max_lvl,
   @emp_lvl = i.job_lvl,
   @job_id = i.job_id
from employee e, jobs j, inserted i
where e.emp_id = i.emp_id AND i.job_id = j.job_id
IF (@job_id = 1) and (@emp_lvl <> 10)
begin
   raiserror ('Job id 1 expects the default level of 10.',16,1)
   ROLLBACK TRANSACTION
end
ELSE
IF NOT (@emp_lvl BETWEEN @min_lvl AND @max_lvl)
begin
   raiserror ('The level for job_id:%d should be between %d and %d.',
      16, 1, @job_id, @min_lvl, @max_lvl)
   ROLLBACK TRANSACTION
end
于 2012-10-26T13:59:20.243 に答える