DDL Trigger中再次履行DDL

再create user时触发的trigger里面要执行alter user,在SQLDataSet中执行我们输入的DDL语句

今关押公司群里讨论一个求,就是审计方要求数据库的用户创建之后要强制用户改口令,其实在建用户语句后,通过alter
user语句让口令过期就哼了,但是审计方要求用trigger实现?难道是自9i时代遗留下来的规则?

create TRIGGER indexTrigger
ON ALL SERVER
–FOR DROP_INDEX ,ALTER_INDEX,create_index
FOR DROP_INDEX
AS
declare @original_login sysname ,@login_name sysname,@user_name
sysname,@eventtype nvarchar(100),@commandText nvarchar(max),@dbname
sysname
select
@original_login=ORIGINAL_LOGIN(),
@login_name=SUSER_NAME(),
@user_name=CURRENT_USER,
@dbname=EVENTDATA().value(‘(/EVENT_INSTANCE/DatabaseName)[1]’,
‘sysname’) ,
@eventtype= EVENTDATA().value(‘(/EVENT_INSTANCE/EventType)[1]’,
‘nvarchar(100)’) ,
@commandText=
EVENTDATA().value(‘(/EVENT_INSTANCE/TSQLCommand/CommandText)[1]’,’nvarchar(max)’)

当SQLDataSet中推行我们输入的DDL语句,并察看执行结果。

在Create User时触发Trigger并收获用户信息:How to Track CREATE USER /
DROP USER Statements Using A Trigger (Doc ID 339558.1)  

if not exists(select 1 from tempdb.sys.tables where
name=’indexTrigger’)
begin
    create table tempdb.DBO.indexTrigger(
        original_login sysname ,
        login_name sysname,
        user_name sysname,
        eventtype nvarchar(100),
        commandText nvarchar(max),
        dbname sysname,
        createtime datetime default getdate()
    )
end
insert
tempdb.dbo.indexTrigger([original_login],[login_name],[user_name],[eventtype],[commandText],dbname)
select
@original_login,@login_name,@user_name,@eventtype,@commandText,@dbname

这边以看输入的时空,从先输好的记事本中复制的SQL语句。效果图:

尚会见碰到一个问题,再create user时触发的trigger里面要执行alter user
<username> password expire语词,就会见触发ORA-30511错误,解决措施 :

 

**************************************************************************************

Executing DDL in the DDL trigger

EVENTDATA
(Transact-SQL)

具体操作:

**************************************************************************************

DBGrid1.DataSource->DataSource1.DataSet->ClientDataSet1.ProviderName->DataSetProvider1->

SQLDataset1.SQLConnection1->具体数据库(这里连的是oracle中之新建的Persons(根据自己新建的表名)表);

这边SQLDataset1以及ClientDataSet1且不可知装也TRUE,因为表还不曾盖起来,会返回个谬误。

兹在放入一个SQLDataSet2控件执行我们的DDL语句。

现窗体结构应当如下图澳门葡京网上娱乐:

**************************************************************************************

重在代码:

**************************************************************************************

procedure TForm3.ExeSQLScript;
var
  strScript:string;
  strSQL:string;
  iPos:integer;
begin
   strScript:=Memo1.Lines.Text;
   while Length(strScript)>0 do
   begin
     iPos:=Pos(‘;‘,strScript);
     if iPos>0 then
     begin
       strSQL:= Copy(strScript,1,iPos-1);
       SQLDataSet2.CommandText:=strSQL;
       SQLDataset2.ExecSQL(true);
       Delete(strScript,1,iPos);
     end else
     begin
       break;
     end;
   end;
   if ClientDataSet1.Active then
    begin
   ClientDataSet1.Refresh;
    end else
    begin
      ClientDataSet1.Active:=true;
    end;
end;

procedure TForm3.Button1Click(Sender: TObject);
begin
  ExeSQLScript;
end;

  能达代码在DELPHI XE5 ,WIN7 X64,ORACLE 11G遭遇测试通过。