/
mssql10_trigger.php
79 lines (68 loc) · 3.04 KB
/
mssql10_trigger.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
<?php
/**
* Manipulate trigger nodes
*
* @package DBSteward
* @subpackage mssql10
* @license http://www.opensource.org/licenses/bsd-license.php Simplified BSD License
* @author Nicholas J Kiraly <kiraly.nicholas@gmail.com>
*/
class mssql10_trigger extends pgsql8_trigger {
/**
* Creates and returns SQL for creation of trigger.
*
* @return created SQL
*/
public function get_creation_sql($node_schema, $node_trigger) {
$event_chunks = preg_split("/[\,\s]+/", $node_trigger['event'], -1, PREG_SPLIT_NO_EMPTY);
$node_table = dbx::get_table($node_schema, $node_trigger['table']);
if ($node_table == NULL) {
throw new exception("Failed to find trigger table " . $node_trigger['table'] . " in schema node " . $node_schema['name']);
}
$table_name = mssql10_diff::get_quoted_name($node_schema['name'], dbsteward::$quote_schema_names) . '.' . mssql10_diff::get_quoted_name($node_table['name'], dbsteward::$quote_table_names);
$trigger_name = mssql10_diff::get_quoted_name($node_schema['name'], dbsteward::$quote_schema_names) . '.' . mssql10_diff::get_quoted_name($node_trigger['name'], dbsteward::$quote_schema_names);
// check for when's allowed by MSSQL -- see http://msdn.microsoft.com/en-us/library/ms189799.aspx
// { FOR | AFTER | INSTEAD OF }
if (strcasecmp($node_trigger['when'], 'FOR') == 0) {
}
else if (strcasecmp($node_trigger['when'], 'AFTER') == 0) {
}
else {
throw new exception("Unknown trigger when '" . $node_trigger['when'] . "' encountered on " . $trigger_name);
}
//AS { sql_statement [ ; ] [ ,...n ] | EXTERNAL NAME <method specifier [ ; ] > }
$function_definition = ' AS ' . $node_trigger['function'];
if (isset($node_trigger['type'])) {
if (strcasecmp($node_trigger['type'], 'EXTERNAL') == 0) {
$function_definition = 'AS EXTERNAL NAME ' . $node_trigger['function'];
}
else {
throw new exception("unknown trigger type encountered: " . $node_trigger['type']);
}
}
$ddl = "CREATE TRIGGER " . $trigger_name . "
ON " . $table_name . "
" . $node_trigger['when'] . "
" . implode(', ', $event_chunks) . "\n";
if (isset($node_trigger['withAppend'])) {
$ddl .= "\tWITH APPEND\n";
}
$ddl .= "\t" . $function_definition . ";\n";
return $ddl;
}
/**
* Creates and returns SQL for dropping the trigger.
*
* @return created SQL
*/
public function get_drop_sql($node_schema, $node_trigger) {
$node_table = dbx::get_table($node_schema, $node_trigger['table']);
if ($node_table == NULL) {
throw new exception("Failed to find trigger table " . $node_trigger['table'] . " in schema node " . $node_schema['name']);
}
$table_name = mssql10_diff::get_quoted_name($node_schema['name'], dbsteward::$quote_schema_names) . '.' . mssql10_diff::get_quoted_name($node_table['name'], dbsteward::$quote_table_names);
$ddl = "DROP TRIGGER " . pgsql8_diff::get_quoted_name($node_trigger['name'], dbsteward::$quote_object_names) . " ON " . $table_name . ";\n";
return $ddl;
}
}
?>