2017-11-16 8 views
0

私は、アナリストがプライマリキーなしでテーブルを作成できないようにしようとしています。私はデータベースレベルのトリガを作成する方法を知っています、そして、私はテーブルがプライマリキーを持っているかどうかを見つけるためにクエリする方法を知っていますが、私はSQL Serverが ' ON INSERT/ON UPDATEトリガーで使用される '/' updated 'テーブルを挿入しました。 SQL Serverは、この「を作成」テーブルを持っていた場合データベースレベルプライマリキーのないテーブルの作成を防ぐためのテーブル作成のトリガー

仮に、私のトリガーは次のようになります。主キーの重要性について、アナリストを指示する

CREATE TRIGGER PKViolations 
ON DATABASE 
FOR CREATE_TABLE 
AS 

IF EXISTS (SELECT 1 
      FROM Created 
      WHERE OBJECTPROPERTY(OBJECT_ID,'TableHasPrimaryKey') = 0) 

    BEGIN 
     PRINT 'Please include a Primary Key. Transaction has been rolled back.' 
     ROLLBACK; 
    END 

を支援してきましたが、テーブルはまだPKをせずに作成されていますどんな洞察も大いにありがとう!

答えて

0

EVENTDATA()を使用してObjectNameを取得できます。次に、問合せを使用して主キーがあるかどうかを調べることができます。

SELECT NewTableName = EVENTDATA().value('(/EVENT_INSTANCE/ObjectName)[1]', 'NVARCHAR(255)') 

ここでEVENTDATAについて詳しく読むことができます。

CREATE TRIGGER PKViolations 
ON DATABASE 
FOR CREATE_TABLE 
AS 

    declare @NewTableName nvarchar(255) 
    SELECT @NewTableName = EVENTDATA().value('(/EVENT_INSTANCE/ObjectName)[1]', 'NVARCHAR(255)') 

    IF OBJECTPROPERTY(OBJECT_ID(@NewTableName),'TableHasPrimaryKey') = 0 
    BEGIN 
     PRINT 'Please include a Primary Key. Transaction has been rolled back.' 
     ROLLBACK; 
    END 

go 
+0

うわー、これは私が探していたまさにです:https://docs.microsoft.com/en-us/sql/t-sql/functions/eventdata-transact-sql

はここで完全に機能する例です。本当にありがとう! – bcoakley

+0

これがうまくいく場合は、これを答えとしてマークすることを検討する必要があります。 –

+0

ありがとう、Sean。私はすでにそれをやっていないために謝罪します - 私はまだオーバーフローを積み重ねる非常に新しいユーザーです、それでもハングアップしています! – bcoakley

関連する問題