数据库级别在表创建时触发,以防止创建没有主键的表

时间:2017-11-16 15:12:45

标签: sql sql-server ssms

我试图想出一种方法来阻止分析师在没有主键的情况下创建表格。我知道如何创建一个数据库级别的触发器,我知道如何查询以查找一个表是否有一个主键,但我希望SQL Server有一个'创建'表,与插入' /'更新'的方式大致相同。 ON INSERT / ON UPDATE触发器中使用的表。

假设,如果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的情况下仍然可以创建表格,非常感谢任何见解!

1 个答案:

答案 0 :(得分:0)

您可以使用EVENTDATA()来获取ObjectName。然后,您可以使用查询来检查是否存在主键。

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

您可以在此处详细了解EVENTDATA。 https://docs.microsoft.com/en-us/sql/t-sql/functions/eventdata-transact-sql

这是一个功能齐全的例子:

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